css的transition实现一个hover边框加载的按钮

css的transition实现一个hover边框加载的按钮,第1张

定义一个如图所示的矩形按钮

为其添加两个伪元素

添加伪类hover:

transition 属性是一个简写属性,用于设置四个过渡属性:

transition-property:规定设置过渡效果的 CSS 属性的名称。

transition-duration:规定完成过渡效果需要多少秒或毫秒。

transition-timing-function:规定速度效果的速度曲线。

transition-delay:定义过渡效果何时开始。

tips:请始终设置 transition-duration 属性,否则时长为 0,就不会产生过渡效果。

transition-timing-function:

伪元素默认的宽高为0,当鼠标悬浮时候,设置一定的过渡时间使其宽高为100%。

上述demo中:

在0.2s内 border-top-color变化,border-right-color推迟0.2s之后完成一个0.2s的过渡。

同理border-bottom-color推迟0.4s,border-left-color推迟0.6s.

demo

伪类:

  :active,将样式添加到被激活的元素。

  :focus,将样式添加到被选中的元素。

  :hover,当鼠标悬浮在元素上方是,向元素添加样式。

  :link,将特殊的样式添加到未被访问过的链接。

  :visited,将特殊的样式添加到被访问的链接。

  :first-child,将特殊的样式添加到元素的第一个子元素。

  :lang,允许创作者来定义指定的元素中使用的语言。

 伪元素:

  :first-letter,将特殊的样式添加到文本的首字母。

  :first-line,将特殊的样式添加到文本的首行。

  :before,在某元素之前插入某些内容。

  :after,在某元素之后插入某些内容。

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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11716972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存