Safari transform rotate 不兼容问题及解决

问题出现情况

移动端写CSS3 时 发现在safari 上 一个元素使用了 transform:rotateY(19deg); 显示有问题。当然 不仅仅是 rotateY, 所有跟rotate有关的都有可能出现问题,当然包括rotate3d。

  • 比如这样
.css {
    -webkit-transform: rotateY(19deg)
    transform: rotateY(19deg)
}
  • 还有animate.css 中 的翻转
@-webkit-keyframes flipInY {
    0% {
        -webkit-transform: perspective(400px) rotate3d(0,1,0,90deg);
        transform: perspective(400px) rotate3d(0,1,0,90deg);
        -webkit-animation-timing-function: ease-in;
        animation-timing-function: ease-in;
        opacity: 0
    }
    40% {
        -webkit-transform: perspective(400px) rotate3d(0,1,0,-20deg);
        transform: perspective(400px) rotate3d(0,1,0,-20deg);
        -webkit-animation-timing-function: ease-in;
        animation-timing-function: ease-in
    }
    60% {
        -webkit-transform: perspective(400px) rotate3d(0,1,0,10deg);
        transform: perspective(400px) rotate3d(0,1,0,10deg);
        opacity: 1
    }
    80% {
        -webkit-transform: perspective(400px) rotate3d(0,1,0,-5deg);
        transform: perspective(400px) rotate3d(0,1,0,-5deg)
    }
    100% {
        -webkit-transform: perspective(400px) rotate3d(0,1,0, 0deg);
        transform: perspective(400px) rotate3d(0,1,0, 0deg);
    }
}
@keyframes flipInY {
    0% {
        -webkit-transform: perspective(400px) rotate3d(0,1,0,90deg);
        transform: perspective(400px) rotate3d(0,1,0,90deg);
        -webkit-animation-timing-function: ease-in;
        animation-timing-function: ease-in;
        opacity: 0
    }
    40% {
        -webkit-transform: perspective(400px) rotate3d(0,1,0,-20deg);
        transform: perspective(400px) rotate3d(0,1,0,-20deg);
        -webkit-animation-timing-function: ease-in;
        animation-timing-function: ease-in
    }
    60% {
        -webkit-transform: perspective(400px) rotate3d(0,1,0,10deg);
        transform: perspective(400px) rotate3d(0,1,0,10deg);
        opacity: 1
    }
    80% {
        -webkit-transform: perspective(400px) rotate3d(0,1,0,-5deg);
        transform: perspective(400px) rotate3d(0,1,0,-5deg)
    }
    100% {
        -webkit-transform: perspective(400px) rotate3d(0,1,0, 0deg);
        transform: perspective(400px) rotate3d(0,1,0, 0deg);
    }
}
.flipInY {
    -webkit-backface-visibility: visible!important;
    backface-visibility: visible!important;
    -webkit-animation-name: flipInY;
    animation-name: flipInY;
}

表现

  • 这是正常状态的表现:

    ==这中间有两个圆都在进行翻转动画; ==
  • 这是不正常的表现

    问题出现了,中间做动画的两个圆 不见了,甚至影响到了最外圈的圆!
    此时我把这个背景关闭直接看源码,发现了这么一个情况,见证奇迹的时刻就要来临了!注意看下面三张图



    == 动画元素出现了! 这是一个多么激动人心的时刻!==
    这是多么神奇的情况!动画元素在其父级的背景图层下展现。。。
    这TM就很尴尬了。。。

于是乎各种baidu google bing之。。。终于

解决方案

试着 在父类元素上添加 perspective
先来看看它的介绍

定义和用法
perspective 属性定义 3D 元素距视图的距离,以像素计。该属性允许您改变 3D 元素查看 3D 元素的视图。
当为元素定义 perspective 属性时,其子元素会获得透视效果,而不是元素本身。
注释:perspective 属性只影响 3D 转换元素。

于是乎我在 父级元素加入perspective

.father {
    transform: perspective(400px) // 为啥是400? 因为animate.css中flipInX用到的就是400;我这里是引用了 animate.css 所以 根据它的设定我也设定了400
}

然后。。。你去看看吧。。。反正就是。。。解决了!没毛病!