表情变化动画
创作时间:
作者:
@小白创作中心
表情变化动画
引用
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>
热门推荐
一文彻底理解:训练集,验证集,测试集,交叉验证
清炖鱼汤怎么做好喝又营养
如何培养孩子的阅读习惯?3个实用方法助力提升阅读理解能力
為知識投資:給終身學習者的 5 個寫作訣竅,用寫作加速自己的個人成長
道家内丹修炼的筑基功夫:开启智慧之门的基石
RFID技术系统构成中各模块作用的独特解析
震惊全球!首例疑似AI杀人案出现?14岁少年自杀,母亲泣诉将AI告上法庭!
如何通过网络查询被起诉信息
专家详解:腹泻的正确治疗方法
解码东营经济发展的高质量
公网IP的优势与应用场景
【猫狗数据集】宠物品种分类 计算机视觉 人工智能 机器学习 (含数据集)
如何利用黄金投资进行有效的风险对冲?风险对冲在投资中的作用是什么?
中国电信深耕5G-A技术 创新探索助应用落地
打好“世遗”牌 山东东营有思路
成年人还能长高吗?医生解析:这些营养素助力骨骼健康
海底捞花1000万买了个教训
14家A股银行发布业绩快报,浦发银行净利润增长23%领跑,南京银行则引领营收增长
大米怎么防潮,家庭储存妙招
大米放冰箱里面冷冻好还是冷藏好?
遗嘱心愿:立遗嘱者如何表达自己的意愿
节目制作公司的新世代转型路径:创造共鸣的文化输出
防雷检测和防雷工程接地综合指南
车机系统与Android的关系概述
揭秘多种花卉的花语及其象征意义:全面解析花语背后的文化内涵
知否三书六礼明媒正娶:古代婚姻制度的法律解读与现代启示
思维导图:中国古代宗法制度详解
九子夺嫡,康熙年间最激烈的宫斗
如何有效实施项目绩效管理制度?五个关键步骤助你成功
带叶的网名(共88个)