pc端hover阴影改变

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pc端hover阴影改变相关的知识,希望对你有一定的参考价值。

参考技术A pc端hover阴影改变
box-shaodw 在我们的工作中使用以及越来越多,伴随阴影的动画或多或少都有一点。假设,我们有下面这样一个盒子:

div
width: 100px;
height: 100px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);

希望 hover 的时候,盒阴影从 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3) 过渡到 box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3)。

box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3) --> box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3)

OK,最简单的方法当然是:

div:hover
width: 100px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
因为过渡动画是在两个不同的盒阴影状态在发生,所以在过渡动画的时间内,浏览器会不断的重绘盒阴影。而又由于阴影属于耗性能样式,所以这种动画给人的感觉多少有些卡顿。

这里有一个小技巧可以优化这种情况下的阴影动画。

使用伪元素及透明度进行优化

使用伪元素及透明度进行优化,我们给上述元素添加一个 before 伪元素,大小与父 div 一致,并且提前给这个元素添加好所需要的最终的盒阴影状态,但是元素的透明度为 0。

div
position: relative;
width: 100px;
height: 100px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);


div::before
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
opacity: 0;

然后,在 hover 的时候,我们只需要将伪元素的透明度从 0 设置为 1 即可。

div:hover::before
opacity: 1;

这样做的好处是,实际在进行的阴影变化,其实只是透明度的变化,而没有对阴影进行不断的重绘,有效的提升了阴影动画的流畅程度,让它看起来更加丝滑。

为什么对透明度 opacity 进行动画要比对 box-shadow 进行动画性能更好呢?可以看看这里这张表格,列举了不同属性变换对页面重排、重绘的影响:

存在的问题,另外一种方案

原文中上述这个方案其实并不算太完美,因为最终的效果是两个阴影的叠加效果,可能会在整体的感觉上阴影颜色更深了一点。

所以需要对最终状态的阴影进行微调一下,削弱一点效果,尽量让两个阴影的叠加效果与单一一个阴影效果相近。

当然,我们可以再对上述方案进行优化,我们再使用一个 ::after 伪元素,::after 伪元素设置为初始状态且透明度为1,::before 伪元素设置为末尾状态且透明度为0:

div
position: relative;
width: 100px;
height: 100px;


div::before
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
opacity: 0;


div::after
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);

实际 hover 的时候,对两个伪元素进行一显一隐,这样最终的效果只有一个阴影效果,没有阴影的叠加,与直接对阴影进行过渡变化效果一致:

div:hover::before
opacity: 1;


div:hover::after
opacity: 0;

移动端和PC端有什么区别

1.PC考虑的是浏览器的兼容性,而移动端开发考虑的更多的是手机兼容性,因为目前不管是android手机还是ios手机,一般浏览器使用的都是webkit内核,所以说做移动端开发,更多考虑的应该是手机分辨率的适配,和不同操作系统的略微差异化。

2.在部分事件的处理上,移动端多出来的事件是触屏事件,而缺少的是hover事件。 另外包括移动端弹出的手机键盘的处理,这样的问题在PC端都是遇不到的。

3.在布局上,移动端开发一般是要做到布局自适应的,需要熟练使用rem布局

4.在动画处理上,PC端由于要考虑IE的兼容性,所以通常使用JS做动画的通用性会更好一些,但是CSS3做了很大的牺牲,而在手机端,如果要做一些动画、特效等,第一选择肯定是CSS3, 既简单、效率又高。

5.微信的一些接口组好能去实现一遍,熟悉一下肯定是有好处的,比如通过微信分享文章,title、description、icon等图标的配置,这些还是要会的。

6.百度地图的一些API接口对于移动端来说,LBS是一个非常重要的特性,所以地图这块肯定是要了解的,在加上百度地图这块已经是一个比较成熟的平台了,所以学起来也比较容易。

7.CSS3的动画在移动端用的还是比较多的,但同时也要注意性能。

8.一般PC端用jquery,移动端用zepto,因为移动端的流量还是比较重要的,所以引入的资源或者插件,能小则小,一个30k的资源和一个80k的资源,在移动端的差别还是挺大的。未压缩的jquery是262kb,压缩的jquey是83kb。未压缩的zepto是54kb,压缩的zepto只有9kb。

9.最好能掌握一套完整的前端开发架构,比如模块化、打包、压缩、缓存有条件的还可以做一下自动化测试等等。

10.性能优化,包括首屏的打开速度、用户响应延迟、渲染性能、动画帧率等在手机上都需要特别注意。

以上是关于pc端hover阴影改变的主要内容,如果未能解决你的问题,请参考以下文章

盒子模型阴影设置,爱奇艺阴影配置

关于小程序去除view/navigator 点击后默认阴影效果

如何改变android高程阴影的方向?

如何改变AppBar的阴影颜色?

高度和阴影

Xcode 错误?改变阴影不透明度也会改变背景高光