【小白入门篇】前端第一天就能做的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 小时前
elment Table多级表头固定列后,合计行错位显示问题解决
前端·javascript·vue.js
曦月合一1 小时前
html中iframe标签 隐藏滚动条
前端·html·iframe
奶球不是球1 小时前
el-button按钮的loading状态设置
前端·javascript
kidding7231 小时前
前端VUE3的面试题
前端·typescript·compositionapi·fragment·teleport·suspense
无责任此方_修行中3 小时前
每周见闻分享:杂谈AI取代程序员
javascript·资讯
Σίσυφος19003 小时前
halcon 条形码、二维码识别、opencv识别
前端·数据库
学代码的小前端4 小时前
0基础学前端-----CSS DAY13
前端·css
dorabighead4 小时前
JavaScript 高级程序设计 读书笔记(第三章)
开发语言·javascript·ecmascript
css趣多多5 小时前
案例自定义tabBar
前端
姑苏洛言6 小时前
DeepSeek写微信转盘小程序需求文档,这不比产品经理强?
前端