2016-08-02 15 views
0

しばらく時間がかかるDOM要素に巨大なHTMLマークアップを挿入する必要があります。プリローダー・インジケーターを表示したいのです。 #preloaderと#containerの2つのブロックがあります。コードによっては、プリローダーが最初に表示され、大きなhtmlマークアップが貼り付けられます。ブラウザでDOM要素を直ちに再描画するようにします

ブラウザがhtmlマークアップのレンダリングを終了しない限り、プレローダーは実際に表示されませんでした。私は多くのソリューションを試しましたが(多くはhereと記載されています)、まだ成功していません。

例を以下に有りです: https://jsfiddle.net/f9f5atzu/

<div id='preloader'>Preloader...</div> 
<div id='container'>Container...</div> 

#preloader { 
    display: none; 
    background-color: #f00; 
    color: #fff; 
    hight: 100px; 
    text-align: center; 
    padding: 10px 20px; 
} 

#container { 
    background-color: #ccc; 
} 


setTimeout(function() { 
    // Define variables 
    let domPreloader = document.getElementById('preloader'); 
    let domContainer = document.getElementById('container'); 
    const html = Array(100000).fill("<div>1</div>"); 

    // Display preloader 
    domPreloader.style.display = 'hide'; 
    domPreloader.offsetHeight; 
    domPreloader.style.webkitTransform = 'scale(1)'; 
    domPreloader.style.display = 'block'; 

    // Render a big html 
    domContainer.innerHTML = html; 
}, 1000); 

は、問題の任意の解決策はありますか?

答えて

1

あなたのやり方では、プリローダーの表示と「ビッグhtml」の表示の間でブラウザーに制御を解放していません。

このブロック全体をsetTimeout()にカプセル化するのではなく、レンダリング部分を変えるだけです。

これらの線に沿って何かをしてみてください:

// Define variables 
let domPreloader = document.getElementById('preloader'); 
let domContainer = document.getElementById('container'); 

// Display preloader 
domPreloader.style.webkitTransform = 'scale(1)'; 
domPreloader.style.display = 'block'; 

// Render a big html 
setTimeout(render, 100); 

function render() { 
    const html = Array(100000).fill("<div>1</div>"); 
    domContainer.innerHTML = html; 

    // Hide preloader 
    domPreloader.style.display = 'none'; 
} 

JSFiddle

+0

は答えをいただき、ありがとうございます。私は、同じ実行スタックの中でペイントを制御する方法があることを期待しています。 – Dmitriy

+0

他のブロックのレンダリング中に、ブラウザが一部のブロックでアニメーションを停止しない(backgroud-image CSSプロパティまたはCSSアニメーション経由で)可能性はありますか? – Dmitriy

+1

レンダリング操作がCPUを大量に消費する場合、完全にフリーズしていなければ、アニメーションはおそらく少なくともジャークになります。解決策は、あなたの操作を小さなもの(例えば100 x 'html = Array(1000).fill("

1
");)で分割し、' setTimeout() 'を使って次のバッチを起動することです。 – Arnauld