ブラウザの動作原理(5)-レイアウト
렌더러
を生成してツリーに追加した場合、크기
および위치
に関する情報はありません.これらの値を計算したのは배치(layout)
と리플로우(reflow)
です.HTMLは、ストリームベースの
배치(layout) 모델
を使用しており、これは、通常、位置情報を単一パス(single pass)で計算できることを意味する.通常、
흐름
では、後者の要素は前の要素の位置およびサイズに影響を及ぼさないため、配置は좌->우
または위->아래
に進む.HTMLのtable
は、1つ以上のパスが必要であるため、例外的に含まれています.좌표계(coordinate system)
は、上部(top/y)および左側(left/x)座標を使用して、기준점(root frame)
に対する位置を決定する.배치
は、html
から始まる反復的なプロセスであり、HTMLドキュメントのroot 렌더러
要素に相当する.배치
は、フレーム層の一部または全部を繰り返して、렌더러
の크기
または위치
の情報を計算する.root 렌더러
の座標は0,0
であり、ブラウザウィンドウの可視面積と等しい.すべての
렌더러
にはlayout
またはreflow
メソッドがあり、各렌더러
はサブオブジェクトのlayout
メソッドを呼び出します.デュアルビットシステム
簡単な変更でブラウザ全体を再配置しないように、デュアルビットシステムを使用します.変更または追加された
렌더러
は、自分と自分の子供더럽다고
(汚れている=再構成が必要)を表示します.2種類の
flag
を使用します.それぞれ더티
と자식이 더티함
です(レンダラー自体は良いですが、少なくとも1人の子供が再構成する必要があります)グローバル導入とインクリメンタル導入
배치
は、렌더 트리
全体にわたって発生する可能性があり、전역 배치
と呼ばれる.この状況は、次の場合に発生します.렌더러
を変更すると、フォントサイズの変更など、すべての전역 스타일
に影響します.배치
は、더티 렌더러
が導入された場合にのみ점증
となります.さらなる導入が必要なため、損失が発生する可能性があります.점증 배치
は汚れているときは非同期です.例えば、ネットワークから追加のコンテンツを受信し、렌더러
に追加した後、新しいDOM 트리
(ダーティとみなされる)をレンダーツリーに追加する.非同期配置と同期配置
렌더러
非同期で動作점증 배치
は파이어폭스
に점증 배치
命令が積み重ねられており、スケジューラは1回(バッチ)でこの命令を実行することができる.reflow
度웹킷
を実行するタイマーを持ち、ツリーにナビゲートして점증 배치
を配置します.더티 렌더러
などのスタイル情報を要求するスクリプトは、offsetHeight
を同期して実行する.점증 배치
は主に同期して実行される場合によっては、スクロール位置の変化などのいくつかのプロパティのため、最初の配置後、展開は
전역 배치
で実行されます.最適化
callback
がサイズ変更またはレンダラーの位置変更によって実行される場合、배치
のサイズは再計算されず、キャッシュから取得されます.場合によっては、ルートではなくサブツリーのみが変更されます.これは、入力フィールドにテキストを入力するときに発生します.その変化範囲は限られているため、周囲の環境に影響を与えません.入力フィールドの外にテキストが入力されている場合はrootから開始します.
配備プロセス
導入プロセスは主に以下の形式で行われます.
2-1. サブレンダラーの配置(設定
렌더러
、x
)2-2. 必要に応じて、高さ(親と子の汚れ、グローバル展開ステータスなど)を計算するために子展開を呼び出すことができます.
y
および여백(margin)
を使用して、子供の重なりの高さを設定する.親レンダラーの親はこの値패딩(padding)
は、配置(=파이어 폭스
)のパラメータとして상태(state) 객체(=nsHTMLReflowState)
を使用する.ステータスオブジェクトには、親オブジェクトの幅が含まれます.reflow
の導入結果は파이어 폭스
であった.このオブジェクトの計算高さは매트릭스(metrics) 객체(=nsHTMLReflowMetrics)
です.幅の計算
렌더러
の幅は、렌더러
および컨테이너(포함하는 블록)의 너비
として計算される例えば、次の
렌더러의 너비(width), 여백(margin), 경계선(border)
要素がある場合:<div style="width: 30%"/>
div
は以下のように計算される(웹킷
類のRenderBox
方法)容器の幅は
calcWidth
〜0の間の最大値である.この場合、availableWidth
の計算は以下の通りである.availableWidth
clientWidth() - paddingLeft() - paddingRight()
およびclientWidth
は、枠線およびスクロールバーを除く内部領域を表す.要素の幅は
clientHeight
属性の値です.ここで、コンテナ幅のパーセントは絶対値に変換されます.水平(左右)の幅とダウンジャケットの値を追加
ここでは
width
の計算ですが、미리 획득한 너비(clientHeight)
と최소 너비
を計算する必要があります.최대 너비
が最大幅より大きい場合は最大幅が使用され、미리 획득한 너비
が最小幅より小さい場合は(最小単位で除算しない)、最小幅が使用されます.미리 획득한 너비
が必要な場合、これらの値はキャッシュに格納されますが、幅は変わりません.改行(Line Breaking)
배치
が配置中に改行する必要がある場合、렌더러
は停止し、親(伝播)に転送する必要がある.親は、追加の배치
を生成し、렌더러
を呼び出します.コメントとソース
https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/
https://d2.naver.com/helloworld/59361
Reference
この問題について(ブラウザの動作原理(5)-レイアウト), 我々は、より多くの情報をここで見つけました https://velog.io/@trollering12312/브라우저-작동-원리5-레이아웃テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol