「スクロールせずに見える範囲のコンテンツでレンダリングをブロックするCSSを排除する」


153

私はGoogle PageSpeedのインサイトを使用してサイトのパフォーマンスを試し、改善してきましたが、これまでのところ非常に成功していることが証明されています。スクリプトの延期などはうまく機能しまし.ready()た。ページが完全に読み込まれるまでスクリプトを延期する社内バージョンのjQueryがすでにあったため、その特定の関数をインライン化し、完全なスクリプトをページの最後に移動するだけで済みました。それはうまくいきました。

しかし、チェックリストに残っている黄色い点が1つ残っていることに気づきました。「スクロールせずに見えるコンテンツのレンダリングをブロックするCSSを排除する」。

CSSの設定方法は_.css、一般にページ構造に適用されるスタイルを含む、またはサイト全体で1つか2つ以上の場所で使用されるスタイルを含む1つのグローバルファイルを持つことです。ほとんどのページは、(例えば、関連するCSSファイルを持っparty.phpているparty.cssその特定のページへのスタイルの特定を含みます)。すべてのCSSファイルは無期限にキャッシュされます。ファイル/t=FILEMTIMEが変更されたときにファイルが確実に更新されるようにするために、ファイル名に追加します(後で.htaccessで削除します)。

とにかく、Googleはスクロールせずに見える範囲のコンテンツに必要な重要なスタイルをインライン化することをお勧めします。問題は...まあ、このスクリーンショットを見てください:http : //prntscr.com/1qt49e

ご覧のとおり... コンテンツはすべてスクロールせずに見える範囲にあります。特に多くのページをロードする必要があるゲームでは、人々はスクロールを嫌います。そこで、私は1つの画面に収まるようにサイトを設計しました(十分な解像度がある場合)。つまり、すべてのスタイルがスクロールせずに見えるコンテンツに適用されます。それで...解決策はありますか?それとも、ほぼ完璧なスコアに黄色のマークが付いたままですか?


皮肉なことに、スクリーンショットのスクロールせずに見えるコンテンツのロードに時間がかかります:)実際、私にとって、スクリーンショットは最終的にロードされませんでした
Anupam

@Anupamはおそらく削除されました。Prntscrは正確に永続のために意図されていない、と私はこの質問をすることを期待していなかった、非常に人気。
Niet the Dark Absol

はい、すべて良かったです。軽いコメントでした
Anupam 2018年

回答:


182

以前に関連する質問がありました。GooglePagespeedの「スクロールせずに見えるコンテンツ」とは何ですか。

まず、これはすべて「モバイルページ」に関するものであることに注意する必要があります。
だから私があなたの質問とスクリーンショットを正しく解釈したとき、これはあなたのサイトではありません!

逆に、Googleのガイドラインで助言されていることの一部を実行すると、「通常の」Webサイトの場合よりも事態が悪化します。
そして、グーグルから来るすべてが「聖杯」であるとは限らない。また、HTMLマークアップを見ると、それら自体は良いロールモデルではありません。

私があなたに与えることができる最高のアドバイスは:

  • CSSで置き換えられた要素の幅と高さを設定すると、ブラウザーが要素をレイアウトでき、置き換えられたコンテンツを待つ必要がなくなります。

さらに、なぜ1つではなく、さまざまなCSSファイルを使用するのですか?
追加のリクエストは、少量のデータ量よりも悪いです。そして、最初のリクエストの後、CSSファイルはとにかくキャッシュされます。

常に注意すべきことは次のとおりです。

  • リクエストの数をできるだけ減らします
  • 全体的なページの重みをできるだけ低く保つ

そして、GoogleのPageSpeed Insightsツールを100%取得する方法について頭を悩ませないでください...!;-)

補足1:Googleが表示するページは、CSS配信の最適化に推奨されるものです。

前に述べたように、これは現実的でも、「通常の」ウェブサイトにとって意味があるとも思いません!主にレスポンシブWebデザインがある場合、メディアクエリやその他のレイアウトスタイルを使用することが最も確実だからです。したがって、CSSを最初にロードしない場合は、ブロックしてFOUTFlash Of Unstyled Text)を取得します。私はこれがページをレンダリングするために少なくとも数ミリ秒以上「良い」とは本当に信じていません!

Imho Googleが新しい "誇大広告"を開始しています(Stackoverflowでこの問題に関するすべての質問を確認したとき)...!


9
すばらしい答えです。問題は、遅いページがあると、グーグルがあなたに不利益を与えるように見えることです。それゆえ、彼らはあなたが彼らのアイデアをそれが素晴らしくても全く愚かであっても固執することを強制します。:(
スティーブHorvath 2014年

10
@NetsurferがGoogleから来るものはすべて「聖杯」の大爆笑ではありません。私は100を達成するために頭を悩ませていましたが、このコメントを読んだ後、92で止まりました。
2014年


2
Wikipediaの「HTTP / 2とSPDY の最初のドラフト(SPDYのコピーでした)での追加のパフォーマンス改善は、ヘッドとヘッドを回避するための要求と応答の多重化によるものです。 HTTP 1(HTTPパイプラインが使用されている場合でも)、ヘッダー圧縮、および要求の優先順位付けにおける行ブロックの問題。」
RationalDevはGoFundMonicaを気に入っています。2015

3
72のモバイルと80のデスクトップから私のページを取得しようとしましたが、同じ問題がありました。私はcssをどこかに低くすることを拒否し、FOUTを表示することでユーザーエクスペリエンスを低下させる可能性があります!
publicknowledge 2016

14

Google Page Speedで99/100を獲得した方法(モバイル用)

TLDR:cssスクリプト全体を圧縮して<style></style>タグの間に埋め込みます。


私は今、そのとらえどころのない100/100スコアを約1週間追跡してきました。あなたと同じように、最後に残った項目は、「スクロールせずに見える範囲のコンテンツのレンダリングをブロックするCSS」を削除することでした。

きっと簡単な解決法はありますか?いいえ。フィラメントグループのloadCSSソリューションを試してみました。好みに合わせて.jsが多すぎます。

asynccss(jsなど)の属性はどうですか?それらは存在しません。

私はあきらめる準備ができていました。それからそれは私に夜明けしました。場合はリンクスクリプトは、私が代わりに代わりに頭の中で私の全体のCSSを組み込み何場合は、レンダリングのブロッキングました。そのようにブロックするものは何もありませんでした。

私のスタイルタグに1263行のCSSを埋め込むのはまったく間違っているように見えました。しかし、私はそれを振り回しました。私は最初にそれを使ってそれを圧縮しました(そしてそれにプレフィックスを付けました):

postcss -u autoprefixer --autoprefixer.browsers 'last 2 versions' -u cssnano --cssnano.autoprefixer false *.css -d min/ NPM postcssパッケージを参照してください

これは、スペースのないcssの1つの長い行に過ぎませんでした。ホームページの<style>your;great-wall-of-china-long;css;here</style>タグにcssを追加しました。次に、ページ速度の洞察で再分析しました。

モバイルで90/100から99/100になりました!!!

これは私(そしておそらくあなた)のすべてに反します。しかし、それは問題を解決しました。私は今のところ、私のホームページでそれを使用しており、PHPインクルードを介してプログラムで圧縮されたCSSを含めています。

YMMV(マイレージは異なる場合があります)は、CSSの長さによって異なります。Googleは、スクロールせずに見える範囲のコンテンツを表示しすぎている可能性があります。しかし、想定しないでください。テスト!

ノート

  1. 今のところ、これは私のホームページでのみ行っているので、人々は私の最も重要なページでFASTレンダリングを取得します。

  2. あなたのCSSはキャッシュされません。私も心配していません。彼らが私のサイトの別のページにヒットした2番目に、.css キャッシュされます(注1を参照)。


4
あなたの献身と研究をありがとう、しかし私は個人的にそれをすることを夢見ません:D
ニート・ザ・ダーク・アブソル

2
では、何の助けにもならないスコアを達成しようとすることを除いて、ポイントは何ですか?
LarryBud 2017

きちんとスコアが上がりましたが、サイトの各ページの重みが増しています。それでも、良い発見。
EdwardM 2017

@EdwardMありがとう!ポストの私のノート2を参照してください。2ページ目にヒットすると、CSSがキャッシュされ、体重の問題は解消されます。
elbowlobstercowstand 2017

1
@LarryBud高得点のポイント?私のためのより多くのお金。私のウェブサイトがGoogleの上位にあるほど、誰かがクリックして顧客になる可能性が高くなります。ので、Googleがランキングを決定するためにページの速度を使用して、私は自分のスコアを向上させることにしました。
elbowlobstercowstand 2017

9

役立つかもしれないいくつかのヒント:

  • 私は昨日のCSS最適化でこの記事に出くわしました: ...最適化
    ためのCSSプロファイリングCSSに関する多くの有用な情報と、CSSが最もパフォーマンスの低下を引き起こしているもの。

  • Googe Chrome(Canary)Dev Toolsの "hidden secrets"に関するjQueryUKに関する次のプレゼンテーションを見ました 。DevToolsはそれを行うことができますTime to First Paint、再ペイント、およびコストのかかるCSS に関するセクションを確認してください。

  • また、requireJSのようなローダーを使用している場合は、require-CSSと呼ばれるCSSローダープラグインの1つを確認できます。このプラグインは、CSSOを使用します。同じプロパティを持つブロックをマージします。私はそれを数回使用し、ケースごとにかなりのCSSを節約できます。

質問から:ロードしているすべての小さなアイコン用のスプライトを作成する@Enzinoの2番目です。ファイルサイズが非常に小さいため、各アイコンのサーバーラウンドトリップは実際には保証されません。また、ブラウザが実行できる同時HTTPリクエストの総数も覚えておいてください。したがって、多数の小さなアイコンのリクエストも「レンダリングのブロック」になります。空のページはあなたのものと比較しますが、たとえばduckduckgoのロード方法が好きです。


duckduckgoもページのスコアを気にしていないようです。ここを
チェタバハナ2015

6

次のページhttps://varvy.com/pagespeed/render-blocking-css.htmlをご覧ください。これにより、「レンダリングブロッキングCSS」を取り除くことができました。「Render Blocking CSS」を削除するために、次のコードを使用しました。今Googleページの速度の洞察では、レンダリングブロッキングCSSに関連する問題が発生していません。

<!-- loadCSS -->
<script src="https://cdn.rawgit.com/filamentgroup/loadCSS/6b637fe0/src/cssrelpreload.js"></script>
<script src="https://cdn.rawgit.com/filamentgroup/loadCSS/6b637fe0/src/loadCSS.js"></script>
<script src="https://cdn.rawgit.com/filamentgroup/loadCSS/6b637fe0/src/onloadCSS.js"></script>
<script>
      /*!
      loadCSS: load a CSS file asynchronously.
      */
      function loadCSS(href){
        var ss = window.document.createElement('link'),
            ref = window.document.getElementsByTagName('head')[0];

        ss.rel = 'stylesheet';
        ss.href = href;

        // temporarily, set media to something non-matching to ensure it'll
        // fetch without blocking render
        ss.media = 'only x';

        ref.parentNode.insertBefore(ss, ref);

        setTimeout( function(){
          // set media back to `all` so that the stylesheet applies once it loads
          ss.media = 'all';
        },0);
      }
      loadCSS('styles.css');
    </script>
    <noscript>
      <!-- Let's not assume anything -->
      <link rel="stylesheet" href="styles.css">
    </noscript>

1
上記の関数を使用すると、pageSpeedスコアが低下します。私が書いた関数は、jsfiddle.net / kvfzbxxo です。
arsho

私は次のURLに同じ関数を実装しました。ここで速度を確認してください。 " whitecashback.in "ソースURLを見て、フッターで関数 "loadCSS"を見つけることができます。これは、コードをどのように実装したかを理解するのに役立ちます。CSSがページの後に読み込まれると、ページ速度が向上するはずです。
Amuk Saxena

私はこのコードを使用しました:jsfiddle.net/sbpa1hun .CSSがWebサイトに読み込まれていません。
arsho

私はこのコードを追加した後、あなたのウェブサイトで使用されているjsfiddle.net/sbpa1hunを追加したところ、私のウェブサイトはすべてのスタイルを失いました。ページの速度は上がりますが、CSSは機能しなくなります。どうすれば手伝ってくれますか?ページ速度が40前後になりました。しかし、コードを追加すると70前後になりますが、CSSを機能させることができませんでした。
arsho

1
jsfiddleでこれを実行しようとすると、これは機能しません。Webサイトでこのコードを試してください。jsfiddleは、外部Webサイトのcssのロードをブロックします。あなたはJavaScriptを使用して外部ソースのCSSをロードしているからです。だからあなたのウェブサイトでこれをやってみてください。また、jqueryファイルを含めてみてください。それらはスクリプトにありません。jsファイルを含めた後、これは機能する可能性があります。また、httpsサイトはjsfiddleで動作する可能性があることに注意してください。このエラーが発生しています:「混合アクティブコンテンツのブロックされた読み込み」。最初にこれを解決する必要があります。
Amuk Saxena

4

私もこの新しいpagespeedメトリックと格闘しました。

スコアを%100に戻す実用的な方法は見つけられませんでしたが、役立つことがいくつかあります。

すべてのcssを1つのファイルに結合すると、非常に役立ちます。私のサイトはすべて%95-%98に戻っています。

私が考えることができる他の唯一のことは、甘い高得点を得るために最初のページにすべての必要なcss(それはほとんどそれのように見えます-少なくとも私のページ)をインライン化することでした。それはあなたのスピードスコアに役立つかもしれませんが、これはおそらくあなたのページのロードを遅くするでしょう。


2
スマッシングマガジンはPageSpeedの試験において100%のスコアを有するdevelopers.google.com/speed/pagespeed/insights/...
ミズーリ州

1

これに対する2019年の最適なソリューションは、HTTP / 2サーバープッシュです。

ハックなJavaScriptソリューションやインラインスタイルは必要ありません。ただし、HTTP 2.0をサポートするサーバー(最新のサーバーバージョンはすべてサポート)が必要です。このサーバー自体は、サーバーでSSLを実行する必要があります。ただし、Let's Encryptを使用すると、SSLを使用しない理由はありません。

私のサイトhttps://r.je/には、モバイルとデスクトップの両方で100/100のスコアがあります。

これらのエラーの理由は、ブラウザがHTMLを取得し、ページがレンダリングされる前にCSSがダウンロードされるのを待つ必要があるためです。HTTP2を使用すると、HTMLとCSSの両方を同時に送信できます。

Linkヘッダーを設定することで、HTTP / 2プッシュを使用できます。

Apacheの例(.htaccess):

Header add Link "</style.css>; as=style; rel=preload, </font.css>; as=style; rel=preload"

NGINXの場合、サーバー構成のロケーションタグにヘッダーを追加できます。

location = / {
    add_header Link "</style.css>; as=style; rel=preload, </font.css>; as=style; rel=preload";
}

このヘッダーを設定すると、ブラウザーはHTMLとCSSを同時に受信し、CSSがレンダリングをブロックするのを防ぎます。

CSSが最初のリクエストでのみ送信されるように微調整する必要がありますが、リンクヘッダーは「レンダリングブロッキングJavascriptとCSSを排除する」ための最も完全で最もハッキングの少ないソリューションです

詳細については、私の投稿をご覧ください。HTTP/ 2プッシュを使用してレンダリングブロッキングCSSを削除します。


私は誤解しているかもしれませんが、サーバープッシュによって、CSSがキャッシュされる前に1回だけ送信されるのではなく、ページをロードするたびに送信されるのではないでしょうか?
Niet the Dark Absol

はい、それを回避するのに役立つクッキーのようないくつかのテクニックがあります。ここを選択的にプッシュすることに関するセクションをご覧ください:nginx.com/blog/nginx-1-13-9-http2-server-push
Tom B


-1

jQueryのこんにちはあなたはこのようにしか使用できません

asyncとtype = "text / javascript"のみを使用してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.