效果
AlloyTeam网页中有这样一种效果,鼠标hover某一个盒子出现上升,并带有亮光的特效,不多说直接看下面的动图。
思路分析
效果分析
仔细观察,鼠标hover后,盒子出现了上升的现象,盒子周围也出现了阴影,鼠标移开后,盒子又自动回来了,并且上升的过程中盒子上有一道亮光闪过
其实这种效果用简单的html+css就可以实现,用到的知识主要是盒子模型、定位中的子绝父相、溢出隐藏以及平面位移等
代码分析
这里只用demo来解释原理,实际应用可以放到flex布局中等等。
- 首先写两个父子关系的div的盒子,子盒子box1用来实现亮光特效,用伪元素也可以
<div class="box">
<div class="box1"></div>
</div>
- 设置box和box1的css基本样式,并加上子绝父相,子盒子需要加上渐变色,父盒子记得overflow:hidden去掉子盒子由于定位在外面多余的区域
.box {
overflow:hidden;
position: relative;
width: 300px;
height: 300px;
border: 1px solid #000;
background-color: pink;
margin: 100px auto;
}
.box1 {
position: absolute;
left: -110%;
top: 0;
width: 300px;
height: 300px;
background-image: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, .5), rgba(255, 255, 255, 0));
}
- 实现hover父盒子box上升和阴影
.box:hover {
transform: translateY(-20px);
box-shadow: 0 26px 40px -24px rgb(0 36 100 / 50%);
}
再给box盒子加上过渡属性即可transition: all .2s;
- 实现盒子hover亮光效果
原理:hover后用子盒子box1水平从左移到右边即可,斜着使用
transform: skew(-30deg);使盒子变成平行四边形
加上代码:
.box1{
transform:skew(-30deg);
}
.box:hover .box1 {
left: 110%;
transition: all .3s;
}
补充知识:hover父盒子,给子盒子加位移或者定位
- 子盒子不加过渡效果 直接闪现过去 闪现回来
- 子盒子加上过渡效果 缓慢过去缓慢回来,给hover的选择器加过渡,缓慢过去,闪现回来(过渡本来是谁需要变就给谁加)。就是这里实现的效果,鼠标hover的时候出现亮光,鼠标移开时不出现亮光
效果
完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
overflow: hidden;
position: relative;
width: 300px;
height: 300px;
border: 1px solid #000;
background-color: pink;
margin: 100px auto;
transition: all .2s;
}
.box1 {
position: absolute;
left: -110%;
top: 0;
width: 300px;
height: 300px;
background-image: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, .5), rgba(255, 255, 255, 0));
transform: skew(-30deg);
}
.box:hover .box1 {
left: 110%;
transition: all .3s;
}
.box:hover {
transform: translateY(-20px);
box-shadow: 0 26px 40px -24px rgb(0 36 100 / 50%);
}
</style>
</head>
<body>
<div class="box">
<div class="box1"></div>
</div>
</body>
</html>