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

六、总结

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

相关推荐
mldong4 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排5 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60616 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角7 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!7 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰7 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi8 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen9 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马10 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu10 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss