原文转载自「刘悦的技术博客」https://v3u.cn/a_id_197
喜爱看电影的敌人必定会留神到一个乏味的细节,就是电影出品方肯定会在片头的Logo环节做一个小特效:阴影流动之间光泽一闪而过,这样做不仅能够进步Logo的辨识度,还能够晋升质感,两全其美。参照华纳兄弟影业(Warner Bros. Pictures)的例子:
那么,在前端畛域,如果应用纯CSS技术,能不能实现相似的特效呢?答案当然是能够的,这次咱们以本站的Logo为例子,以一持万、提纲挈领地解说一下如何应用纯CSS技术实现图片Logo鼠标悬停光泽一闪而过的光影特效。
个别状况下,大多数前端开发会抉择 linear-gradient() ,这个办法创立一个示意两种或多种色彩线性突变的图片。其后果属于<gradient>数据类型,是一种特地的<image>数据类型。
简略用法:
/* 突变轴为45度,从蓝色突变到红色 */
linear-gradient(45deg, blue, red);
/* 从右下到左上、从蓝色突变到红色 */
linear-gradient(to left top, blue, red);
/* 从下到上,从蓝色开始突变、到高度40%地位是绿色突变开始、最初以红色完结 */
linear-gradient(0deg, blue, green 40%, red);
那么它怎么和logo图片联合应用呢?首先创立一个对象,因为是logo,所以我应用a标签,也就是超级链接,随后申明伪类mylogo:
<a href="/" class="mylogo" title="刘悦的技术博客"></a>
之后,定义logo的款式:
.mylogo{
display:block;
margin: 0 auto;
width:255px;
height:200px;
background-image:/logo.png;
background-repeat: no-repeat;
}
接着就是linear-gradient()出场,原理并不简单,利用linear-gradient绘制一个红色半透明突变层,利用背景的负坐标暗藏起来,同时配合transition属性,在鼠标悬停(hover)的时候,设置1秒钟的延时动画,逐步将光斑的坐标进行位移,产生一种光泽掠过的成果:
.mylogo{
width: 255px;
height: 200px;
background: -webkit-linear-gradient(left, rgba(255,255,255,0)0, rgba(255,255,255,0.5)50%, rgba(255,255,255,0)100%) no-repeat -270px 0, url(/logo.png) no-repeat;
transition: 1s ease;
}
.mylogo:hover {
background-position: 200px 0, 0 0;
}
这里须要留神的是,默认负坐标肯定要超过logo本体的宽度,否则位移就不够充沛,成果是上面这样的:
看起来还不错,这里transition的属性设置在logo本体的伪类下面,此时如果logo本体失去鼠标的焦点,光斑地位又会回到原来的负坐标,此时光影又会在回闪一次,也就是一次悬停产生两次位移,闪动两次,如果只想闪一次,能够将transition加载hover伪类中,这样来到后不会二次位移,因为动画成果只会呈现在鼠标悬停上,鼠标来到后,就没有动画回闪了:
.mylogo{
width: 255px;
height: 200px;
/*间接应用background缩放版本*/
/*每个突变点的地位不能太小,不然会呈现完好光斑*/
/*no-repeat -270px 0:将光斑定位暗藏起来*/
background: -webkit-linear-gradient(left, rgba(255,255,255,0)0, rgba(255,255,255,0.5)50%, rgba(255,255,255,0)100%) no-repeat -270px 0, url(/logo.png) no-repeat;
/* transition: 1s ease; */
}
.mylogo:hover{
/*鼠标滑过实现光斑滑动,然而在多背景状况下,须要多个background-position属性值,否则会影响其余背景*/
background-position: 200px 0, 0 0;
transition: 1s ease;
}
成果是这样的:
然而这就完结了吗?还没有,因为这看起来仿佛。。。有点一律千篇?
如果所有人都用linear-gradient,就不免有点无趣了,那么有没有别的不落窠臼的玩儿法呢?
既然知道了原理,无非就是位移产生的小把戏,那么咱们齐全脱离linear-gradient,应用一张带光泽质感的背景图片shine.png:
因为应用了背景图,所以咱们须要对代码进行批改,为实体的背景图增加一个容器,span标签:
<a href="/" class="mylogo" title="刘悦的技术博客"><span></span></a>
款式和linear-gradient差不多,也是利用负坐标将span标签内的背景图暗藏起来:
.mylogo span {
display: block;
background: url("/shine.png") -360px -380px no-repeat;
transition-property: all;
transition-duration: .7s;
height: 200px;
width: 255px;
}
接下来要比linear-gradient要简略地多,间接设置悬停属性,让背景图片产生位移:
.mylogo:hover span {
background-position: 100px 300px;
}
成果是这样的:
如果仔细观察,会发现背景图更加符合光影掠过的成果,因为linear-gradient每个突变点在不同分辨率的屏幕下并不对立,也就是说在高分辨下会呈现完好光斑。
暗黑模式下的成果是这样的:
看起来仿佛更加有质感一点,除此之外,兴许你还想利用transition玩一些更加刺激的成果:
.mylogo:hover {
-webkit-transform: rotate(666turn);
transform: rotate(666turn);
transition-delay: 1s;
transition-property: all;
transition-duration: 59s;
transition-timing-function: cubic-bezier(.34, 0, .84, 1)
}
让咱们旋转、跳跃、闭着眼:
结语:两套计划都能够很好的实现光影特效,区别在于linear-gradient并不会耗费网站的带宽,但会耗费电脑的CPU和内存,而与背景突变相比,背景图像成果会更好一点,然而将会更多地应用网络带宽,而webp技术又能够帮忙咱们对图片进行极致的压缩(参见:https://v3u.cn/a\_id\_190),所以咱们能够了解这是一种衡量,毕竟,书本上写的是情理,然而事实中考究的是取舍,不是吗?
原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_197
发表回复