jquery 如何让JS文件在Safari浏览器中工作?

baubqpgj  于 2023-06-05  发布在  jQuery
关注(0)|答案(1)|浏览(194)

我发现一个随机改变网站中div位置的脚本在Safari浏览器中无法正常工作。我可以看到元素样式位置在检查时被实时更新,但是位置的变化没有在dom中呈现。

function randomFromTo(from, to){
            return Math.floor(Math.random() * (to - from + 1) + from);
        }
  
        function moveRandom(obj) {
            /* get container position and size
             * -- access method : cPos.top and cPos.left */
            var cPos = $('.sphere-move-container').offset();
            var cHeight = $('.sphere-move-container').height();
            var cWidth = $('.sphere-move-container').width();
            
            // get box padding (assume all padding have same value)
            var pad = parseInt($('.sphere-move-container').css('padding-top').replace('px', ''));
            
            // get movable box size
            var bHeight = obj.height();
            var bWidth = obj.width();
            
            // set maximum position
            maxY = cPos.top + cHeight - bHeight - pad;
            maxX = cPos.left + cWidth - bWidth - pad;
            
            // set minimum position
            minY = cPos.top + pad;
            minX = cPos.left + pad;
            
            // set new position         
            newY = randomFromTo(minY, maxY);
            newX = randomFromTo(minX, maxX);
            
            obj.animate({
                top: newY,
                left: newX
                }, 10000, function() {
          moveRandom(obj);
            });
        }
$('.category-sphere-container').each(function() {
moveRandom($(this));
});

脚本在chrome,firefox等中呈现。我一直无法确定如何编辑脚本,使其在Safari中工作。任何帮助都是非常感谢的。

eufgjt7s

eufgjt7s1#

一个可能的解决方案是将transform: translate3d(0,0,0) CSS属性添加到动画元素中。这是一个已知的解决Safari的渲染问题的CSS动画和过渡。
为此,可以修改moveRandom函数,如下所示:

function moveRandom(obj) {
    // get container position and size
    var cPos = $('.sphere-move-container').offset();
    var cHeight = $('.sphere-move-container').height();
    var cWidth = $('.sphere-move-container').width();
    
    // get box padding (assume all padding have same value)
    var pad = parseInt($('.sphere-move-container').css('padding-top').replace('px', ''));
    
    // get movable box size
    var bHeight = obj.height();
    var bWidth = obj.width();
    
    // set maximum position
    maxY = cPos.top + cHeight - bHeight - pad;
    maxX = cPos.left + cWidth - bWidth - pad;
    
    // set minimum position
    minY = cPos.top + pad;
    minX = cPos.left + pad;
    
    // set new position         
    newY = randomFromTo(minY, maxY);
    newX = randomFromTo(minX, maxX);
    
    obj.css('transform', 'translate3d(' + newX + 'px, ' + newY + 'px, 0)');
    
    setTimeout(function() {
        moveRandom(obj);
    }, 10000);
}

注意添加了obj.css('transform', 'translate3d(' + newX + 'px, ' + newY + 'px, 0)');,它使用transform属性设置元素的新位置。
还要注意的是,我们现在使用setTimeout()而不是obj.animate(),每10秒重复调用moveRandom()。这是因为在某些Safari版本中,animate()不能与transform属性一起使用。
最后,确保将以下CSS添加到您想要动画的元素中:

.category-sphere-container {
    position: absolute;
    transform: translate3d(0, 0, 0);
}

这将修复Safari中的渲染问题。

相关问题