表情变化动画
创作时间:
作者:
@小白创作中心
表情变化动画
引用
CSDN
1.
https://blog.csdn.net/Dyanfee/article/details/138190842
本文将介绍如何使用CSS3实现一个从愤怒到满意的表情变化动画。通过clip-path、box-shadow等属性,结合动画效果,可以创建出有趣且交互性强的视觉效果。
实现效果
拉动滑动条,表情由愤怒到满意,并且颜色也由红色逐渐变更成绿色。
实现思路
利用clip-path实现多边形蒙版对眼睛部分进行绘制
.eye { position: absolute; top: 45px; width: 40px; height: 40px; background-color: #fff; border-radius: 50%; clip-path: polygon(0 70%, 100% 0, 100% 100%, 0 100%); }利用 box-shadow 的 insert 属性可以绘制内部阴影的特性,对圆形绘制内阴影形成嘴部表情
.mouse { height: 60px; width: 70px; position: absolute; left: calc(50% - 35px); top: 86px; border-radius: 50%; box-shadow: inset 0 6px 0 #fff; clip-path: inset(0% 0% 0% 0%); transform: translateY(30px); animation: mouse 1s linear var(--delay) 1 forwards paused; }对滑动条样式修改,动态计算滑过的部分,并设置渐变条
#rangeInput { -webkit-appearance: none; margin-top: 40px; height: 24px; width: 180px; border-radius: 12px; box-shadow: 0px 0px 8px 0px rgb(125, 125, 125); animation: face 1s linear var(--delay) 1 forwards paused; background-size: var(--slide) 100%; background-repeat: no-repeat; }
完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>表情变化动画</title>
<style>
body {
margin: 0;
padding: 0;
--delay: 0;
--slide: 0%;
}
#rangeInput {
-webkit-appearance: none;
margin-top: 40px;
height: 24px;
width: 180px;
border-radius: 12px;
box-shadow: 0px 0px 8px 0px rgb(125, 125, 125);
animation: face 1s linear var(--delay) 1 forwards paused;
background-size: var(--slide) 100%;
background-repeat: no-repeat;
}
/*拖动块的样式*/
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
height: 24px;
width: 24px;
background: #fff;
border-radius: 50%;
border: solid 1px #ddd;
}
.container {
margin-top: 200px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.face {
position: relative;
background-color: red;
width: 180px;
height: 180px;
border-radius: 50%;
animation: face 1s linear var(--delay) 1 forwards paused;
}
.eye {
position: absolute;
top: 45px;
width: 40px;
height: 40px;
background-color: #fff;
border-radius: 50%;
}
.left {
left: 36px;
animation: leftEye 1s linear var(--delay) 1 forwards paused;
}
.right {
right: 36px;
animation: rightEye 1s linear var(--delay) 1 forwards paused;
}
.mouse {
height: 60px;
width: 70px;
position: absolute;
left: calc(50% - 35px);
top: 86px;
border-radius: 50%;
box-shadow: inset 0 6px 0 #fff;
clip-path: inset(0% 0% 0% 0%);
transform: translateY(30px);
animation: mouse 1s linear var(--delay) 1 forwards paused;
}
@keyframes face {
0% {
background-image: linear-gradient(to left top, #ff0000, #f36400);
}
20% {
background-image: linear-gradient(to left top, #f36400, #dd9200);
}
40% {
background-image: linear-gradient(to left top, #dd9200, #c1b700);
}
60% {
background-image: linear-gradient(to left top, #c1b700, #d5a700);
}
80% {
background-image: linear-gradient(to left top, #d5a700, #9fd600);
}
100% {
background-image: linear-gradient(
to left top,
#9fd600,
#8fe000,
#7aea00,
#5af50a,
#00ff21
);
}
}
@keyframes mouse {
50% {
height: 6px;
box-shadow: inset 0 6px 0 #fff;
clip-path: inset(0% 0% 0% 0%);
transform: translateY(40px);
}
50.1% {
height: 6px;
box-shadow: inset 0 -6px 0 #fff;
clip-path: inset(50% 0% 0% 0%);
transform: translateY(40px);
}
100% {
height: 60px;
box-shadow: inset 0 -40px 0 #fff;
clip-path: inset(50% 0% 0% 0%);
transform: translateY(0);
}
}
@keyframes leftEye {
from {
clip-path: polygon(0 70%, 100% 0, 100% 100%, 0 100%);
}
to {
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
}
}
@keyframes rightEye {
from {
clip-path: polygon(0 0, 100% 70%, 100% 100%, 0 100%);
}
to {
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
}
}
</style>
</head>
<body>
<div class="container">
<div class="face">
<span class="left eye"></span>
<span class="right eye"></span>
<span class="mouse"></span>
</div>
<input type="range" id="rangeInput" min="0" max="1" step="0.01" />
</div>
<script>
const input = document.querySelector("#rangeInput");
const move = () => {
document.body.style.setProperty("--delay", `-${input.value}s`);
document.body.style.setProperty(
"--slide",
`${input.value * 156 + 12}px`
);
};
move();
input.oninput = move;
</script>
</body>
</html>
热门推荐
云南易武镇:普洱生茶助力乡村振兴
普洱生茶:千年古法的现代魅力
沿着合那高速的最美自驾路线推荐
合那高速自驾游打卡德天跨国大瀑布
合那高速建设提速:广西对接东盟的重要通道
高情商的人,是怎么拒绝别人的
美国彩票监管经验对中国有何启示?
海南体彩揭秘:公正摇奖全过程
马宏俊教授详解:如何通过法律手段确保彩票公正性
彩票公正性引发金融市场热议,科技助力提升公信力
跟着白居易学养生
中国真正的国酒:黄酒的复兴与未来
昆明到石家庄高铁攻略:G72 vs G402,哪个更划算?
G71次列车:北京西至昆明南最快直达方案
元旦高铁游云南:昆明周边必打卡景点
这 4 种走路姿势,让你关节变形、身体歪斜!
有氧运动有哪些?做有氧运动有哪些好处?
全球多地核果市场报告:油桃、桃子等产量与销售情况概览
追寻美食背后的中华文化 读《宴飨万年:文物中的中华饮食文化史》
三国风云:十大战役深度解析
岗位价值评估怎么进行?
番茄工作法:打造高效课堂的3小时教学攻略
新手讲师必看:3小时课程设计秘籍
牛茄子:美丽背后的致命诱惑
清明节警惕牛茄子中毒!
婚姻心理咨询:争吵后妻子离家出走,如何挽回?
基因编辑:人类外貌改造的未来之路
古风仙气女孩名推荐:诗词中的绝美女主
如何在 GitHub 看源代码学习
从文化视角解读催婚现象背后的社会变迁