2017-04-17 223 views
5

我有一个简单的多列布局;我正在尝试使用translateY解除:hover上的元素。为什么我的转换:translateY在Chrome中闪烁?

它会导致闪烁(在Chrome 57上测试)。我该如何解决?

"use strict"; 
 

 
$(function() { 
 
    var $target = $('.wall'); 
 

 
    function getImageUrl(id) { 
 
    var width = 500; 
 
    var height = 250 + Math.floor(Math.random() * 150); 
 
    return "https://unsplash.it/" + width + "/" + height + "?image=" + id; 
 
    } 
 

 
    function addElement(element) { 
 
    var $template = $target.find('.template').clone().appendTo($target).removeClass("template"); 
 

 
    $template.find("a").attr("href", element.post_url); 
 

 
    $template.find("img").attr("src", getImageUrl(element.id)); 
 

 
    $template.find("figcaption").text(element.author); 
 

 
    $template.removeClass("hide"); 
 
    } 
 

 
    $.getJSON("https://unsplash.it/list", function (data) { 
 
    var images = 12; 
 
    var elements = []; 
 

 
    function getRandomImage() { 
 
     var id = Math.floor(Math.random() * data.length); 
 
     return data.splice(id, 1)[0]; 
 
    } 
 

 
    while (images > elements.length) {if (window.CP.shouldStopExecution(1)){break;} 
 
     elements.push(getRandomImage()); 
 
    } 
 
window.CP.exitedLoop(1); 
 

 

 
    elements.forEach(function (element) { 
 
     addElement(element); 
 
    }); 
 
    }); 
 
});
.wall { 
 
    -webkit-column-count: 3; 
 
    -moz-column-count: 3; 
 
      column-count: 3; 
 
    padding-top: 0.5rem; 
 
} 
 
.wall * { 
 
    -webkit-column-break-inside: avoid; 
 
    page-break-inside: avoid; 
 
      break-inside: avoid; 
 
} 
 
.wall .brick { 
 
    display: block; 
 
    padding-bottom: 1rem; 
 
} 
 
.wall .brick a { 
 
    display: inline-block; 
 
    color: inherit; 
 
    -webkit-transition: -webkit-transform 333ms ease; 
 
    transition: -webkit-transform 333ms ease; 
 
    transition: transform 333ms ease; 
 
    transition: transform 333ms ease, -webkit-transform 333ms ease; 
 
} 
 
.wall .brick a:hover, .wall .brick a:focus { 
 
    -webkit-transform: translateY(-1rem); 
 
      transform: translateY(-1rem); 
 
} 
 
.wall .brick .thumbnail { 
 
    margin-bottom: 0.5rem; 
 
} 
 
.wall .brick figcaption { 
 
    text-align: center; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
 
<div class="wall column"> 
 
    <div class="hide brick template"> 
 
    <a> 
 
     <figure> 
 
     <img class="thumbnail" /><figcaption></figcaption> 
 
     </figure> 
 
    </a> 
 
    </div> 
 
</div>

CodePen Demo

+0

可能有趣的是,对于我(Safari 10.1)来说,只有最上面一行闪烁的中间和右侧图片,其他图片会按照预期来回移动。 – 11684

+1

既然Chrome也是Webkit,这可能会解决你的问题:http://stackoverflow.com/questions/2946748/iphone-webkit-css-animations-cause-flicker – 11684

+0

[This](http://stackoverflow.com/questions/15751012/css-transform-causes-flicker-safari-only-the-the-browser-is-2000px-w)也是类似的。你看过[这些Google结果](https://www.google.nl/#q=css+transform+flicker)了吗?许多似乎适用。 – 11684

回答

3

配售下面的代码中的元素与转换属性解决:

-webkit-perspective: 1000; 
-webkit-backface-visibility: hidden; 

你的情况:

a { 
    display: inline-block; 
    transition: transform 333ms ease; 
    &:hover, &:focus { 
    transform: translateY(-1rem); 
    -webkit-perspective: 1000; 
    -webkit-backface-visibility: hidden; 
    } 
} 
+0

同样的解决方案也适用于新的bootstrap 4牌套牌! – spaceemotion