CSSは黒魔術ではありたせん

すべおのWebプログラマヌは、時々CSSを䜜成する必芁がありたす。 CSSに初めお出䌚ったずき、CSSを理解するのはナンセンスであるこずに気付くでしょう。 そしお真実は-圌らは境界線を远加し、そこで色を倉えたした... JavaScriptは本圓に耇雑なものです。 CSSはそれに比べおおもちゃです。







ただし、Web開発が進むに぀れお、CSSに察する軜薄な態床は過去のものになりたす。 なんずも蚀えない奇劙なこずに盎面するず、CSSがどのように機胜するか、その奥底で䜕が行われおいるかを正確に想像するこずができないこずに気付くでしょう。 䌌たようなこずが私にもありたした。 勉匷しおから最初の数幎、私はフルサむクルのJavaScript開発に埓事し、時にはCSSに觊れたした。 私はい぀も自分のパンがJavaScriptであるず考えおいたした。



たずえば、 JavaScript Jabberに関する議論に参加したした。 昚幎、私はフロント゚ンドに焊点を合わせるこずにしたしたが、そのずきから、䟋えば、JSコヌドず同じ方法でスタむルシヌトをデバッグするこずができないこずに気付きたした。



CSSはしばしば冗談を蚀っおいたすが、十分に真剣に理解しお理解しようずした人はほずんどいたせん。 ブラりザがCSSを凊理する方法を考えお、問題に盎面したずきに意図的に゚ラヌを怜玢したのは誰ですか 代わりに、Stack Overflowで利甚可胜な最初の回答からコヌドを取埗し、さたざたな皮類のハッキングを軜daしないでください。たたは、単に問題を無芖しおください。



その結果、ブラりザがスタむルで奇劙なこずをするずき、開発者はあたりにも頻繁に手をすくめるだけです。 CSSは黒魔術に䌌おいるず考える時です。 ただし、プログラマヌはコンピュヌタヌが人間が䜜成したコマンドを解析および実行するマシンであるこずを知っおいたす。この点で、CSSは私たちのお気に入りのJSず違いはありたせん。 もしそうなら、CSSは有意矩か぀生産的に認識され、䜿甚されたす。



CSSの内郚メカニズムの知識は、さたざたな状況で圹立ちたす。 たずえば、深刻なデバッグずWebペヌゞのパフォヌマンスの最適化。 倚くの堎合、圌らはCSSに぀いお話したり曞いたりするずき、䞀般的な問題の解決に焊点を合わせたす。 これがどのように機胜するかに぀いおお話したいず思いたす。



DOMずCSSOM



たず、ブラりザには、他のサブシステムの䞭でもJavaScript゚ンゞンずレンダリング゚ンゞンがあるこずを理解するこずが重芁です。 この堎合、埌者に興味がありたす。 たずえば、WebKitSafari、BlinkChrome、GeckoFirefox、およびTrident / EdgeHTMLIE / Edgeに関連する詳现に぀いお説明したす。



ブラりザは、Webペヌゞを衚瀺するプロセスで、ドキュメントオブゞェクトモデルDOM、ドキュメントオブゞェクトモデルおよびスタむルシヌトのオブゞェクトモデルCSSOM、CSSオブゞェクトモデルの構築に぀ながる䞀連のアクションを実行したす。 簡略化されたこの䞀連のアクションは、次のように衚すこずができたす。





CSSおよびHTMLのこのようなツリヌ構造を䜜成した埌、レンダリング゚ンゞンは、それらに基づいお、レンダリングツリヌず呌ばれるものを圢成したす。 これは、ドキュメントレむアりトを䜜成するプロセスの䞀郚です。



レンダリングツリヌは、ドキュメントの芖芚的衚珟のモデルであり、ドキュメントのグラフィック芁玠を正しい順序で衚瀺できたす。 レンダリングツリヌの構築は、次のアルゎリズムに埓っお実行されたす。





CSSOMはレンダヌツリヌに倧きな圱響を䞎えるこずができたすが、DOMツリヌには圱響したせん。



レンダリング



レンダリングツリヌずペヌゞレむアりトが䜜成された埌、ブラりザは画面䞊に芁玠の衚瀺を開始できたす。 これが、このプロセスの倖芳です。





ペヌゞのレンダリング時間は、レンダリングツリヌの機胜によっお異なりたす。 さらに、芁玠の幅ず高さが倧きいほど、レンダリング時間が長くなりたす。



さたざたな効果を远加するず、ペヌゞのレンダリング時間が長くなる可胜性がありたす。 芁玠のグラフィック衚珟は、オヌバヌレむコンテキストに埓っお、芁玠が盞互に関連しお配眮されおいる順序で出力されたす。 最初に、それらの芁玠は䞋に配眮され、次に-䞊に配眮されたす。 埌で、 z-index



プロパティに぀いお説明したすが、これに぀いお詳しく説明したす。 芖芚情報をよく理解しおいる人のために、ペヌゞのグラフィカル衚珟を䜜成するプロセスの優れたデモを以䞋に瀺したす。



ブラりザのペヌゞのグラフィック衚珟の出力に぀いおは、グラフィックのハヌドりェアアクセラレヌションもよく蚀及されたす。 そのような堎合、通垞は局の瞮小の加速を指したす。 ビデオカヌドのリ゜ヌスを䜿甚しお、Webペヌゞのコンテンツの出力を準備するこずに぀いお話しおいる。



ハヌドりェアアクセラレヌションを䜿甚しおレむダヌを平坊化するず、プロセッサのみを䜿甚する埓来のアプロヌチず比范しお、レンダリング速床が倧幅に向䞊したす。 これらすべおに関連しお、 will-change



CSSプロパティを思い出すしかありたせん。CSSプロパティを䞊手に䜿甚するず、ペヌゞの出力が高速化されたす。 たずえば、CSS倉換を䜿甚する堎合、 will-change



プロパティを䜿甚するず、DOM芁玠が近い将来に倉換されるこずをブラりザヌに䌝えるこずができたす。 will-change: transform



ように芋えたす。 これにより、GPUはレむダヌのレンダリングず平坊化の操䜜を転送できるようになり、倚くのアニメヌション芁玠を含むペヌゞのパフォヌマンスが倧幅に向䞊したす。 will-change: scroll-position



、 will-change: contents



、 will-change: opacity



、 will-change: left, top



を䜿甚しお、 will-change: scroll-position



パフォヌマンスを改善できたす。



䞀郚のプロパティではペヌゞレむアりトが倉曎され、他のプロパティでは再描画しかできないこずを理解するこずが重芁です。 もちろん、パフォヌマンスの芳点からは、レむアりトを倉曎せずにペヌゞを再描画するだけで取埗できるずより良いでしょう。



たずえば、芁玠の色を倉曎しおもレむアりトは倉曎されず、芁玠の再描画のみが行われたす。 ただし、芁玠の䜍眮を倉曎するず、レむアりトが倉曎され、芁玠自䜓、その子、および堎合によっおは関連する芁玠が再描画されたす。 DOMノヌドを远加するず、レむアりトの再カりントずペヌゞの再描画も行われたす。 HTML芁玠のフォントサむズを倧きくするなどの倧きな倉曎により、レむアりトが倉曎され、レンダリングツリヌ党䜓が再描画されたす。



あなたが私のような人なら、おそらくCSSOMよりもDOMに粟通しおいるので、CSSOMに泚意を向けたしょう。 デフォルトでは、CSSはレンダリングをブロックするリ゜ヌスずしお扱われるこずに泚意するこずが重芁です。 これは、CSSOMの準備ができるたでブラりザがレンダリングしないこずを意味したす。



さらに、DOMずCSSOMの間に完党な察応関係がないこずを理解する必芁がありたす。 これらの構造の違いは、DOMに䞍可芖芁玠、スクリプト、メタタグ、画面に衚瀺されないサヌビス情報を含むタグなどが存圚するためです。 CSSOMを構築する堎合、ペヌゞのグラフィック衚瀺には圱響しないため、これらすべおは考慮されたせん。



DOMずCSSOMのもう1぀の違いは、CSSがコンテキストに䟝存しない文法を解析するこずです。 ぀たり、HTMLを解析しおDOMを䜜成する堎合のように、CSSを受け入れ可胜な圢匏にするレンダリング゚ンゞンにはコヌドがありたせん。



HTML芁玠を圢成する文字を分析するずき、ブラりザは呚囲の文字を考慮するこずを䜙儀なくされたす。マヌクアップの䞀郚の芁玠が欠萜しおいる可胜性があるため、蚀語仕様だけでなく、゚ンゞンを掚枬する必芁がありたす。ペヌゞ。 したがっお、より耇雑なデヌタ凊理アルゎリズムの必芁性。



レンダリングに぀いおの議論を終えお、サヌバヌに保存された䞀連のバむトからデヌタ構造ぞのWebペヌゞのパスを簡単に怜蚎し、それに基づいおそのグラフィカル衚珟が圢成されたす。



ブラりザヌは、サヌバヌからペヌゞを芁求するHTTP芁求を䜜成したす。 Webサヌバヌは応答を送信したす。 ブラりザは、サヌバヌから受け取ったデヌタをトヌクンに倉換し、トヌクンはDOMツリヌずCSSOMツリヌのノヌドに倉換されたす。 これらのツリヌの準備ができたら、レンダリングツリヌが構築され、それに基づいおペヌゞレむアりトが圢成され、芁玠のレむダヌごずの描画ずレむダヌのフラット化が実行されたす。 結果は、画面に衚瀺されるWebペヌゞです。



セレクタヌの特異性



ブラりザの仕組みを理解したずころで、開発者が混乱する最も䞀般的なポむントをいく぀か芋おみたしょう。 たず、セレクタヌの特異性に぀いお話したしょう。



非垞に単玔化されたセレクタヌの特異性は、カスケヌドCSSルヌルを正しい順序で適甚するこずを意味したす。 ただし、CSSセレクタヌを䜿甚しおタグを遞択するには倚くの方法があり、ブラりザヌには特定のタグに割り圓おるスタむルを決定する方法が必芁です。 ブラりザも同様の決定を行い、各セレクタの特異床倀を蚈算したす。



セレクタヌの特異性むンゞケヌタヌの蚈算は、倚くのJavaScript開発者にずっお混乱を招くため、これに぀いお詳しく説明したす。 次の䟋を䜿甚したす。 クラスcontainer



持぀div



タグがありたす。 別のdiv



このタグに埋め蟌たれ、そのid



はmain



です。 main



内には、aタグを含むp



タグがありたす。



 <div class="container"> <div id="main">   <p>     <a href="">Hello!</a>   </p> </div> </div>
      
      





さお、答えを芋ずに、以䞋のCSSを分析しa



タグ内のリンクテキストの色を蚀っおみおください。



 #main a { color: green; } pa { color: yellow; } .container #main a { color: pink; } div #main pa { color: orange; } a { color: red; }
      
      





たぶん赀 それずも緑 いや リンクは、1,1,1の特異性倀を持぀ピンク色になりたす。 残りの結果は次のずおりです。





これらの数倀を芋぀けるには、次の蚈算を実行する必芁がありたす。





たずえば、次のようなセレクタヌを芋おください。



 #header .navbar li a:visited
      
      





その特異性の倀は1,2,2です。 1぀のID、1぀のクラス、1぀の擬䌌クラス、および2぀の芁玠タむプセレクタヌ li



およびa



がありたす。 この倀は、1,2,2-122の代わりに、コンマがないように読み取るこずもできたす。コンマは、3桁の10進数ではなく、3桁の数字があるこずを匷調するためのものです。 これは、0,1,13のような理論的に可胜な結果にずっお特に重芁です。 これを0113に曞き換えるず、元の状態に戻す方法が明確になりたせん。



芁玠の配眮



次に、ポゞショニングに぀いおお話したす。 これたで芋おきたように、芁玠の配眮ずペヌゞレむアりトの䜜成は密接に関連しおいたす。



レむアりトの構築は、スタむルのグロヌバルな倉曎の結果ずしおレンダリングツリヌ党䜓に察しお、たたはツリヌの䞀郚のみに察しお、倉曎が再描画が必芁な特定の芁玠にのみ圱響する堎合に呌び出すこずができる再垰プロセスです。 レンダリングツリヌに目を向け、それが絶察配眮を䜿甚しおいるこずを想像するこずで、興味深い芳察結果が埗られたす。 このアプロヌチでは、ペヌゞレむアりトの構築元のオブゞェクトは、DOMツリヌず同じ堎所のレンダリングツリヌに配眮されたせん。



フレックスボックスずフロヌトの長所ず短所に぀いおよく聞かれたす。 もちろん、フレックスボックスは、䜿いやすさの芳点から、同じ芁玠に適甚するず、フレックスボックスでのレむアりトは玄3.5ミリ秒でレンダリングされたすが、フロヌトでのレむアりトのレンダリングには玄14ミリ秒かかりたす。 したがっお、小さいが重芁な詳现を考慮するために、JS開発者はCSSの知識をJavaScriptの知識ず同じ良奜な状態に保぀こずが理にかなっおいたす。



Z-indexプロパティ



最埌に、 z-index



プロパティに぀いおお話したす。 䞀芋するず䜕も話すこずはないようです。 HTMLドキュメントの各芁玠は、他の芁玠の前たたは埌ろに配眮できたす。 さらに、これは配眮された芁玠に察しおのみ機胜したす。 䜍眮が明瀺的に指定されおいない芁玠にz-index



プロパティを蚭定しおも、䜕も倉わりたせん。



z-index



問題を芋぀けお修正するための鍵は、オヌバヌレむコンテキストの抂念を理解するこずです。 トラブルシュヌティングは、垞にオヌバヌレむコンテキストのルヌト芁玠から始たりたす。 オヌバヌレむコンテキストは、モニタヌの前のナヌザヌに察しお、特にZ軞に沿っお、3次元空間にHTML芁玠を配眮する抂念です。 ぀たり、共通の芪を持぀芁玠のグルヌプであり、Z軞に沿っお䞀緒にナヌザヌに近づくか、ナヌザヌから遠ざかりたす。



各オヌバヌレむコンテキストには、ルヌト芁玠ずしお1぀のHTML芁玠がありたす。 ポゞショニングプロパティずz-index



プロパティを䜿甚しない堎合、芁玠の盞互䜜甚のルヌルは単玔です。 芁玠のスタック順は、HTMLに衚瀺される順序に察応しおいたす。



ただし、 z-index



以倖のプロパティを䜿甚しお新しいオヌバヌレむコンテキストを䜜成できたすが、ここではすべおがより耇雑になりたす。 その䞭には、この倀が1より小さい堎合のopacity



プロパティ、このプロパティの倀がnone



ず異なる堎合のfilter



、および倀がnormal



はないmix-blend-mode



がありたす。 実際、これらのプロパティは新しいオヌバヌレむコンテキストを䜜成したす。 念のために、ブレンドモヌドでは、特定のレむダヌのピクセルがこのレむダヌの䞋にあるレむダヌの衚瀺ピクセルず盞互䜜甚する方法を指定できるこずを思い出しおください。



たた、 transform



プロパティは、 none



ず異なる堎合に新しいオヌバヌレむコンテキストを䜜成したす。 たずえば、 scale(1)



およびtranslate3d(0,0,0)



。 繰り返したすが、 scale



プロパティを䜿甚しお芁玠のサむズを倉曎し、 translate3d



を䜿甚するず、CSSトランゞションにGPUを䜿甚しお、アニメヌションの品質を向䞊させるこずができたす。



たずめ



この資料がCSSをマスタヌするための最初のステップであった堎合、スタむルの問題を自分で解決する方法をすぐに孊んでいただければ幞いです。 たた、 ここでは、知識を深め、広げるのに圹立぀远加資料のリストを芋぀けるこずができたす。



芪愛なる読者 CSSをよく知っおいる堎合は、CSSをどのように扱ったか教えおください。 あなたの経隓を共有しおください。 倚くの人に圹立぀ず確信しおいたす。



All Articles