表情变化动画
创作时间:
作者:
@小白创作中心
表情变化动画
引用
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>
热门推荐
选好书桌椅,对预防近视很重要
怎样学英语发音纯正(提高发音水平的技巧)
情感也需要宣泄:五个维度帮你释放内心压力
浅谈癌症患者的心理护理
建筑工地半夜施工扰民怎么处理的
AEC-Q102标准下的硫化氢气体腐蚀试验详解
一个比走路还简单的动作,调气血、补元气、固阳气,冬天练正合适
解锁砂纸打磨秘籍,开启完美表面之旅
鲁菜小餐桌撬动文旅大消费 山东“四个一百”集中亮相展示
含有肠道益生菌的食物是什么
新闻分析:再入“死亡之组”,国足能否“保四”?
茶不能乱喝,六大茶类,快看看你适合哪款
孕婦喝滴雞精安全嗎?專家解析其營養價值與風險
抖音算法优化指南:从内容质量到个人品牌建立
“深入解析‘last’一词的多重用法与丰富情感表达”
避险情绪支撑金价高位震荡,多头趋势延续
沪币是什么意思?解密网络热词背后的上海物价现象
最高可抵税5400元! 一文讲透个人养老金
南京到贵州自驾游攻略:路线规划与省钱技巧详解
鬼怪不忠不孝的法律评析与实务应对
雨桐作为女孩名字好吗?雨桐女孩名字的含义
鸿门宴上项羽未杀刘邦:背后的考量与抉择
跟着“悟空游山西”,山西古建“顶流”来了
世界大学排名解读:如何通过排名找到适合自己的学校?
大学排名哪家机构靠谱?如何选择权威排名?
肾炎综合征患者的运动康复计划:适合的运动与锻炼方式
2024年JLPT日本语能力测试全攻略:考试内容、报名须知及备考资源
吃什么能消除肝囊肿
企业残疾人免税政策需要哪些资料办理
重庆二号线网红打卡点全攻略:从轻轨穿楼到洪崖洞,带你游遍山城美景