【小白入门篇】前端第一天就能做的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;
    }
}

六、总结

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

相关推荐
qq_5470261794 小时前
Flowable 工作流引擎
java·服务器·前端
刘逸潇20055 小时前
CSS基础语法
前端·css
吃饺子不吃馅6 小时前
[开源] 从零到一打造在线 PPT 编辑器:React + Zustand + Zundo
前端·svg·图形学
小马哥编程7 小时前
【软考架构】案例分析-Web应用设计(应用服务器概念)
前端·架构
鱼与宇7 小时前
苍穹外卖-VUE
前端·javascript·vue.js
啃火龙果的兔子7 小时前
前端直接渲染Markdown
前端
z-robot7 小时前
Nginx 配置代理
前端
用户47949283569157 小时前
Safari 中文输入法的诡异 Bug:为什么输入 @ 会变成 @@? ## 开头 做 @ 提及功能的时候,测试同学用 Safari 测出了个奇怪的问题
前端·javascript·浏览器
没有故事、有酒7 小时前
Ajax介绍
前端·ajax·okhttp
朝新_7 小时前
【SpringMVC】详解用户登录前后端交互流程:AJAX 异步通信与 Session 机制实战
前端·笔记·spring·ajax·交互·javaee