我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!
前言
大家好,我是小阵 🔥,一路奔波不停的码字业务员
如果喜欢我的文章,可以关注 ➕ 点赞,与我一同成长吧~😋
加我微信:zzz886885,邀你进群,一起学习交流,摸鱼学习两不误🌟
开开心心学技术大法~~
来了来了,他真的来了~
正文
先看效果
实现思路
-
先实现一个简单背景,方便看效果
-
我们假设鼠标移动上去之后触发赛鹏博客风格的动画
- 用
:hover
伪类
- 用
-
接下来就是赛鹏博客风格的具体思路
-
首先,要看到样式抖动且不影响主题内容展示,则需要有两份完全一样的dom,分为主体dom和副本dom
-
保持主体dom不动
-
然后让副本dom进行
颤抖
+关键部分颜色小幅度范围内跳动
-
怎样实现
颤抖
效果呢-
需要有动画
-
动画伴随有位置变化
- 用
animation
加translate
- 用
-
动画改变应该是立即变化而不是过渡渐变
-
需要借助
animation
的animation-timing-function:steps(n, <jumpterm>)
来实现-
animation-timing-function
表示动画的移动轨迹-
比如我们熟悉的
ease
、linear
、linear
、cubic-bezier(赛贝尔曲线)
等等 -
steps(n, <jumpterm>)
可以将一个动画周期分隔成不同的步骤-
n
表示将一个动画周期分成了几分 -
比如
n
为5
,则意味着将动画周期分成了五份 -
n
为1
,则将动画分成了1
分,也就是一瞬间完成了整个动画,这就是我们要的没有过渡的效果 -
jumpterm
表示保留每一份动画的部分- 比如
jump-start
表示保留动画的开头 jump-end
表示动画的结尾
- 比如
-
-
-
-
那其实我们需要的就是
steps(1, jump-start)
或steps(1, jump-end)
。也可以写成step-start
或step-end
-
-
改变位置时不应该影响主体dom的大体展示
-
因为我们的主体dom为矩形,假设有副本dom往右上偏移了,我们视觉上会是看到的是主体dom像右上方向长宽长高了,这不是我们要的
-
我们需要有
割裂
的感觉 -
比如副本dom的某一部分往右上偏移,而不是整体右上偏移
-
这就需要借助
clip-path
属性 -
该属性意思是裁切,比如,以下是一张
150*183
的图片原图:
裁剪代码:
clip-path: circle(40%);
裁减了
60%
的体积又比如
裁剪代码
clip-path: inset(75px 40px 0px 0);
-
这里又有一个
inset
的用法- 其实
inset
就是top
,right
,bottom
,left
的缩写 - 以上表示上面裁剪
75px
,右边裁剪40px
,下和左不裁剪
- 其实
-
-
-
-
实现了
颤抖
的效果,又怎样实现关键部分颜色小幅度范围内跳动
的效果呢?-
我们选择关键部位为
中间字体
-
颜色跳动
可以分解成多个颜色
和颤抖
-
多个颜色
可以由text-shadow
生成,可以设置不止一个文字背景,且偏移量也可以随便设置- 因为要
hover
的时候才展示颜色抖动
,所以需要未hover
的时候visibility: hidden
hover
时再visibility: visible
- 为什么副本dom本身不需要
visibility: hidden
呢?因为副本dom本身样式跟主体dom完全一样,所以哪怕不hidden
也没关系
- 因为要
-
颤抖
如上面所说,animation
+translate
-
-
-
这样就完成了所有赛鹏风格的样式
接下来来看具体实现
具体实现
html基础结构
<div class="anniu">Aurora Borealis night</div>
比较简单,我们只需要用div
来做主体dom
用div::afetr
来做副本dom即可
背景样式
先来个背景样式
body {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background-color: rgb(243, 239, 8);
}
主体dom样式和副本dom样式
.anniu,
.anniu::after {
font-family: 'Do Hyeon', sans-serif;
width: 260px;
height: 80px;
text-align: center;
font-size: 22px;
line-height: 80px;
color: rgb(255, 251, 251);
background: linear-gradient(30deg, transparent 10%, rgb(255, 136, 0) 10% 95%, rgb(0, 255, 149) 95%);
box-shadow: 5px 0 0 rgb(0, 204, 255);
cursor: pointer;
position: relative;
}
鼠标移动添加动画
.anniu:hover::after {
animation: san 1s;
animation-timing-function: steps(1, end);
}
赛鹏博客风格的动画
0% {
clip-path: inset(20% -5px 60% 0);
transform: translate(-6px, 5px);
visibility: visible;
}
10% {
clip-path: inset(50% -5px 30% 0);
transform: translate(6px, -5px);
}
/* ...一直到100% */
完整代码
总结
关键点在
-
生成主体dom和副本dom,保持主体dom不变,只改动副本dom,由此来整体样式不凌乱
-
animation-timing-function: steps(1, end)
实现动画不保留过渡 -
clip-path: inset(20% -5px 60% 0);
裁切副本dom造成颤抖
效果
结语
如果文章真的有帮到你,希望可以多多点赞、收藏、关注支持一波呀!!小阵会很开心哒~
学习自老哥北极光之夜
,感兴趣的可以去了解下。
文章如有错误或不严谨之处,还望指出,感谢感谢!!!
往期好文推荐「我不推荐下,大家可能就错过了史上最牛逼vscode插件集合
啦!!!(嘎嘎嘎~)😄」