サイトのCLSがJavaScriptで後から挿入するコンテンツによって上昇するのを防ぐにはどうするか 結城永人 -2023年2月25日 サイトのHTMLに最初から記載されてないコンテンツを後からJavaScriptで挿入するとそのときにページが新しいスペースを取られて動いてしまう。初回画面だと既存のコンテンツが押し下げられるのが、一瞬、見えたりもするけど、これがサイトのCLS(Cumulative Layout Shift/累積的な配置の変動)を上げて使い難くなる。 指標|PageSpeed Insights|Google Developers 良くあるのが押そうとしたボタンがサイトの読み込み中に動いて押せなくなってしまうことだ。 訪問者に良い印象を与えないのはもちろんだけど、さらにGoogleのサイトの検索状況のSearch Consoleや性能計測のPageSpeed Insightsでも警告が出されるので、検索エンジンからアクセスアップを望む上でもCLSの上昇に注意しなくてはならない。 普通の回避策としては新しいコンテンツのscriptタグを挿入する位置かその後の近くに置いて直ぐに開始するようにしておくのが良いと思う。表示の時間差があるからCLSの上昇を完全に免れることはできないにせよ、ページが明らかに動くと分かったり、Googleから警告を出されるような害は相当に減らせるという方法になる。 CLSの上昇を完全に免れるには三つの方法が考えられる。 次のコンテンツを上の外側の余白で最初から下げておく挿入するコンテンツのスペースを最初から確保しておく挿入するコンテンツと他のコンテンツを一緒に表示する 三つの方法についてどのように行うかを取り上げる。 次のコンテンツを上の外側の余白で最初から下げておく 挿入されるコンテンツの次のコンテンツの上の外側の余白を十分に取って予め下げておくと後からページが動かされることはない。 次のコンテンツにCSSで、「margin-top:上の外側の余白」を付けておく。 上の外側の余白は挿入されるコンテンツの高さが分かっていればそれで足りるけど、しかし可変的で一律でないとか分からなければ「100vh」で画面の高さになるから最も確実にCLSの上昇は防げる。CLSの上昇は画面内のパフォーマンスの問題だから画面内に押し下げられるコンテンツがなければ大丈夫なんだ。 p.nextの上の外側の余白を画面の高さで指定するならば p.next {margin-top:100vh} そのままにしておくと挿入されたコンテンツと次のコンテンツの間に余分なスペースが残ってしまうから消すためのプログラムを目次が挿入された後に追加する。 JavaScriptでCSSを書き換える方法は幾つかあるけれども個別のstyleプロパティの上の外側の余白の「style.marginTop」を使うと、直接、CSSのインラインstyleを上書きするから他のところの指定の影響を余り受けないから楽に使えると思う。 p.nextの上の外側の余白を元に戻すならば document.querySelector("p.next").style.marginTop = ""; その他に上の外側の余白を指定したclassをCSSに用意して次のコンテンツに付けておいてclassListプロパティのremove()メソッドで外すこともできる。 document.querySelector("p.next").classList.remove("次のコンテンツの上の外側の余白のために付けたクラス名"); 次のコンテンツの上の外側の余白を付けて新しいコンテンツの高さが不明ならば挿入された時点で消すという方法がCLSの上昇を防ぐには欠点も手間も少ないと思う。 関連ページCSSはどう使えば良いのか|タグ自体とidとclassの指定先とstyleタグとインラインの記述法 挿入するコンテンツのスペースを最初から確保しておく 挿入されるコンテンツの高さを親ボックスで必要なスペースとして指定して次のコンテンツを予め下げておくと後からページが動かされることはない。 挿入するコンテンツの位置にdivタグなどの親ボックスを配置した上で、CSSで、「height:高さ」を付けておく。 親ボックスの高さは挿入するコンテンツの高さが分かっていればそれで足りるけど、しかし可変的で一律でないとか分からなければ「100vh」で画面の高さになるから最も確実にCLSの上昇は防げる。CLSの上昇は画面内のパフォーマンスの問題だから画面内に押し下げられるコンテンツがなければ大丈夫なんだ。 div.boxの高さを画面の高さで指定するならば div.box {height:100vh} 確保したスペースが挿入されるコンテンツの高さと一致していなければそのままにしておくと次のコンテンツとの間に余分なスペースが残ってしまうから消すためのプログラムを目次が挿入された後に追加する。 JavaScriptでCSSを書き換える方法は幾つかあるけれども個別のstyleプロパティの高さの「style.height」を使うと、直接、CSSのインラインstyleを上書きするから他のところの指定の影響を余り受けずに楽に使えると思う。 div.boxの高さを元に戻すならば document.querySelector("div.box").style.height = ""; その他に上の外側の余白を指定したclassをCSSに用意して次のコンテンツに付けておいてclassListプロパティのremove()メソッドで外すこともできる。 document.querySelector("div.box").classList.remove("親ボックス高さのための付けたクラス名"); 挿入するコンテンツの親ボックスでスペースを取って新しいコンテンツの高さが不明ならば入った時点で消すという方法は親ボックスをHTMLで記載する必要があるから手間が増えるけれども最初から親ボックスに入れるような仕方で表示するならば逆にぴったりだろう。 関連ページCSSはどう使えば良いのか|タグ自体とidとclassの指定先とstyleタグとインラインの記述法 挿入するコンテンツと他のコンテンツを一緒に表示する ページに新しいコンテンツを後から挿入しなければ既存のコンテンツが余計に動かされることはないので、変更部分のコンテンツを、一旦、止めておいて挿入するコンテンツと他のコンテンツを一緒に表示しても良いと思う。 僕がBloggerの投稿画像の遅延読み込みや軽量化で、使った方法だけれども既存のコンテンツをnoscriptタグで、一旦、止めておいて新しいコンテンツを挿入したらnoscriptタグの中身だけ取り出すようにする。 noscript内を編集して表示するプログラムの流れ // noscript要素の親ボックス(div.box)を取得する const pn = document.querySelector("div.box"); // noscript要素(noscript.content)を取得する const ns = document.querySelector("noscript.content"); // 取得したnoscript要素の親要素の中身以外を複製する const nns = pn.cloneNode(false); // 新しい親ボックス(複製)にnoscript要素の中身だけ入れる nns.insertAdjacentHTML("afterend", ns.textContent); // 新しい親ボックス(複製)に新しいコンテンツを挿入する nns.insertAdjacentHTML("afterend","新しいコンテンツ"); // 新しい親ボックスを元の親ボックスと入れ替えて全てのコンテンツを表示する pn.parentElement.replaceChild(nns, ns); noscript内のコンテンツはそのままではHTML要素として扱えないので、複製した親ボックスに新しく入れ替えたり、操作が普通よりも少し増えるものの不可能ではない。 挿入するコンテンツと既存のコンテンツを一緒に表示するという方法はCLSの上昇をサイトのデザインを全く崩さずに回避できるところが優れているけど、ただし変更部分のコンテンツを、一旦、止めるからページの表示速度が僅かでも下がるのは間違いない。 通常はやり過ぎみたいな感じなので、考える必要もないとはいえ、余程の利点が他に加わったりすれば敢えてやってみても面白い。 CSSの二つの回避策、挿入するコンテンツの次のコンテンツを最初から下げておく方法が一般的に使い易いけれども方法としての難点は場合分けができないことだ。 CLSの上昇を防ぎたいのは画面内のコンテンツだけだとしてもそうした条件を付けて指定できるCSSはない。ある要素の全ての場合が含まれざるを得ないから不要ならば無駄になるというか、保険をかけるような感じで、使わなくてはならない。 コメント 新しい投稿 前の投稿
イヤーワームという頭の中で音楽が勝手に流れる現象を引き起こすストレスを反省 以前から頭の中で音楽が勝手に流れることが良くあって近頃でもブログで取り上げたばかりの モーツァルトの幻想曲K.397 や K.375 や ribbonの Virgin Snow などを体験していた。いつも好きな曲ばかりで鼻歌を伴って喜ばしい気持ちになるし、好調の証のように捉えてい...
芦名星のたぶん本当の死因 芦名星は自殺した。その前後、 三浦春馬と竹内結子の自宅のクローゼットでの首吊りという同じ仕方での連続自殺 があり、他殺の陰謀論も思い浮かぶけど、しかし違うのではないか。今の 日本の芸能界には死にたくなる気持ち悪さがある し、芸能人が裕福な生活でも自殺することはさほど不思議ではない...
幸せの良さはインパクトが物凄く大きいために人々の印象にも残り易いと考える ブログのヘッダーの背景画像を変更した。無料素材の クリスティン・フォークトの写真 を使っている。 Pexelsで見付けるや否や本当に素晴らしく気に入ってしまった A woman in snowflakes by Kristin Vogt / Pexels 雪の中で紺...
アガサ・クリスティの誘拐された総理大臣の日本語訳 十九から二十世紀のイギリスの作家、小説家の アガサ・クリスティ の小説の 誘拐された総理大臣 (1923)の日本語訳を行った。一つの文学作品として人間の洞察力に富んだ優れた内容を持つだけではなく、表現も意義深いから外国語の英語の聞き取りと読み取りの教材としても最適だと感じる。 ...
Imgurで画像URLと埋め込みコードを取得する方法 Imgur は自分でアップロードした画像については画像URL/直リンクを取得して他のサイトにHTMLのimgタグで表示させられる。 そして自分と他の人たちも含めて画像の埋め込みコードを取得して他のサイトのHTMLに、そのまま、記載して表示させられもする。 目次 Img...
俳句の規則:字数と季語と切れ字 概要 俳句の規則 俳句は、十七文字という短い詩の中で、季節を感じさせる言葉(季語)を使い、切れ字で語調を整えて表現する伝統的な日本の文学形式です。 句の基本的な構成要素 字数を十七文字に揃える:俳句は大きく三つの部分に分けられる。上句(かみく)と中句(なかく)...
日常の些細な出来事に触れる幸せの味わいは小さいというイメージが欠かせない 誰にでも分かる些細な日常というと他でもなく、小さな幸せの味わいではないか。 永遠の詩人として本質的な認識に基づく命の尊さを伝え届けなくてはならないと考えるけれどもアクセスアップのためには誰にでも分かる些細な日常のイメージも大事にするべきだろう。 小さな幸せの味わいをどこま...
シソンヌのラーメン屋:とんこつラーメンを臭いラーメンと呼んだコントが好き シソンヌ (お笑い)のラーメン屋のコントが面白かった。とんこつラーメンを臭いラーメンと呼ぶから僕も同じだったと気付いた。 シソンヌのラーメン屋 (Google検索) 否、店によってはそばを通りかかるだけでも堪らないくらい臭いから、一体、何だろうと本当に思わずにはいられなか...
今春に咲き出した桜の花の写真を幾つか撮って来た サイバーショットのW170を使った。七八年前のコンパクトカメラで、 一眼カメラのα5100を買って お役後免の状態に差しかかっているけど、どうするかと考えてしまわざるを得ない。画質としては力強い。画素数が10.1MPで、レンズがカールツァイスということで、写真の風合いが凄いと...
キム・テヒの反日活動を日本人としてどこまで許せるか かつて韓国ドラマの IRIS -アイリス- を観て何て綺麗で可愛くて良いんだと一目で度肝を抜かれた俳優に キム・テヒ がいた。 映画『アイリス -THE LAST-』予告編 by TAEWON ENTERTAINMENT from シネマトゥデイ 日本で放映されたのが2...
コメント