先看一下效果
废话不多说,直接上代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>鼠标悬停</title>
<style>
:root{
--primary: #25abd9;
}
*{
box-sizing: border-box;
margin: 0;
padding: 0;
background-color: #dcf5ff;
}
.container{
display: flex;
align-items: center;
height: 100vh;
justify-content: center;
}
/* 卡片样式 */
.card{
display: flex;
align-items: center;
justify-content: space-between;
border-radius: 20px;
background-color: white;
box-shadow: 3px 3px 2px 2px #efefef;
flex-wrap: wrap;
height: 350px;
width: 500px;
padding: 40px;
}
/* 给所有按钮设置统一样式 */
.button{
background-color: none;
border: solid 2px var(--primary);
box-shadow: 0 5px 15px -5px #bbb;
color: var(--primary);
cursor: pointer;
font-family: roboto;
font-size: 14px;
height: 50px;
width: 150px;
overflow: hidden;
padding: 5px;
position: relative;
/*
transform: perspective(px);这个属性也是必须设置的
其实对于perspective属性,我们可以简单的理解为视距,用来设置用户和元素3D空间Z平面之间的距离。
而其效应由他的值来决定,值越小,用户与3D空间Z平面距离越近,视觉效果更令人印象深刻;
反之,值越大,用户与3D空间Z平面距离越远,视觉效果就很小。
*/
transform: perspective(1px);
/* 作用于字体颜色的动画效果,这个可以自己改一下 */
transition: color 0.2s ease-out;
}
/*
content属性:该属性用于定义元素之前或之后放置的生成内容,你可以试试content: "123456";
没有这个属性,::before设置的样式都不会呈现
*/
.button::before{
content: "";
position: absolute;
z-index: -1;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: var(--primary);
/* 作用于transform的动画效果,这个可以自己改一下 */
transition: transform 0.3s ease-in;
}
/*
设置初始缩放为0
*/
.button--one::before{
transform-origin: 0 0;
transform: scaleX(0);
}
.button--two::before{
transform-origin: 0 0;
transform: scaleY(0);
}
.button--three::before{
transform: scaleY(0);
}
.button--four::before{
transform: scaleX(0);
}
/*
这个样式想必都能看得懂吧,因为之前设置了绝对定位
*/
.button--five::before{
left: 50%;
top: 50%;
/*
translate与left,top一起是为了保持居中点不变,这个能懂吧
translate:x与y坐标移动-50%
rotate:旋转135度
scaleY:y轴缩放0
*/
transform: translate(-50%,-50%) rotate(135deg) scaleY(0);
width: 100%;
}
.button:hover{
color: white;
}
.button:hover::before{
transform: scaleX(1);
}
.button--five:hover::before {
transform: translate(-50%, -50%) rotate(135deg) scaleY(4);
}
</style>
</head>
<body>
<div class="container">
<div class="card">
<button class="button button--one">Left to Right</button>
<button class="button button--two">Top to Bottom</button>
<button class="button button--three">Centre Vertical</button>
<button class="button button--four">Centre Horizontal</button>
<button class="button button--five">Diagonal</button>
</div>
</div>
</body>
</html>