Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲精品久久久久久久网站,日韩视频中文字幕视频一区,日本大片免aaa费观看视频

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          CSS之contain,一個(gè)連fixed定位都要看它眼色的限制屬性

          SS的布局有太多種方式,元素的表現(xiàn)也有很多的形式。

          像我們熟悉的那些:行內(nèi)元素、塊元素、列表元素、表格元素、絕對(duì)定位、固定定位、浮動(dòng)、彈性布局、網(wǎng)格布局等等等等。

          一個(gè)元素的具體渲染可能會(huì)受到父子元素、兄弟元素的影響。

          大多數(shù)情況我們都可以通過(guò)一些手段,來(lái)解決我們遇到的布局或表現(xiàn)問(wèn)題。

          比如給一個(gè)元素賦予了浮動(dòng),那么可以通過(guò)清除浮動(dòng)來(lái)消除影響,再比如通過(guò)絕對(duì)定位來(lái)調(diào)整元素的位置,也可以通過(guò)padding或margin等避免其他元素被覆蓋。

          但是也有那么一些情況,我們不太好處理,比如某一個(gè)元素希望相對(duì)于它的父級(jí)區(qū)域做固定定位,而不是基于整個(gè)頁(yè)面,能做到嗎?再比如給定一個(gè)盒容器,無(wú)論子元素怎么排序布局或者浮動(dòng),也不會(huì)影響其他相鄰盒子的渲染,該怎么做到?

          其實(shí)不止這些,還有很多的實(shí)際場(chǎng)景讓我們很棘手,你是否在設(shè)計(jì)和實(shí)現(xiàn)方面做過(guò)平衡和妥協(xié)?

          對(duì)于現(xiàn)在的瀏覽器來(lái)說(shuō),所支持的CSS功能不允許我們說(shuō):我不行,我做不到。

          別的不說(shuō),今天要講的contain就能用來(lái)解決上面的問(wèn)題,它能做的事情還有很多,基于自身天然的屬性,甚至能輕松提升你的性能!

          contain概述

          contain表明該元素要獨(dú)立于頁(yè)面中的其他元素,該元素中的所有內(nèi)容都被局限在一個(gè)獨(dú)立的區(qū)域,跟其他元素隔離開(kāi)來(lái),從而使得基于該元素的所有計(jì)算都是獨(dú)立的,被限制在該DOM子樹(shù)中,而不是整個(gè)頁(yè)面。這樣能夠讓頁(yè)面的性能提升。

          該元素構(gòu)成的容器,可以控制其產(chǎn)生的尺寸范圍、樣式作用域、布局方式、繪制區(qū)域。會(huì)生成新的包含區(qū)塊、新的層疊上下文、新的區(qū)塊格式化上下文。這些控制手段都對(duì)應(yīng)著不同的局限屬性,在容器內(nèi)對(duì)局限屬性的修改,不會(huì)影響容器外的部分,也就不會(huì)使得頁(yè)面經(jīng)常重新渲染,尤其在動(dòng)態(tài)修改頁(yè)面元素時(shí)會(huì)帶來(lái)更好的性能受益。

          我們理解它的時(shí)候,不要把它想成是包含的意思,理解成它的作用,是對(duì)包含內(nèi)容的一個(gè)局限,之后也會(huì)多次用到"局限"這個(gè)詞。

          分類

          一、關(guān)鍵詞

          通過(guò)關(guān)鍵詞,可以指定不同的局限屬性,從而產(chǎn)生不同的局限效果。

          1. none:不應(yīng)用任何局限。
          2. size:元素的尺寸無(wú)視子元素而單獨(dú)計(jì)算,在行向和塊向上都應(yīng)用該局限。
          3. inline-size:元素的尺寸無(wú)視子元素而單獨(dú)計(jì)算,只在行向上應(yīng)用該局限。
          4. layout:使得該元素的布局與元素外的任何內(nèi)容相互獨(dú)立,互不影響。即該元素所構(gòu)成的容器從頁(yè)面中隔離出來(lái),單獨(dú)計(jì)算布局。
          5. style:對(duì)于容器內(nèi)的某些可能影響外部屬性的值,被限制在容器內(nèi),不參與整體的計(jì)算,比如計(jì)數(shù)器和引號(hào)不會(huì)參與之前或者之后的計(jì)算,會(huì)有獨(dú)立的計(jì)算,對(duì)于外面來(lái)說(shuō)就好像這個(gè)元素沒(méi)存在過(guò)一樣,或者說(shuō)不知道有它的存在。
          6. paint:限制該元素的繪制區(qū)域范圍,子元素的渲染永遠(yuǎn)不會(huì)出現(xiàn)在容器外,容器的邊界限定了子元素的可見(jiàn)內(nèi)容。例如容器在屏幕外,那么就永遠(yuǎn)不用繪制,因?yàn)槠渥釉匾部隙ㄔ谄聊煌猓幌駇argin負(fù)值放在屏幕外那樣,子元素可能延伸到屏幕內(nèi)。
          7. content:相當(dāng)于設(shè)置了layout、paint、style,也就是除了size之外的所有值。
          8. strict:給該元素應(yīng)用所有局限規(guī)則,相當(dāng)于設(shè)置size、layout、paint、style。

          二、組合值

          也就是上面2-6關(guān)鍵字的任意組合,跟順序無(wú)關(guān),多個(gè)值之間用空格分隔開(kāi)。跟個(gè)數(shù)也無(wú)關(guān),可以設(shè)置任意的數(shù)量。不過(guò)要注意,size和inline-size同時(shí)只能設(shè)置一個(gè),因?yàn)樗鼈z是沖突的。

          三、全局值

          全局值的作用,可以參考我在font-size那篇文章中的解釋說(shuō)明,它們的作用機(jī)制和原理都是一樣的,這里不在重復(fù)贅述。

          示例

          我們來(lái)對(duì)上面所說(shuō)的內(nèi)容,做一些示例,來(lái)看看它們的實(shí)際工作方式。

          先構(gòu)建一個(gè)基本的代碼,之后都以這個(gè)為基礎(chǔ)改造和演示:

          <div style="background-color: bisque;">
            我是父元素
            <div style="background-color: coral;">
              我是子元素
            </div>
          </div>
          <div style="background-color: lightpink;">
            我是父兄弟元素
          </div>

          看下現(xiàn)在的效果:

          效果

          記住這個(gè)效果,因?yàn)槲覀兘酉聛?lái)就要改變contain屬性,觀察它所發(fā)生的變化。

          1. 通過(guò)尺寸來(lái)控制
          <div style="contain: size;background-color: bisque;">
            我是父元素
            <div style="background-color: coral;">
              我是子元素
            </div>
          </div>
          <div style="background-color: lightpink;">
            我是父兄弟元素
          </div>

          給父元素加上contain:size樣式:

          效果

          可以看到,"我是父元素"和"我是父兄弟元素"重合了,也就說(shuō),父兄弟元素的渲染,直接從父元素渲染開(kāi)始的位置開(kāi)始渲染的。就好像父元素不存在一樣。

          這里面的奧妙通過(guò)控制臺(tái)看一下,其實(shí)就很容易解開(kāi)了:

          效果

          就是因?yàn)楦冈氐母叨葹?了。在解釋之前先說(shuō)明一下,行向指的是我們書(shū)寫(xiě)的方向,就是指的從左往右,你就可以理解成是多個(gè)行內(nèi)元素排列的方向,一直往后面追加的方向。塊向指的是我們折行的方向,也就是指的從上往下,你就可以理解成是多個(gè)塊級(jí)元素排列的方向,一直往下追加的方向。

          理解了這兩個(gè)之后,我們就知道,由于size影響著這兩個(gè)方向上的局限,它會(huì)變得無(wú)視子元素。因?yàn)槿绻麤](méi)有主動(dòng)設(shè)置尺寸的話,就好像子元素不存在一樣,那么它就沒(méi)有高度,所以兄弟元素就自然而然的頂上來(lái)了。

          這時(shí),我們改一下設(shè)置,讓它只在行向上有局限:

          <div style="contain: inline-size;background-color: bisque;">
            我是父元素
            <div style="background-color: coral;">
              我是子元素
            </div>
          </div>
          <div style="background-color: lightpink;">
            我是父兄弟元素
          </div>

          通過(guò)設(shè)置contain:inline-size:

          效果

          可以看到,效果又回來(lái)了,這是因?yàn)槲覀儧](méi)有在塊向上做局限,因此高度會(huì)自然撐開(kāi)。

          既然說(shuō)到了這里,我們?cè)倏匆幌拢侨绾卧谛邢蛏线M(jìn)行局限的,構(gòu)造如下代碼:

          <div style="contain: inline-size;display: inline-block;background-color: bisque;">
            我是父元素
            <div style="background-color: coral;">
              我是子元素
            </div>
          </div>
          <div style="background-color: lightpink;">
            我是父兄弟元素
          </div>

          設(shè)置父元素為行內(nèi)塊,增加display:inline-block:

          效果

          瞬間又變成了這樣,這同樣是因?yàn)椋袃?nèi)局限使得父元素獨(dú)立計(jì)算尺寸,而我們又沒(méi)手動(dòng)指定,因此它的寬度為0,子元素也跟著寬度為0,所以就變成了一個(gè)字一換行。

          這時(shí)即使你給子元素加上寬度,在行向上父元素也會(huì)無(wú)視你:

          效果

          你看我們給子元素加上100px的寬度,但是鼠標(biāo)查看父元素,依然是寬度為0。

          1. 通過(guò)布局來(lái)控制

          指定contain:layout,可以讓該元素獨(dú)立計(jì)算它的內(nèi)部布局,不受外界影響,我們先將子元素設(shè)定一個(gè)固定定位:

          <div style="background-color: bisque;">
            我是父元素
            <div style="position: fixed;top: 10px;background-color: coral;">
              我是子元素
            </div>
          </div>
          <div style="background-color: lightpink;">
            我是父兄弟元素
          </div>

          看下現(xiàn)在的效果:

          效果

          完全沒(méi)毛病,子元素固定到頁(yè)面頂部的10px位置。

          現(xiàn)在應(yīng)用一下我們的布局限制:

          <div style="contain: layout;background-color: bisque;">
            我是父元素
            <div style="position: fixed;top: 10px;background-color: coral;">
              我是子元素
            </div>
          </div>
          <div style="background-color: lightpink;">
            我是父兄弟元素
          </div>

          再看下顯示的效果:

          效果

          咦?明明是固定定位,它的位置卻是相對(duì)于父元素的。這就是布局限制的作用,相當(dāng)于父元素告訴頁(yè)面,從現(xiàn)在開(kāi)始,這片的布局歸我管,所有的行為都向我請(qǐng)示,由我指揮。

          同樣,其他的position值,也都是基于父元素的布局限制來(lái)渲染的,這里就不做一一演示了。

          其實(shí),不光是position,只要是關(guān)于布局的,都會(huì)在此局限下生效,這里再演示一個(gè)浮動(dòng)的例子:

          <div style="height: 80px;padding: 5px;background-color: bisque;">
            <h2 style="margin-bottom: 7px;">我是父元素</h2>
            <p style="float: left;background-color: coral;">
              我是子元素
            </p>
          </div>
          <div style="height: 80px;padding: 5px;background-color: lightpink;">
            <h2>我是父兄弟元素</h2>
            <p style="background-color: coral;">
              我是父兄弟子元素
            </p>
          </div>

          兩個(gè)父元素各包含兩個(gè)子元素,其中第一個(gè)父元素的第二個(gè)子元素設(shè)置為左浮動(dòng),為了更好的演示,我把子元素改成了h2和p標(biāo)簽,看下現(xiàn)在的效果:

          效果

          父元素的兩個(gè)子元素正常顯示,但是父兄弟元素的第一個(gè)子元素里面的文字,被擠的偏移了,這是由于父元素的第二個(gè)子元素設(shè)置浮動(dòng)引起的,通過(guò)控制臺(tái)看下就明白了:

          效果

          紅線是我標(biāo)出來(lái)的,可以看到,父兄弟元素的h2和父元素的浮動(dòng)有一丁點(diǎn)的重合,導(dǎo)致文字被推開(kāi),這就是浮動(dòng)產(chǎn)生的影響。

          我們通過(guò)布局局限,來(lái)控制浮動(dòng)只發(fā)生在局限內(nèi),稍微改下代碼:

          <div style="contain: layout;height: 80px;padding: 5px;background-color: bisque;">
            <h2 style="margin-bottom: 7px;">我是父元素</h2>
            <p style="float: left;background-color: coral;">
              我是子元素
            </p>
          </div>
          <div style="height: 80px;padding: 5px;background-color: lightpink;">
            <h2>我是父兄弟元素</h2>
            <p style="background-color: coral;">
              我是父兄弟子元素
            </p>
          </div>

          給父元素添加了contain:layout,這是浮動(dòng)就不會(huì)影響后面的布局了:

          效果

          通過(guò)布局局限,我們可以把所有的關(guān)于布局的影響,都控制在容器內(nèi),這樣即使容器內(nèi)布局發(fā)生了改變,也完全不會(huì)影響頁(yè)面其他內(nèi)容,在動(dòng)態(tài)頁(yè)面中,如果需要頻繁的修改某些元素,通過(guò)這種方式管理和設(shè)計(jì)頁(yè)面,就能很有效的改善渲染的性能。

          1. 通過(guò)樣式來(lái)控制

          這里的樣式主要是針對(duì)計(jì)數(shù)器和引號(hào)的作用域,能控制它們只在所局限的范圍內(nèi)單獨(dú)計(jì)算,而不會(huì)影響全局的結(jié)果,就好像它們是單獨(dú)拿出來(lái)作為一個(gè)獨(dú)立的文檔一樣,看個(gè)例子:

          body {
            counter-reset: my-list;
          }
          div > div::before {
            counter-increment: my-list;
            content: "(" counter(my-list) "):";
          }
          <div>
            <div>第1行</div>
            <div>第2行</div>
            <div>第3行</div>
            <div>第4行</div>
            <div>第5行</div>
            <div>第6行</div>
          </div>

          我們?cè)O(shè)計(jì)這樣一個(gè)列表,通過(guò)自定義的計(jì)數(shù)器,設(shè)置一個(gè)前綴的顯示:

          效果

          如果我們希望第三行獨(dú)立出來(lái),進(jìn)行樣式局限,不參與外部計(jì)數(shù):

          <div>
            <div>第1行</div>
            <div>第2行</div>
            <div style="contain: style;">第3行</div>
            <div>第4行</div>
            <div>第5行</div>
            <div>第6行</div>
          </div>

          那么它就會(huì)展現(xiàn)成這個(gè)樣子:

          效果

          注意第三行的計(jì)數(shù),已經(jīng)重置為1,并且第四行從3開(kāi)始,接著第二行的值繼續(xù)計(jì)數(shù)。

          1. 通過(guò)繪制來(lái)控制

          這個(gè)也比較厲害,就是父元素啥樣就是啥樣,子元素永遠(yuǎn)不會(huì)在容器外渲染:

          <div style="background-color: bisque;width: 100px;height: 100px;">
            <div>
            海客談瀛洲,煙濤微茫信難求。
            越人語(yǔ)天姥,云霞明滅或可睹。
            天姥連天向天橫,勢(shì)拔五岳掩赤城。
              </div>
          </div>

          有這樣一個(gè)代碼塊,容器的寬高為100px,內(nèi)容有超出部分:

          效果

          我們可以通過(guò)繪制局限來(lái)使容器外的內(nèi)容不顯示:

          <div style="contain: style;background-color: bisque;width: 100px;height: 100px;">
            <div>
            海客談瀛洲,煙濤微茫信難求。
            越人語(yǔ)天姥,云霞明滅或可睹。
            天姥連天向天橫,勢(shì)拔五岳掩赤城。
            </div>
          </div>

          添加contain:paint,只讓繪制區(qū)域被限制在容器內(nèi)部:

          效果

          這個(gè)跟overflow:hidden有一點(diǎn)區(qū)別,就是繪制局限真的就是正常繪制,只不過(guò)不繪制容器外的部分,而hidden雖然隱藏,但是依然能通過(guò)js進(jìn)行滾動(dòng)。

          1. 通過(guò)組合值來(lái)控制

          我們也可以通過(guò)任意的值的組合來(lái)控制所需要的局限,也可以通過(guò)strict或content關(guān)鍵字來(lái)快速的做到這一點(diǎn)。這里就不再重復(fù)演示了

          最后

          合理的使用contain,不但能快速實(shí)現(xiàn)我們的需求,也能減少我們的修改量,而且會(huì)降低不理解現(xiàn)象的情況的出現(xiàn)頻率,更能提升頁(yè)面的性能。

          尤其是布局局限,提供給了我們更多的發(fā)揮空間,而且任意的復(fù)制到其他地方,也不會(huì)對(duì)外部元素有影響。

          每天一點(diǎn)小知識(shí),希望能夠幫助到你。

          flex 模態(tài)框彈窗浮動(dòng)垂直水平居中

          - position:fixed 定位

          - 元素的位置相對(duì)于瀏覽器窗口是固定位置。

          - 即使窗口是滾動(dòng)的它也不會(huì)移動(dòng);

          HTML 代碼實(shí)例

          ```

          求:當(dāng)頁(yè)面很長(zhǎng),有滾動(dòng)條時(shí),需要固定頁(yè)面上的部分元素,便于下方元素和上方固定元素的對(duì)照。

          起始頁(yè)面布局


          固定效果


          主站蜘蛛池模板: 亚洲福利电影一区二区?| 国产在线一区二区杨幂| 亚无码乱人伦一区二区| 亚洲Aⅴ无码一区二区二三区软件| 国产成人无码AV一区二区| 亚洲一区二区三区在线观看网站| 亚洲一区二区高清| 精品一区二区三区| 国产电影一区二区| 亚洲av无码一区二区三区乱子伦| 美女免费视频一区二区| 亚洲熟妇AV一区二区三区宅男| 国产精品日本一区二区在线播放 | 国产一国产一区秋霞在线观看| 亚洲熟妇av一区二区三区| 高清一区二区三区视频| 国产主播一区二区三区在线观看| 亚洲国产欧美一区二区三区| 亚洲A∨精品一区二区三区下载| 久久久久成人精品一区二区| 国产成人一区二区三区| 国产一区二区三区免费观在线| 无码乱人伦一区二区亚洲一| 久久99精品一区二区三区| 国产精久久一区二区三区| 一区二区三区影院| 精品国产一区二区三区免费| 国产内射在线激情一区| 国产内射在线激情一区| 人妻激情偷乱视频一区二区三区| 久久免费区一区二区三波多野| 国产一区二区三区久久| 日韩欧国产精品一区综合无码| 久久国产午夜一区二区福利| 亚洲一区二区三区在线观看蜜桃 | 一区二区三区免费视频网站| 国产精品男男视频一区二区三区 | 麻豆一区二区三区精品视频| 亚洲制服丝袜一区二区三区| 91国偷自产一区二区三区| 免费无码一区二区三区蜜桃大|