CSS ロード時
ソース: https://stackoverflow.com/a/12570580/1292652
次のように、確認したい CSS ファイルに固有の参照スタイルを追加します。
#ensure-cssload-0 {
display: none;
}
次に、JS 関数を使用してcssLoad()
、CSS がダウンロードされているかどうかを繰り返し確認します (これが、CSS が実際に描画/レンダリングされたときと大きく異なるかどうかはわかりません)。
var onCssLoad = function (options, callback) {
var body = $("body");
var div = document.createElement(constants.TAG_DIV);
for (var key in options) {
if (options.hasOwnProperty(key)) {
if (key.toLowerCase() === "css") {
continue;
}
div[key] = options[key];
}
}
var css = options.css;
if (css) {
body.appendChild(div);
var handle = -1;
handle = window.setInterval(function () {
var match = true;
for (var key in css) {
if (css.hasOwnProperty(key)) {
match = match && utils.getStyle(div, key) === css[key];
}
}
if (match === true) {
window.clearTimeout(handle);
body.removeChild(div);
callback();
}
}, 100);
}
}
次のように使用できます。
onCssLoad({
"id": <insert element CSS applies to>,
css: <insert sample CSS styles>
}, function () {
console.log("CSS loaded, you can show the slideshow now :)");
});
CSSの計算について
ソース: http://atomicrobotdesign.com/blog/javascript/get-the-style-property-of-an-element-using-javascript/
前のソリューションでは、CSS ファイルが'downloaded'されたかどうかのみを通知しましたが、質問では、要素のスタイルが'computed'または'rendered'または' paint' された時期を知る必要があると述べています。これで解決することを願っています。
次のように、確認したい CSS ファイルに固有の参照スタイルを追加します。
#ensure-cssload-0 {
ignored-property: 'computed';
}
getPropertyValue
次に、とを使用getComputedStyle
して CSS を確認します。
function getStyle(elem, prop) {
return window.getComputedStyle(elem, null).getPropertyValue(prop);
}
今、while
コールバックでループを使用するだけです:
function checkStyle(elem, prop, callback) {
while ( getStyle(elem, prop) !== 'computed' ) {
// see explanation below
}
callback()
}
JavaScript には( Python のように)ステートメントがないpass
ため、空のコード ブロックを使用します。
要素に適用されたすべての CSS スタイルを取得したい場合(警告:継承されたスタイルも表示されます)、この SO answerを確認してください。
while() ループの回避
while ループを使用して何かをチェックすることは、通常は推奨されません。ブラウザがハングするJavaScript スレッドに他のことをさせることはありません (最近のすべてのブラウザはマルチスレッドです。このコミックを参照してください)。
これがChuckの提案です。この解決策ははるかに優れています。
function checkStyle(elem, prop, callback) {
if ( getStyle(elem, prop) !== 'computed' ) {
// see explanation below
window.setTimeout( function() {checkStyle(elem, prop, callback);}, 100 )
} else {
callback()
}
}
これははるかに優れています。関数は 100 ミリ秒ごとに非同期でチェックします (必要に応じてこの値を変更できます)。タイムアウトの設定中の関数のラッピングは、setTimeout()
まだ引数の受け渡しを許可していないため必要でした。
これが役に立ったことを願っています。その他のリンクについては、この投稿のソース コードを参照してください...