我有一个名为 imageContainer 的 div。imageContainer 包含一个 img,我将一个包含 256 个带有背景图像的子 div 的 div 附加到 imageContainer,然后删除该 img。我这样做是这样的:
$imageContainer.append($container);
$imgCurrent.hide();
我遇到了一个问题,在 Chrome 中,div 会闪烁一秒钟,您可以看到 imageContainer 后面的内容。如果我将代码更改为以下代码,则它可以在没有闪烁的情况下工作:
$imageContainer.append($container);
setTimeout(function () {
$imgCurrent.hide();
}, 100); // 50ms still flickers
我认为可能发生的是 div 被附加,img 被删除,然后子 div 被渲染。唯一的事情是这一切都发生得太快而无法查看/调试。我确实认为子 div 出现了,但背景图像的渲染速度不够快。但是我尝试将每个子 div 的背景颜色设置为红色,但仍然只看到后面的内容而不是看到任何红色。
我唯一的结论是 Chrome 需要一段时间才能将 div 添加到页面中,有没有办法检查这一点?我不想只使用 setTimeout,我可以使用.ready()
or .load()
(不确定是否load()
适用于背景图像,对吗?)
谢谢,
乔
PS 显示的图像在浏览器缓存中,因此在实际获取它们时没有延迟。
编辑:观察突变的新代码 - 仍然不起作用
function transition(duration, callback) {
var runWhenReady = function () {
$imgCurrent.hide();
var transitionName;
if (_args.randomTransition) {
if (transitionIndex % _args.transitions.length == 0) {
shuffledTransitions = shuffle(_args.transitions);
}
transitionName = shuffledTransitions[transitionIndex % _args.transitions.length];
} else {
transitionName = _args.transitions[transitionIndex % _args.transitions.length];
}
transitionIndex++;
runTransition(transitionName, $grid, x, y, duration, function () {
var waitForAnimationToEnd = setInterval(function () {
// Although the set interval timer used in the trasition has finished there may still be animations running
if (!$grid.children().is(':animated')) {
$grid.remove();
callback();
clearInterval(waitForAnimationToEnd);
}
}, 20);
});
};
// The more cells we have the better it looks but it lags in ff/ie
var x = 16;
var y = 16;
var $grid = $('<div />');
$imageContainer.append($grid);
// If the browser supports it then wait for the dom elements to load if not then just wait a while
if (typeof (MutationObserver) == 'undefined') {
setTimeout(runWhenReady, 200);
} else {
//TODO: Not sure if this works yet - if not then just use the code above
$grid.data('mutations', 0);
var observer = new MutationObserver(function (mutations) {
// In Chrome I get all of the mutations at once but in some browsers / scenarios there may be multiple calls to this function so we maintain a counter
$grid.data('mutations', parseInt($grid.data('mutations')) + mutations.length);
if (parseInt($grid.data('mutations')) >= x * y) {
observer.disconnect();
runWhenReady();
}
});
var config = { attributes: false, childList: true, characterData: false };
observer.observe($grid[0], config);
}
currentImageToGrid($grid, x, y);
}