Safari 上的复杂动画导致性能低下

Complex Animation on Safari causes sluggish performance

所以在网上漫游之后,我决定在这里问这个问题。

我正在为我们公司构建一个 Ionic 应用程序,其中一个需求是应用此动画:

Position + transition - Animation

这是 CSS 部分:

.background{
    background-color:#292930;
}
ul{
    list-style:none;
}
.categories{
    text-align: center;
    position: relative;
    height:280px;
    width:90%;
}
.categories ul li div{
    font-size:18pt;
    border-radius:200px;
    margin-top:15px;
    background-color:#EAEAEA;
    height:30px;
    width:30px;
    -webkit-transform: translate3d(0, 0, 0);
    -webkit-backface-visibility: hidden;
    -webkit-perspective: 1000;
    -webkit-transition:1s;
    transition:1s;
    position: absolute;
    display:block;
}
.moveTop {
   top:5px !important;
    left:77% !important;
}
.categories ul li:nth-child(1) div{left:3%; top:0;}
.categories ul li:nth-child(2) div{left:40%; top:0;}
.categories ul li:nth-child(3) div{left:77%; top:0;}
.categories ul li:nth-child(4) div{left:3%; top:31%;}
.categories ul li:nth-child(5) div{left:40%; top:31%;}
.categories ul li:nth-child(6) div{left:77%; top:31%;}
.categories ul li:nth-child(7) div{left:3%; top:63%;}
.categories ul li:nth-child(8) div{left:40%; top:63%;}
.categories ul li:nth-child(9) div{left:77%; top:63%;}

基本可以,但是在iOS或者Safari浏览器上超级卡顿,你甚至可以打开fiddle来验证

经过深入研究,我发现您可以添加

-webkit-transform: translate3d(0, 0, 0);

这应该强制 GPU 硬件加速,但这没有帮助。

之后,我阅读了 Paul Irish 的一篇文章,建议使用 transform:translate 而不是 topleft 属性。

所以我试过了,它确实有效,非常顺利,问题是,对于翻译我需要指定每个元素,与自身相比应该移动多少(比如向左 30px),当我必须支持多种屏幕尺寸时,这是非常无益的。

关于如何使用 translate3d 或 translate 执行此操作,或者只是为了使其在 Safari 上流畅,有什么建议吗?

问题是转换宽度与元素大小有关,这不是响应式的。

一个可能的解决方案是使用 li 元素(在您的布局中大部分未使用)来处理此问题。

我们可以将它们的大小设置为容器的 33%(水平和垂直)。现在所需的变换或多或少(你可以微调)容器大小的 1/3 为 100%,2/3 为 200%

悬停演示以查看转换

.background{
    background-color:#292930;
}
ul{
    list-style:none;
    height: 100%;
    position: relative;
}
.categories{
    text-align: center;
    position: relative;
    height:280px;
    width:90%;
}

li {
    width: 33%;
    height: 33%;
    top: 5px;
    left: 66%;
    position: absolute;
    transition:1s;
}

.categories ul li div{
    left: 5%;
    font-size:18pt;
    border-radius:200px;
    margin-top:15px;
    background-color:#EAEAEA;
    height:30px;
    width:30px;
    -webkit-transform: translate3d(0, 0, 0);
    position: absolute;
    display:block;
}

.categories ul li:nth-child(1) {transform: translate(-200%); z-index: 10;}
.categories ul li:nth-child(2) {transform: translate(-100%);}
.categories ul li:nth-child(3) {transform: translate(0%);}
.categories ul li:nth-child(4) {transform: translate(-200%, 100%);}
.categories ul li:nth-child(5) {transform: translate(-100%, 100%);}
.categories ul li:nth-child(6) {transform: translate(   0%, 100%);}
.categories ul li:nth-child(7) {transform: translate(-200%, 200%);}
.categories ul li:nth-child(8) {transform: translate(-100%, 200%);}
.categories ul li:nth-child(9) {transform: translate(   0%, 200%);}

.categories:hover ul li {transform: translate(0%, 0%) !important;}
<div class="background categories">
    <ul>
        <li><div class="elem">1</div></li>
        <li><div class="elem">2</div></li>
        <li><div class="elem">3</div></li>
        <li><div class="elem">4</div></li>
        <li><div class="elem">5</div></li>
        <li><div class="elem">6</div></li>
        <li><div class="elem">7</div></li>
        <li><div class="elem">8</div></li>
        <li><div class="elem">9</div></li>
    </ul>
</div>