css - CSS 按钮悬停动画是如何工作的?
问题描述
我试图理解这些用于按钮悬停效果的代码块,但仍然感到困惑。
我可以理解当鼠标悬停在按钮上时会.btn:hover::after
启动并显示背景(z = -1)按钮然后将其展开 transform: scaleX(1.4) scaleY(1.6);
然而,当鼠标指针从按钮上移开时,背景按钮也会出现“缩小”的效果,看起来就像从transform: scaleX(1.4) scaleY(1.6);
正常大小一样。我只是不明白哪一行代码控制了这个鼠标离开动画。
.btn:link,
.btn:visited {
position: relative;
border-radius: 10rem;
display: inline-block;
margin-top: 6rem;
text-transform: uppercase;
text-decoration: none;
padding: 1.5rem 4rem;
transition: all 0.2s;
}
.btn:hover {
transform: translateY(-.3rem);
box-shadow: 0 1rem 2rem rgba(0, 0, 0, .3);
}
.btn:active {
transform: translateY(-.1rem);
box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .2);
}
.btn--white {
background-color: #fff;
color: #777;
}
.btn::after {
content: "";
display: inline-block;
height: 100%;
width: 100%;
border-radius: 10rem;
position: absolute;
top: 0;
left: 0;
z-index: -1;
transition: all .4s;
}
.btn--white::after {
background-color: #fff;
}
.btn:hover::after {
transform: scaleX(1.4) scaleY(1.6);
opacity: 0;
}
解决方案
秘密在于按钮transition: all 0.2s
的:link
/ :visited
。transition
不仅转换到目标状态,而且还从目标状态退出。从本质上讲,它transition
控制了您所看到的动画的两面。
它仍然是transform
应用实际偏移量的那个,但transition
负责平滑地来回淡出是否transform
应用 - 没有transition
,动画将简单地在两个状态之间“跳转”。
body {
background: black;
}
.btn:link,
.btn:visited {
position: relative;
border-radius: 10rem;
display: inline-block;
margin-top: 6rem;
text-transform: uppercase;
text-decoration: none;
padding: 1.5rem 4rem;
transition: all 0.2s;
}
.btn:hover {
transform: translateY(-.3rem);
box-shadow: 0 1rem 2rem rgba(0, 0, 0, .3);
}
.btn:active {
transform: translateY(-.1rem);
box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .2);
}
.btn--white {
background-color: #fff;
color: #777;
}
.btn::after {
content: "";
display: inline-block;
height: 100%;
width: 100%;
border-radius: 10rem;
position: absolute;
top: 0;
left: 0;
z-index: -1;
transition: all .4s;
}
.btn--white::after {
background-color: #fff;
}
.btn:hover::after {
transform: scaleX(1.4) scaleY(1.6);
opacity: 0;
}
<a href="#" class="btn btn--white">Button</a>
推荐阅读
- git - 如何 rsync git repos 与子模块
- backend - 在后端显示排版设置
- reactjs - 标识符是预期的|| 意外的标记
- angular - 如果环境角度是生产,则禁用组件
- python - 为什么我们在每次递归调用后都返回 TreeNode 的头部?
- html - 以简单的方式在 HTML 中的单词之间创建行内空格
- android - Holding screen touch in godot
- javascript - 如何使用knex无条件删除表中的所有记录?
- google-apps-script - Google datastudio 正在向 getData 请求添加额外的维度
- javascript - 向上或向下移动滚动条拇指时保持原位的滚动条框阴影