【小白入门篇】前端第一天就能做的mini demo——球球kiss

大家好,这里是蝉蝉,今天我们来讲对html和css有了一个基础认识后,我们应该怎么样做一个可爱、迷人又简单的小demo呢?那么就来到我们今天的主题------球球kiss。

一、效果图

二、核心要点

  • htmlh和css常用标签
  • 伪元素
  • 定位
  • animation动画
  • 认真取名字 ʕ•̀ ω • ʔ

三、html框架

这个demo既然是两个球球kiss,那么它就包括两个球及其眼睛、嘴巴和点睛之笔---腮红【在这也可以叫腮绿的hhh】。

需要重视的一点是,如果我们写这样一个框架,对于小白来说,每个球体里有两个眼睛,两个腮红,一个嘴巴,里面的元素过于丰富,会导致在布局的时候非常乱,那么我们就将球体里的眼睛、嘴巴和腮红放在一个名为face的盒子中。

html 复制代码
<body>
    <div class="container">
        <div class=' ball' id='l-ball'>
            <div class=" face face-l">
                <div class="eye eye-l"></div>
                <div class="eye eye-r"></div>
                <div class="mouth"></div>
            </div>
        </div>
        <div class="ball" id='r-ball'>
            <div class=" face face-r">
                <div class="eye eye-l"></div>
                <div class="eye eye-r"></div>
                <div class="mouth mouth-alter"></div>
                <div class="kiss">
                    <div class="kiss-t"></div>
                    <div class="kiss-b"></div>
                </div>
            </div>
        </div>
    </div>
</body>

四、css中的重点

弧形

当我们这样的小白拿到这个demo,第一个困扰应该是我们怎么做出眼睛和嘴巴这样的弧型呢?其实在css中很容易能够做到这一点。

css 复制代码
.eye {
    width: 15px;
    height: 14px;
    border-bottom: 5px solid #000;
    border-radius: 50%;
}

如图所示,我们给到眼睛一个宽高,给其一个比较宽的下框线,再给加一个border-radius的属性,border-radius 允许你设置元素的外边框圆角,因此得出的效果如下:

伪元素

另外,我们的腮红其实使用到了一个伪元素的小重点

总结一下,伪元素的基本知识点其实主要在它以下细节:

  1. 如果没有设置'content'属性,伪元素是无用的
  2. 伪元素不会继承父元素的样式(如padding,margin等等)
  3. 我们可能会潜意识里认为::before 和::after 伪元素可能是插入的内容会被注入到目标元素的前或后,其实不然,注入的内容将是目标元素的子元素,但他会被置于这个元素任何内容的前后

animation动画

事实上,两个球体kiss(也就是平移以及旋转的效果),我们用到关键帧来做,关键帧 keyframes 可以控制动画序列的中间步骤,我们需要注意的就是仔细去敲每一帧的平移长度和旋转角度,另外kiss效果,我们可以给mouth设置两个动画,在某一时间用opacity这个属性隐藏它,再做一个嘴巴出来,只在那一时间显示。

五、css代码展示

css 复制代码
body {
    background-color: #78e08f;
}

.container {
    width: 232px;
    height: 200px;
    /* border: 1px solid #000; */
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%)
}

.ball {
    width: 100px;
    height: 100px;
    border: 8px solid #000;
    border-radius: 50%;
    background-color: #fff;
    position: relative;
}

#r-ball {
    position: absolute;
    left: 100px;
    top: 0px;
}

/* 加绝对定位是相对于哪一个东西定位呢? */

.face {
    width: 70px;
    height: 30px;
    position: absolute;
}

.face-l {
    right: 0;
    top: 30px;
}

.face-r {
    left: 0;
    top: 30px;
}

.eye {
    width: 15px;
    height: 14px;
    border-bottom: 5px solid #000;
    border-radius: 50%;
    position: absolute;
}

.eye-l {
    left: 10px;
}

.eye-r {
    right: 5px;
}

.mouth {
    width: 30px;
    height: 14px;
    border-bottom: 5px solid #000;
    border-radius: 50%;
    position: absolute;
    margin: 0 auto;
    left: 0;
    right: 0;
    bottom: -5px;
}

.face::before {
    content: '';
    width: 18px;
    height: 8px;
    border-radius: 50%;
    background-color: #badc58;
    position: absolute;
    right: -8px;
    top: 20px;
}

.face::after {
    content: '';
    width: 18px;
    height: 8px;
    border-radius: 50%;
    background-color: #badc58;
    position: absolute;
    left: -5px;
    top: 20px;
}

#l-ball {
    animation: close-l 4s ease infinite;
}

@keyframes close-l {
    0% {
        transform: translate(0);
    }

    20% {
        transform: translate(20px);
    }

    35% {
        transform: translate(20px);
    }

    55% {
        transform: translate(0);
    }

    100% {
        transform: translate(0);
    }
}

.face-l {
    animation: face-l 4s ease infinite;
}

@keyframes face-l {
    0% {
        transform: translate(0) rotate(0);
    }

    10% {
        transform: translate(0) rotate(0);
    }

    20% {
        transform: translate(5px) rotate(-2deg);
    }

    28% {
        transform: translate(0) rotate(0);
    }

    35% {
        transform: translate(5px) rotate(-2deg);
    }

    50% {
        transform: translate(0) rotate(0);
    }

    100% {
        transform: translate(0) rotate(0);
    }
}

#r-ball {
    animation: close-r 4s ease infinite;
}

@keyframes close-r {
    0% {
        transform: translate(0);
    }

    35% {
        transform: translate(0);
    }

    50% {
        transform: translate(0) rotate(-10deg);
    }

    60% {
        transform: translate(-10px) rotate(-10deg);
    }

    80% {
        transform: translate(-30px);
    }

    100% {
        transform: translate(0);
    }
}

.face-r {
    animation: face-r 4s ease infinite;
}

@keyframes face-r {
    0% {
        transform: translate(0) rotate(0);
    }

    10% {
        transform: translate(0) rotate(0);
    }

    20% {
        transform: translate(5px) rotate(-2deg);
    }

    28% {
        transform: translate(0) rotate(0);
    }

    35% {
        transform: translate(5px) rotate(-2deg);
    }

    50% {
        transform: translate(0) rotate(0);
    }

    100% {
        transform: translate(0) rotate(0);
    }
}

.kiss-t {
    width: 15px;
    height: 20px;
    border-bottom: 5px solid #000;
    border-radius: 50%;
    position: absolute;
    margin: 0 auto;
    left: -15px;
    right: -19px;
    bottom: -10px;
    transform: translate(0) rotate(90deg);
}

.kiss-b {
    width: 15px;
    height: 20px;
    border-bottom: 5px solid #000;
    border-radius: 50%;
    position: absolute;
    margin: 0 auto;
    left: -15px;
    right: -19px;
    bottom: -20px;
    transform: translate(0) rotate(90deg);
}

.kiss {
    animation: kiss 4s ease infinite;
}

@keyframes kiss {
    0% {
        opacity: 0;
    }

    10% {
        opacity: 0;
    }

    20% {
        opacity: 0;
    }

    28% {
        opacity: 0;
    }

    35% {
        opacity: 0;
    }

    50% {
        opacity: 1;
    }

    60% {
        opacity: 1;
    }

    100% {
        opacity: 0;
    }
}

.mouth-alter {
    animation: mouth-alter 4s ease infinite;
}

@keyframes mouth-alter {
    0% {
        opacity: 1;
    }

    20% {
        opacity: 1;
    }

    35% {
        opacity: 1;
    }

    50% {
        opacity: 0;
    }

    66% {
        opacity: 0;
    }

    80% {
        opacity: 1;
    }

    100% {
        opacity: 1;
    }
}

六、总结

如有错误欢迎在评论区指正,一起讨论!(๑•̀ㅂ•́)و✧

相关推荐
雾散声声慢1 分钟前
前端开发中怎么把链接转为二维码并展示?
前端
熊的猫2 分钟前
DOM 规范 — MutationObserver 接口
前端·javascript·chrome·webpack·前端框架·node.js·ecmascript
天农学子2 分钟前
Easyui ComboBox 数据加载完成之后过滤数据
前端·javascript·easyui
mez_Blog3 分钟前
Vue之插槽(slot)
前端·javascript·vue.js·前端框架·插槽
爱睡D小猪5 分钟前
vue文本高亮处理
前端·javascript·vue.js
开心工作室_kaic8 分钟前
ssm102“魅力”繁峙宣传网站的设计与实现+vue(论文+源码)_kaic
前端·javascript·vue.js
放逐者-保持本心,方可放逐9 分钟前
vue3 中那些常用 靠copy 的内置函数
前端·javascript·vue.js·前端框架
IT古董9 分钟前
【前端】vue 如何完全销毁一个组件
前端·javascript·vue.js
Henry_Wu00111 分钟前
从swagger直接转 vue的api
前端·javascript·vue.js
奋飞安全12 分钟前
初试js反混淆
开发语言·javascript·ecmascript