国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

關于網頁渲染,前端們應該知道的一些事情_html/css_WEB-ITnose

來源:懂視網 責編:小采 時間:2020-11-27 16:40:33
文檔

關于網頁渲染,前端們應該知道的一些事情_html/css_WEB-ITnose

關于網頁渲染,前端們應該知道的一些事情_html/css_WEB-ITnose:瀏覽器是如何渲染網頁的? 我們從瀏覽器渲染一個頁面的行為說起: 從服務器端獲取的HTML文檔中構建出DOM樹(文檔對象模型); 樣式被加載和分析,構建CSSOM(CSS對象模型); 以DOM和CSSOM為基礎,文檔樹被構建,一系列對象被渲染(Webkit稱每一
推薦度:
導讀關于網頁渲染,前端們應該知道的一些事情_html/css_WEB-ITnose:瀏覽器是如何渲染網頁的? 我們從瀏覽器渲染一個頁面的行為說起: 從服務器端獲取的HTML文檔中構建出DOM樹(文檔對象模型); 樣式被加載和分析,構建CSSOM(CSS對象模型); 以DOM和CSSOM為基礎,文檔樹被構建,一系列對象被渲染(Webkit稱每一

瀏覽器是如何渲染網頁的?

我們從瀏覽器渲染一個頁面的行為說起:

  • 從服務器端獲取的HTML文檔中構建出DOM樹(文檔對象模型);

  • 樣式被加載和分析,構建CSSOM(CSS對象模型);

  • 以DOM和CSSOM為基礎,文檔樹被構建,一系列對象被渲染(Webkit稱每一個為‘renderer’或’render 對象(render object)‘,Gecko中稱為‘frame’).渲染樹反應了除不可見元素( , display:none)之外的DOM結構中一切可見元素,每一段字符串在渲染樹中都被當做獨立的渲染對象,每一個渲染對象都是其對應的DOM結構和計算所得樣式的混合體,換句話說渲染樹是DOM樹的視覺表現;

  • 對于每一個渲染樹元素,它的坐標都是通過計算獲得的,這被稱作排版(布局layout),瀏覽器通過文檔流的方式(也就是一次就能完成所有元素的布局)(tables需要多于一次的布局);

  • 最終渲染樹出現在瀏覽器窗口上,這個過程稱為繪制(painting)。

  • 當用戶與一個頁面交互或者腳本修改時,由于文檔結構的變化,以上的一些操作步驟會重新執行。

    重現繪制(Repaint)

    當元素樣式變化并不影響該元素在一個網頁上的位置時( background-color, border-color, visibility),瀏覽器只會把新樣式應用到該元素。

    Reflow

    當改變影響了 文檔內容或結構或者元素的位置時,reflow發生(重新布局),這一般由以下因素觸發:

  • DOM操作(添加,刪除,更改,或者變更元素順序);

  • 內容改變(包括表格區域內文本的變化)(所占位置大小變了);

  • 計算或者改變CSS屬性(位置改變);

  • 添加或者刪除樣式表;

  • 改變類屬性(class)(可能會改變位置);

  • 瀏覽器窗口操作(改變大小,滾動);

  • 偽類激活(可能改變位置)

  • 怎么讓瀏覽器充分利用渲染機制

    瀏覽器會盡可能的限制被改變元素所在區域的重排重繪,比如說 display:fixed/absolute元素改變時只會影響它本身和它的子元素,而 display:static元素改變時會使其隨后的元素都被重繪;(影響盡量少的元素)

    另一個最大化性能的機制在于,當運行一系列JavaScript片段時,瀏覽器會緩存它們,然后一次運行。看下面的例子可以很好的理解:

    var $body = $('body');$body.css('padding', '1px'); // reflow, repaint$body.css('color', 'red'); // repaint$body.css('margin', '2px'); // reflow, repaint// only 1 reflow and repaint will actually happen(由于緩存,只會重繪一次)

    然而,就像上面已經提到的,調用一個元素的屬性會觸發強制性的reflow,當我們加上一行讀元素屬性的代碼時就會發生;

    var $body = $('body');$body.css('padding', '1px');$body.css('padding'); // reading a property, a forced reflow(強制發生)$body.css('color', 'red');$body.css('margin', '2px');//另外一次reflow

    因此,會有兩次reflow,因此應該組合來讀元素屬性已最大化性能 一個詳細的例子;

    $(function() { var $body = $('body'); $body .on('click', '.block-1', function(e) { // 1 reflow $body.css('padding', '1px'); $body.css('color', 'red'); $body.css('margin', '2px'); }) .on('click', '.block-2', function(e) { // 2 reflows $body.css('padding', '1px'); $body.css('padding'); $body.css('color', 'red'); $body.css('margin', '2px'); }) .on('click', '.block-3', function(e) { // 3 repaints $body.css('color', 'red'); $body.css('color'); $body.css('color', 'yellow'); $body.css('background'); $body.css('color', 'blue'); $body.css('outline'); }) .on('click', '.block-4', function(e) { // 1 repaint $body.css('color', 'red'); $body.css('color', 'yellow'); $body.css('color', 'blue'); $body.css('color'); $body.css('background'); $body.css('outline'); }) .on('click', '.block-5', function(e) { // 3 reflows $body.css('padding', '1px'); $body[0].offsetHeight; $body.css('padding', '2px'); $body[0].offsetTop; $body.css('padding', '3px'); $body[0].offsetWidth; }) .on('click', '.block-6', function(e) { // 1 reflow $body.css('padding', '1px'); $body.css('padding', '2px'); $body.css('padding', '3px'); $body[0].offsetHeight; $body[0].offsetTop; $body[0].offsetWidth; });});

    有些時候,可能你會需要一次強制性的reflow,例如:我們需要運用兩次 margin-left到同一個對象,第一次無動畫的設置到100px,然后通過動畫過渡到50px, 實例;

    過渡動畫:

    .has-transition { -webkit-transition: margin-left 1s ease-out; -moz-transition: margin-left 1s ease-out; -o-transition: margin-left 1s ease-out; transition: margin-left 1s ease-out;}

    過程代碼:

    // our element that has a "has-transition" class by defaultvar $targetElem = $('#targetElemId');// remove the transition class$targetElem.removeClass('has-transition');// change the property expecting the transition to be off, as the class is not there// anymore$targetElem.css('margin-left', 100);// put the transition class back$targetElem.addClass('has-transition');// change the property$targetElem.css('margin-left', 50);

    上述代碼并不按預期工作,因為改變被緩存并在最后執行了一次,這時候我們就需要一次強制性的執行了:

    達到預期效果的代碼

    // remove the transition class$(this).removeClass('has-transition');// change the property$(this).css('margin-left', 100);// trigger a forced reflow, so that changes in a class/property get applied immediately$(this)[0].offsetHeight; // an example, other properties would work, too// put the transition class back$(this).addClass('has-transition');// change the property$(this).css('margin-left', 50);

    現在達到預期效果了!

    性能優化的建議

    總結了一些有用的信息,本文有以下建議

  • 構建有效的HTML和CSS,不要忘記聲明文檔編碼方式,樣式表應該包含在 標簽內,腳本文件應該放在 標簽的底部;

  • 簡化并且充分利用CSS選擇器(這一條被大多數使用CSS預處理器的開發者忽略),維護最少的層狀結構,以下是各選擇器的效率排行

    #id.classdiva+iul>li*input[type='text']a:hover
  • 應該引起注意的是,瀏覽器是從右向左讀取選擇器的,所以最右邊的應該選擇效率比較高的選擇器 #id,.class;

  • div * {...} // bad.list li {...} // bad.list-item {...} // good#list .list-item {...} // good
  • 在腳本中,應該盡可能的減少DOM操作,如果對象和屬性會被重用,就緩存它們。在最好離線元素(未被插入文檔樹)(offline)上進行操作,然后把它插入DOM結構中;

  • 如果使用jQuery,遵循[jQuery選擇器基本原則( http://learn.jquery.com/performance/optimize-selectors/);

  • 修改元素的樣式時,修改class屬性是做好的方法,其位置越深,越好(also because this helps decouple logic from presentation);

  • 只使 display:fixed/absolute的元素具有動畫;

  • 不適用復雜的 :hover動畫也是一個好的實踐(給 添加 no-hover屬性), 延展閱讀;

  • 延展閱讀已獲得更多信息:

    1. How browsers works;

    2. Rendering: repaint, reflow/relayout, restyle;

    希望這邊譯文對您有用

    原文鏈接

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    關于網頁渲染,前端們應該知道的一些事情_html/css_WEB-ITnose

    關于網頁渲染,前端們應該知道的一些事情_html/css_WEB-ITnose:瀏覽器是如何渲染網頁的? 我們從瀏覽器渲染一個頁面的行為說起: 從服務器端獲取的HTML文檔中構建出DOM樹(文檔對象模型); 樣式被加載和分析,構建CSSOM(CSS對象模型); 以DOM和CSSOM為基礎,文檔樹被構建,一系列對象被渲染(Webkit稱每一
    推薦度:
    標簽: 網站 網頁 一些
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 日韩精品网址 | 欧美激情在线播放一区二区三区 | 综合精品欧美日韩国产在线 | 99久久国内精品成人免费 | 亚洲国产成人久久 | 日韩色视频一区二区三区亚洲 | 2021精品国内一区视频自线 | 国产精品一区二 | 国产99精品 | 国产 日韩 欧美在线 | 99国产精品一区二区 | 精品久久久久中文字幕日本 | 日韩精品成人在线 | 日韩在线电影 | 91中文| 国产精品久久久久久久牛牛 | 亚洲欧美网址 | 久久福利免费视频 | 青青操在线视频 | 天堂亚洲欧美日韩一区二区 | 亚欧激情 | 欧美亚洲免费 | 超在线视频 | 亚洲精品在线免费看 | 亚洲欧洲综合 | 视频在线观看一区 | 国产成人精品一区二三区2022 | 精品久久亚洲一级α | 91精品久久久久久久久久 | 性插欧美 | 国产香蕉视频 | 亚州第一视频 | 日韩欧美一区二区三区视频 | 欧美特黄一区二区三区 | 欧美激情一区二区亚洲专区 | 亚洲一区二区三区久久精品 | 99国产精品一区二区 | 欧美一区视频 | 国产成人精品三级在线 | 俄罗斯女人禽交zozo | 久久精品亚洲一区二区三区浴池 |