.append()将图像附加到转换非常慢

时间:2016-11-25 14:22:47

标签: javascript jquery html css append

我遇到的问题是图片在移动设备上的加载速度不够快。 我的项目有一个图像和一个按钮。单击按钮时,图像向下滑动,另一个图像从顶部滑动以替换它。这是代码

html

 <div class="main">

    <div id="myDiv1><img src="img1.jpg" width="100%"></div>
    <div id="myDiv2"></div>

</div>

CSS

.moveFromTop {
    animation: moveFromTop 2s ease both;
}

.moveToBottom {
    animation: moveToBottom 2s ease both;
}

@keyframes moveFromTop {
    from { transform: translateY(-100%); }
}

@keyframes moveToBottom {
    from { }
    to { transform: translateY(100%); }
}

JS

var img2 = new Image(); 

img2.src = "img2.jpg";

$(img2).css("width","100%");

$(document).ready( function () {


    $('#button').click(function(){

        $('#myDiv1').addClass('moveToBottom');

        $("#myDiv2").append(img2);

        $('#myDiv2').addClass('moveFromTop');
   });
});

它相当简单,适用于桌面。但是在移动设备上,当您单击#按钮时,第二个图像不会立即加载,因此您会获得一秒钟的黑色图像,这完全破坏了我想要的效果。在iPhone和iPad上都会发生这种情况。我还没有机会在Android上进行测试,但你会想到700美元+苹果手机可以处理一点转换;)我想知道我的代码是否有问题我正在创建这个问题。这是我的第一个项目。谢谢你的时间。

----------------------------------------------- - - - - - - - - - - 编辑 - - - - - - - - - - - - - - - -------------------------------

自从我发布这个问题以来,我已经尝试过很多东西。我试过移动&#34;追加&#34;排到&#34;点击&#34;函数,图像立即加载,指向这个问题与append()方法没有任何关系。我还尝试了一种不同的方法,即通过显示器立即加载图像&#34; none&#34;然后做一个.css(&#34;显示&#34;,&#34;阻止&#34;)而不是追加。我们仍然得到了黑色图像,它破坏了我在移动设备上的效果。 如果您想亲自查看问题,请访问&#34; alicesoyer.com&#34;。该网站正在上线但正在建设中。您需要单击屏幕上的任意位置以启动动画。你会看到我想要的效果。在桌面上它工作正常。在移动设备上它没有。我在iPad Air和iPhone6上进行测试。感谢。

3 个答案:

答案 0 :(得分:1)

解决方案是添加

    * {
        -webkit-transform: translate3d(0,0,0);
    }

或至少对某些子元素触发浏览器更好地使用硬件加速。 更多信息,请访问this页面

---更新:像这样(即仅在动画上),应该足够并且可能解决新的IPad问题:

.moveFromTop {
    animation: moveFromTop 2s ease both;
    -webkit-transform: translate3d(0,0,0);
}

.moveToBottom {
    animation: moveToBottom 2s ease both;
    -webkit-transform: translate3d(0,0,0);
}

答案 1 :(得分:0)

您正在做的事情可能不会预先加载图片,因为您还没有将其附加到DOM。

您可以将其附加到页面外,这样当您加载它时,它已经被缓存:

var preloadDiv = $("<div></div>")
    .css({
        position: "absolute",
        left: -10000
    })
    .append('<img src="img2.jpg">')
    .appendTo(document.body);
 var image 2 = preloadDiv.find("img");

然后在展示时:

$("#myDiv2").append(image2);
preloadDiv.remove();

答案 2 :(得分:0)

我的建议,而不是将其附加到DOM中,在开头就包含它。但是,如果你愿意在init上增加额外负载,那就是这样。

&#13;
&#13;
$(document).ready( function () {
    $('#button').click(function(){
        $('#myDiv1').addClass('moveToBottom');
        $('#myDiv2 > img').css({dislay:'block'});
        $('#myDiv2').addClass('moveFromTop');
   });
});
&#13;
#myDiv2 > img { display:none }
.moveFromTop {
    animation: moveFromTop 2s ease both;
}

.moveToBottom {
    animation: moveToBottom 2s ease both;
}

@keyframes moveFromTop {
    from {}
    to { transform: translateY(-100%); }
}

@keyframes moveToBottom {
    from {}
    to { transform: translateY(100%); }
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="main">
    <div id="myDiv1">
      <img src="https://placeholdit.imgix.net/~text?txtsize=33&txt=IMG1&w=350&h=150" width="100%">
    </div>
    <div id="myDiv2">
      <img src="https://placeholdit.imgix.net/~text?txtsize=33&txt=IMG2&w=350&h=150" width="100%">
    </div>
</div>

<button id="button">Toggle</button>
&#13;
&#13;
&#13;