Chrome 中的过渡/不透明度渲染问题?

Posted

技术标签:

【中文标题】Chrome 中的过渡/不透明度渲染问题?【英文标题】:transition/opacity rendering issues in Chrome? 【发布时间】:2015-10-04 18:17:38 【问题描述】:

我遇到了 CSS 不透明度过渡的问题。它似乎在 Chrome 上运行不佳 - 大多数时候。

当它起作用时,它非常不稳定 - 不透明度大约为 1/2,然后是完全的。 当它不起作用时,它会变得不完全不透明,并停在那里。

我做错了什么?当我第一次实现这个时(我认为是 6 月中旬),我认为它运行良好。由于它有时会过渡到完全不透明,我不完全确定它是否曾经在 Chrome 中完全工作。但我和我的客户大约在同一时间(分别)注意到它 - 6 月下旬/7 月初。

这是我的 html 和 CSS 代码,以及 JSFiddle。 (可能比我需要复制这个错误多一点)

.fade 
   opacity:0;
   transition: opacity 0.5s;
   -moz-transition: opacity 0.5s;
   -webkit-transition: opacity 0.5s;
   -o-transition: opacity 0.5s;

#submenu 
   opacity:0;
   position:absolute;
   left:185px;

#submenu a 
   width: 90px;
   padding: .4em .5em;

.horizontal-menu2 
   opacity:inherit;
   position:absolute;
   left:113px;

.horizontal-menu1 
   opacity:inherit;
   position:absolute;
   left:5px;

.image-menu 
   opacity:inherit;
   position:absolute;
   right:175px;

.person:hover #submenu 
   opacity: 1;
<ul>
  <li class="person"><a href="#">Person One</a>
    <ul class="fade" id="submenu">
        <li class="horizontal-menu1"><a onclick="#">menu1</a></li>
        <li class="horizontal-menu2"><a href="#">menu2</a></li>
        <li class="image-menu"><img src="#" ></li>
    </ul>
  </li>
</ul>

我知道 Chrome v. 40 中的一个旧错误,但那是在 1 月份(我认为),我现在在 v. 43 上

它似乎是similar issue to this,但我的确实有时会起作用,所以也许这个人的问题没有完全解决。 此外,这种类型的其他问题较旧 - 有些是 Chrome v. 40(现已修复)错误的直接结果。

【问题讨论】:

【参考方案1】:

您的渲染错误似乎与在具有过渡不透明度的元素的子级上使用opacity: inherit; 有关。如果您删除这些行,它会按预期运行。

工作示例 (JSFiddle):

.fade 
    opacity:0;
    transition: all 0.5s;
    -moz-transition: all 0.5s;
    -webkit-transition: all 0.5s;
    -o-transition: all 0.5s;

#submenu 
    opacity:0;
    position:absolute;
    left:185px;

#submenu a 
    width: 90px;
    padding: .4em .5em;

.horizontal-menu2 
    position:absolute;
    left:113px;

.horizontal-menu1 
    position:absolute;
    left:5px;

.image-menu 
    position:absolute;
    right:175px;

.person:hover #submenu 
    opacity: 1;
<ul class="interview-menu">
    <li class="person"><a href="#">Person One</a>
        <ul class="fade" id="submenu">
            <li class="horizontal-menu1"><a onclick="#">menu1</a>
            </li>
            <li class="horizontal-menu2"><a href="#">menu2</a>
            </li>
            <li class="image-menu">
                <img src="#" >
            </li>
        </ul>
    </li>
</ul>

纯属猜测,但我猜它是在转换期间缓存从父元素继承的值,而不是在转换期间更新它。

【讨论】:

就是这样!谢谢!我想我在这样做的早期就写了opacity: inherit;,因为它没有转换所有这些,然后我可能修复了真正的错误并将其留在了那里。

以上是关于Chrome 中的过渡/不透明度渲染问题?的主要内容,如果未能解决你的问题,请参考以下文章

忽略溢出的 CSS 不透明度过渡:隐藏在 Chrome/Safari 中

不透明度过渡在 chrome 和 chromecast 中带有大图像

Chrome 文本在不透明度过渡时变得模糊

CSS 过渡:不透明度和可见性过渡不适用于 Firefox(适用于 Chrome / Safari)

a:hover 的不透明度过渡不起作用

渲染具有透明度的纹理时 OpenGL 不需要的像素