CSS过渡白闪问题

4
我想要做的就是使用CSS实现一个从暗色调到明亮色调的过渡效果(使用opacity),我已经尝试过使用-webkit-backface-visibility:hidden的技巧,但它没有起作用。当鼠标悬停时会出现白色闪烁,这让我很烦恼!!

http://jsfiddle.net/eb3Lp0s0/

CSS

.button {
    margin-left:auto;
    margin-right:auto;
    margin-top:25px;
    display:block;
   border-top: 1px solid #96d1f8;
   background: #0083d4;
   background: -webkit-gradient(linear, left top, left bottom, from(#0099ff), to(#0083d4));
   background: -webkit-linear-gradient(top, #0099ff, #0083d4);
   background: -moz-linear-gradient(top, #0099ff, #0083d4);
   background: -ms-linear-gradient(top, #0099ff, #0083d4);
   background: -o-linear-gradient(top, #0099ff, #0083d4);
   padding: 5px 10px;
   -webkit-border-radius: 8px;
   -moz-border-radius: 8px;
   border-radius: 8px;
   -webkit-box-shadow: rgba(0,0,0,1) 0 1px 0;
   -moz-box-shadow: rgba(0,0,0,1) 0 1px 0;
   box-shadow: rgba(0,0,0,1) 0 1px 0;
   text-shadow: rgba(0,0,0,.4) 0 1px 0;
   color:#272727;
   font-size: 18px;
   font-family: 'Century Gothic', Helvetica, Arial, Sans-Serif;
   text-decoration: none;
   vertical-align: middle;
   text-transform:uppercase;
  opacity: 1;
    transition: all 0.3s ease 0s;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-o-backface-visibility: hidden;

  }
.button:hover {
   border-top-color: #28597a;
   background: #28597a;
   color: #ccc;
     opacity: 0.75;
     -webkit-backface-visibility: hidden;

   }
.button:active {
   border-top-color: #1b435e;
   background: #1b435e;
   -webkit-backface-visibility: hidden;

HTML

<button type="button"  onclick="location.href='http://webwavebuilding.com/whatwedo.html'" class="button">Learn more</button>
1个回答

5

在:hover上使用background-color,而不仅仅是background

.button:hover {
    border-top-color: #28597a;
    background-color: #28597a;  /* <<< Here */
    color: #ccc;
    opacity: 0.75;
    -webkit-backface-visibility: hidden;
}

http://jsfiddle.net/eb3Lp0s0/1/

通常情况下,如果你只想设置特定的背景颜色,不要使用缩写的background,而是使用具体的属性。

另一种解决方法是在.button类中将渐变设置为background-color
.button {
    background-color: -webkit-gradient(linear, left top, left bottom, from(#0099ff), to(#0083d4));
    background-color: -webkit-linear-gradient(top, #0099ff, #0083d4);
}

http://jsfiddle.net/eb3Lp0s0/2/

或将颜色添加到组合的background中:

background: #0083d4 -webkit-gradient(linear, left top, left bottom, from(#0099ff), to(#0083d4));
background: #0083d4 -webkit-linear-gradient(top, #0099ff, #0083d4);

http://jsfiddle.net/eb3Lp0s0/3/

我认为这表明了正在发生的事情:使用background:作为渐变色会重置整个background-值集合,包括隐式的background-color。因此,即使在调用background: -webkit-gradient()之前正确设置了它,在那两行代码被执行时,它们实际上是通过重置操作移除了隐式的background-color,然后它就变成了background-color: transparent;。因此出现了闪烁。

真的很奇怪!我不知道为什么会有所不同,但它确实有。 - Charles
我认为这与转换有关,因为先前的状态从更具体的属性转换而来,闪光是在设置背景颜色之前进行转换的。不过这只是猜测。 - Jared Farrish
如果您移除渐变,闪烁就会消失。因此,这可能是与渐变和悬停过渡有关的错误,或者正如我之前所说,存在一个短暂的时刻,过渡作用于渐变并且其背景是透明的(这可能是错误的原因)。如果您在 body 上设置背景颜色,则后者似乎更有可能,因为它会显示出来。 - Jared Farrish
嗯...我甚至没有想到过,太棒了!我得继续阅读,这样我就能知道这些小细节了。 - Charles
这在Chrome上运行得很好!但是我在IE中仍然遇到了问题 :/ 但那真的非常有帮助! - Max Burleigh
我猜加上 background: #28597a -ms-linear-gradient(top, #0099ff, #0083d4); 应该可以解决这个问题。 - Jared Farrish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接