文章目录
- 1、介绍
- 2、原理
- 3、代码
- 4、参考链接
1、介绍
对于这个效果而言,最先想到的就是
监听滑块的input事件来做一些操作
,但是会发现,对于某一个节点的时候,这个样式操作起来比较麻烦
只看这个代码的话,发现他用的是动画,那 动画与下面的滑块怎么联动?
2、原理
在css中,可以自定义动画
CSS animation 属性是 animation-name,animation-duration, animation-timing-function,
animation-delay
,animation-iteration-count,animation-direction,animation-fill-mode 和animation-play-state
属性的一个简写属性形式。
animation-delay
是控制动画延迟的
正值
表示动画应在指定的时间量过去后开始
。默认值为 0s,表示动画应立即开始。
负值
会导致动画立即开始,但是从动画循环的某个时间点开始。例如,如果你将-1
s 作为动画延迟时间,则动画将立即开始,但是将在动画序列的第 1 秒开始
。如果你为动画延迟指定负值,但起始值是隐含的,则起始值取自应用动画到元素的时刻。
其实,核心就在这里,这样的话就可以 通过
动画的延迟属性 与 滑块的input 事件联动
,实时设置动画的延迟属性的值
animation-play-state
是控制动画运行还是暂停。
那其实就是说,我先可以先
做好这个自定义动画,并且动画设置暂停,通过脚本来实时控制当前这个动画,延迟 多少秒,在那个时间点,开始执行
/* 举个例子, @keyframes 后面跟的是 动画名称, */@keyframes faceColor {0% {background-color: tomato;}100% {background-color: #3cb371;}}
3、代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>input[type=range]::-webkit-slider-thumb {-webkit-appearance: none;}.container {width: 100%;height: 100vh;display: flex;flex-direction: column;justify-content: center;align-items: center;}.face {--delay: 0s;position: relative;width: 150px;height: 150px;border-radius: 50%;background-color: red;animation: faceColor 1s var(--delay) linear forwards paused;}.eye,.eye2 {position: absolute;top: 50px;left: 20px;width: 30px;height: 30px;background-color: #fff;border-radius: 50%;clip-path: polygon(0 90%, 100% 0, 100% 100%, 0% 100%);animation: eye 1s var(--delay) linear forwards paused;}.eye2 {top: 50px;right: 20px;left: unset;clip-path: polygon(0 0, 100% 90%, 100% 100%, 0% 100%);}.range {margin-top: 10px;}@keyframes faceColor {0% {background-color: tomato;}25% {background-color: orange;}50% {background-color: #1e90ff;}75% {background-color: orchid;}100% {background-color: #3cb371;}}@keyframes eye {0% {clip-path: polygon(0 90%, 100% 0, 100% 100%, 0% 100%);}25% {clip-path: polygon(0 70%, 100% 0, 100% 100%, 0% 100%);}50% {clip-path: polygon(0 50%, 100% 0, 100% 100%, 0% 100%);}75% {clip-path: polygon(0 20%, 100% 0, 100% 100%, 0% 100%);}100% {clip-path: polygon(0 0%, 100% 0, 100% 100%, 0% 100%);}}</style>
</head><body><div class="container"><div class="face"><div class="eye"></div><div class="eye2"></div></div><input type="range" name="" id="" max="1" min="0" step="0.01" class="range" value="0"></div><script>let rangeEl = document.querySelector('.range');let faceEl = document.querySelector('.face');faceEl.style.backgroundColor = 'red';rangeEl.addEventListener('input', function (e) {console.log(e);let value = this.value;faceEl.style.setProperty('--delay', '-' + value + 's');})</script>
</body></html>
4、参考链接
- animation MDN
- css-clip-path 在线裁剪工具