CSS变换和过渡在Safari中无法工作

3

我正在为移动站点设计一个<nav>标签。在Firefox和Chrome中工作良好,但在Safari中无法正常工作。我正在Windows 8.1上运行它,并在iPad mini的Safari中观察到相同的问题。

在下面的代码段中,如果您查看移动视图(max-width: 768px)并单击右上角的菜单图标,则该图标应该动画化为十字形(X)图标,并且导航菜单应该向下滑动。

$("a.nav-opener").click(function(e) {
  e.preventDefault();
  $('body').toggleClass("nav-active");
});
@media screen and (max-width: 768px){

  .holder {
    padding: 14px;
  }

  .logo {
    float: none;
    display: block;
    margin: 0px auto;
    width: 168px;
    position: relative;
    z-index: 2;
  }

  a {
    text-decoration: none;
    color: #DC7952;
    outline: medium none;
  }

  .logo img {
    width: 100%;
    height: auto;
    display: block;
  }

  img {
    max-width: 100%;
    height: auto;
  }

  .nav-opener {
    display: block;
    position: absolute;
    top: 0px;
    right: 0px;
    border-left: 1px solid #D4D4D4;
    width: 65px;
    height: 53px;
    text-indent: -9999px;
    overflow: hidden;
    background: none repeat scroll 0% 0% transparent;
    z-index: 15;
  }

  .nav-opener::before, .nav-opener::after {
    content: "";
    top: 19px;
  }

  .nav-opener::before, .nav-opener::after, .nav-opener span {
    background: none repeat scroll 0% 0% #DC7952;
    position: absolute;
    left: 15%;
    right: 15%;
    height: 6px;
    margin-top: -2px;
    transition: all 0.2s linear 0s;
  }

  .nav-opener::after {
    top: 37px;
  }

  .nav-opener span {
    background: none repeat scroll 0% 0% #DC7952;
    position: absolute;
    top: 28px;
    left: 15%;
    right: 15%;
    height: 6px;
    margin-top: -2px;
    transition: all 0.2s linear 0s;
  }

  .nav-active .nav-opener::after, .nav-active .nav-opener::before {
    transform: rotate(45deg);
    border-radius: 3px;
    top: 24px;
    left: 15%;
    right: 15%;
  }

  .nav-active .nav-opener::after {
    transform: rotate(-45deg);
  }

  .nav-opener::before, .nav-opener::after {
    content: "";
  }

  .nav-active .nav-opener span {
    display: none;
  }

  .navigation-container {
    border: 0px none;
    overflow: hidden;
    position: absolute;
    top: 53px;
    left: 0px;
    right: 0px;
    z-index: 999;
    max-height: 0px;
    transition: all 0.25s linear 0s;
    margin: 0px;
    padding: 0px;
  }

  .nav-active .navigation-container {
    max-height: 4000px;
  }

  .navigation-container .drop {
    transition: all 0.25s linear 0s;
    transform: translateY(-100%);
    background: none repeat scroll 0% 0% #FFF;
    width: 100%;
    display: table;
  }

  .nav-active .drop {
    transform: translateY(0px);
  }

  #nav {
    margin: 0px;
    overflow: visible;
    font-size: 24px;
    display: table-header-group;
    font-family: "apercu",sans-serif;
    font-weight: 700;
    line-height: 1.4285;
    text-transform: uppercase;
  }

  #nav ul {
    display: block;
    border-top: 1px solid #E8E8E8;
    padding: 0px;
    width: 100%;
    margin: 0px;
  }

  #nav li {
    display: block;
    width: auto;
    border-style: solid;
    border-color: #E8E8E8;
    -moz-border-top-colors: none;
    -moz-border-right-colors: none;
    -moz-border-bottom-colors: none;
    -moz-border-left-colors: none;
    border-image: none;
    border-width: 0px 0px 1px;
    list-style: outside none none;
  }

  #nav li.active a, #nav li a:hover {
    text-decoration: none;
    color: #FFF;
    background: none repeat scroll 0% 0% #DC7952;
  }

  #nav a {
    display: block;
    text-align: left;
    padding: 15px 20px;
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="holder">
  <strong class="logo"><a href="#">Some logo</a></strong>
</div>

<!-- navigation opener -->
<a href="#" class="nav-opener"><span>opener</span></a>

<div class="navigation-container">
  <div class="drop">
    <!-- main navigation of the page -->
    <nav id="nav">
      <ul>
        <li class="active"><a href="#">HOME</a></li>
        <li><a href="#">BIBLE RESOURCES</a></li>
        <li><a href="#">OUR MISSION</a></li>
      </ul>
    </nav>
  </div>
</div>

类似的jsFiddle示例

有人能给我指点一下方向吗?


我没有看到你的动画中有任何-webkit或-moz的前缀。尝试添加所有过渡并使用正确的前缀。例如:transition: opacity .25s ease-in-out; -webkit-transition: opacity .25s ease-in-out; -moz-transition: opacity .25s ease-in-out; -o-transition: opacity .25s ease-in-out; - Alessandro Incarnati
缺少前缀?http://caniuse.com/#feat=transforms2d - mikedidthis
@BaTmaN Safari 5.1.7 - Rahul Desai
这是旧版本。实际上是在2012年发布的。在OSX中测试您的代码。它将正常工作。http://caniuse.com/#feat=transforms2d - Prime
1
@mikedidthis 是的。我问了一个很糟糕的问题。:D - Rahul Desai
4个回答

5

在 Safari 和 Chrome 上,Transform 和 Transition 不起作用,除非使用 WebKit 作为 Safari 的浏览器前缀,因此请使用:

-webkit-transform 和 -webkit-transition 代替...


1
Chrome现在对这些属性已经没有前缀了。 - vals
是的,你说得对,但 WebKit 对于这两个浏览器都很常见,因此两者都将被渲染。 - Dipesh Rana

0

http://html-tuts.com/fix-laggy-transitions-in-css/所述,当您在Safari中使用过渡效果时,还需要添加额外的属性,否则可能会出现卡顿。

您可以通过将CSS属性transform与值translateZ(0)添加到具有过渡属性的元素来实现此目的 - 在本例中:

.nav-opener span {
...
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0); 
}

0

在Safari中,transform属性需要添加前缀,如:-webkit-transform

如需查看其他资源,请访问this


0

苹果公司早在2012年就停止了为Windows发布Safari的最新版本。也许你正在使用不兼容CSS3的旧版Safari浏览器。

Chrome和最新版本的Safari都使用Webkit渲染引擎。如果在Chrome中可以正常工作,那么在Safari中也会同样适用。

支持transform属性的Safari版本:

http://caniuse.com/#feat=transforms2d

如果我错了,请纠正我 :)


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