CSS 过渡不适用于 FF 中的 top 属性

Posted

技术标签:

【中文标题】CSS 过渡不适用于 FF 中的 top 属性【英文标题】:CSS transition does not work on top property in FF 【发布时间】:2013-08-28 17:20:12 【问题描述】:

我有以下 html

<ul>
    <li>
        <a href="#">
            <h2>title</h2>
        </a>
    </li>
     <li>
        <a href="#">
            <h2>title</h2>
        </a>
    </li>
     <li>
        <a href="#">
            <h2>title</h2>
        </a>
    </li>
</ul>

CSS

ul 
    list-style: none;  
    text-align: center;

ul li 
    position: relative;
    float: right;
    margin-right: 20px;
    width: 30%;

ul li 
    transition: all 0.3s;

ul li:hover 
    top: -10px;

ul li> a
    color: red;

问题是过渡不适用于 moz,它适用于 webkit。如何以跨浏览器的方式实现这一点?

DEMO

【问题讨论】:

【参考方案1】:

如果元素中未指定属性的初始值,浏览器不会对属性应用transition。因此,将top: 0px 添加到ul li 将解决此问题。

ul 
  list-style: none;
  text-align: center;

ul li 
  position: relative;
  float: right;
  margin-right: 20px;
  top: 0px; /* this line was added */
  width: 30%;

ul li 
  transition: all 0.3s;

ul li:hover 
  top: -10px;

ul li> a 
  color: red;
<!-- Library included just to avoid prefixes so that users with older browser can view -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>

<ul>
  <li>
    <a href="#">
      <h2>title</h2>
    </a>
  </li>
  <li>
    <a href="#">
      <h2>title</h2>
    </a>
  </li>
  <li>
    <a href="#">
      <h2>title</h2>
    </a>
  </li>
</ul>

注意:我还建议使用与 Mr_Green 的回答中提到的相同的选项 (transform)。

【讨论】:

【参考方案2】:

我不知道为什么 top css 属性在 Firefox 中做动画时表现得很奇怪,即使它在 css 中被列为 animation behaviour property

无论如何,在 Firefox 中使用 margin-top 而不是 top 可以正常工作。

但我想建议使用 transform 的 "translateX" 和 "translateY" css 属性,而不是从下一次开始使用定位,因为它很有效. (由Paul Irish推荐

【讨论】:

我认为如果将top: 0px 添加到原始代码中,它仍然可以正常工作(不是说更好,但它会工作)。我记得之前读过关于 SO 的答案,其中指出当原始元素中未提及该属性时,FF 不应用转换。 @Harry 是的,没错。才意识到。 :) 这里是working fiddle。【参考方案3】:

试试这个:

ul li  
    /* standard property and other vendor prefixes */
    -moz-transition: -moz-transform 0.3s;

ul li:hover 
    /* standard property and other vendor prefixes */
    -moz-transform: translateY(-10px);

【讨论】:

@Sam 添加-moz-transition 供应商前缀,也不要删除transition css 属性。如果您也这样做了,请忽略此消息。 @Mr_Green 是的! Mr_green 我也试过了.. 我也更新了演示 @Sam 似乎问题出在top css 属性上。当我用margin-top 替换top 时。它工作正常。 然后使用这个,ul li -moz-transition: -moz-transform 0.3s; ul li:hover -moz-transform: translateY(-10px); 格林先生的回答非常适合您。你的 position:relative;top:-10px 是在告诉 FF 简单地将你的 div 相对于其基线移动 -10px,而不是按照 green 先生的建议设置动画。【参考方案4】:

这绝对不是过渡声明或您编写的 CSS 中的任何其他内容 --- 尝试将 opacity:.5 添加到悬停状态,您会看到它的动画效果很好。

因此,出于某种原因,Firefox 没有转换 top 属性。老实说,我还不知道为什么。我现在的解决方案是使用 CSS 转换将项目向上移动 10 像素:

ul li:hover 
    -o-transform: translateY(-10px);
    -ms-transform: translateY(-10px);
    -moz-transform: translateY(-10px);
    -webkit-transform: translateY(-10px);
    transform: translateY(-10px);

如您在此处看到的,这在 Firefox 中成功制作动画:

http://jsfiddle.net/y7yQQ/7/

【讨论】:

谢谢大卫,我将使用 margin-top 而不是 top :) @Sam 是的,好点子,用更少的 CSS 就能达到同样的效果!

以上是关于CSS 过渡不适用于 FF 中的 top 属性的主要内容,如果未能解决你的问题,请参考以下文章

CSS过渡不适用于height属性[重复]

CSS 过渡不适用于 height 属性

CSS3 过渡不适用于显示属性 [重复]

css 过渡动画不适用于 svg 路径的“d”属性更改

CSS过渡不适用于变换:翻译

CSS过渡不适用于悬停