前在項目的過程中遇到了一個問題,某個 div 希望始終顯示在最上面,而在之后的元素都顯示在它之下,當(dāng)時設(shè)置了 z-index 也沒有效果,不知道什么原因,因此找了一下 CSS 相關(guān)資料,解決了這個問題的同時,也學(xué)習(xí)了很多知識,特此和大家分享一下。
屏幕是一個二維平面,然而 HTML 元素卻是排列在三維坐標(biāo)系中, x 為水平方向, y 為垂直方向, z為屏幕由內(nèi)向外方向,我們在看屏幕的時候是沿著 z 軸方向從外向內(nèi)的。由此,元素在用戶視角就形成了層疊的關(guān)系,某個元素可能覆蓋了其他元素也可能被其他元素覆蓋;
這里有幾個重要的概念:層疊上下文 (堆疊上下文, Stacking Context)、層疊等級 (層疊水平, Stacking Level)、層疊順序 (層疊次序, 堆疊順序, Stacking Order)、z-index、BFC(塊級格式化上下文,Block Formatting Context),這些概念共同決定了你看到元素的位置,下面我們就圍繞著這幾個概念來一起學(xué)習(xí)一下。
聲明:
1. 層疊上下文 (Stacking Context)
層疊上下文 (堆疊上下文, Stacking Context),是 HTML 中一個三維的概念。在 CSS2.1 規(guī)范中,每個元素的位置是三維的,當(dāng)元素發(fā)生層疊,這時它可能覆蓋了其他元素或者被其他元素覆蓋;排在 z 軸越靠上的位置,距離屏幕觀察者越近。
文章 <關(guān)于z-index 那些你不知道的事> 有一個很好的比喻,這里引用一下;
可以想象一張桌子,上面有一堆物品,這張桌子就代表著一個層疊上下文。如果在第一張桌子旁還有第二張桌子,那第二張桌子就代表著另一個層疊上下文。現(xiàn)在想象在第一張桌子上有四個小方塊,他們都直接放在桌子上。在這四個小方塊之上有一片玻璃,而在玻璃片上有一盤水果。這些方塊、玻璃片、水果盤,各自都代表著層疊上下文中一個不同的層疊層,而這個層疊上下文就是桌子。
每一個網(wǎng)頁都像一個房間,這個房間就是 <html></html>,其他層疊上下文就像這個房間里的桌子,HTML 標(biāo)簽中的一切都被置于這個房間中。
當(dāng)給一個元素的 position 值賦為 fixed 或 sticky 值時,你就創(chuàng)建了一個新的層疊上下文,其中有著獨立于頁面上其他層疊上下文和層疊層的層疊層,這就相當(dāng)于你把另一張桌子帶到了房間里。
層疊上下文 1 (Stacking Context 1)是由文檔根元素形成的, 層疊上下文 2 和 3 (Stacking Context 2, 3) 都是層疊上下文 1 (Stacking Context 1) 上的層疊層。他們各自也都形成了新的層疊上下文,其中包含著新的層疊上下文。
在層疊上下文中,其子元素按照上面解釋的規(guī)則進行層疊。形成層疊上下文的方法有:
總結(jié):
2. 層疊等級 (Stacking Level)
層疊等級 (層疊水平, Stacking Level) 決定了在同一個層疊上下文中,元素在 z 軸上的顯示的順序;
對于普通元素的層疊水平探討只局限于在當(dāng)前層疊上下文中:
層疊上下文本身是一個強力的「層疊結(jié)界」,普通的元素水平是無法突破這個結(jié)界和結(jié)界外的元素去較量層疊水平的。
— CSS 世界
另外,層疊等級并不一定由 z-index 決定,只有定位元素的層疊等級才由 z-index 決定,其他類型元素的層疊等級由層疊順序、他們在 HTML 中出現(xiàn)的順序、他們的祖先元素的層疊等級一同決定,詳細的規(guī)則見下面層疊順序的介紹。
3. z-index
在 CSS 2.1 中, 所有的盒模型元素都處于三維坐標(biāo)系中。除了我們常用的橫坐標(biāo)和縱坐標(biāo), 盒模型元素還可以沿著「z 軸」層疊擺放,當(dāng)他們相互覆蓋時,z 軸順序就變得十分重要。
-- CSS 2.1 Section 9.9.1 - Layered presentation
z-index 只適用于定位的元素,對非定位元素?zé)o效,它可以被設(shè)置為正整數(shù)、負(fù)整數(shù)、 0、 auto,如果一個定位元素沒有設(shè)置 z-index,那么默認(rèn)為 auto;
元素的 z-index 值只在同一個層疊上下文中有意義。如果父級層疊上下文的層疊等級低于另一個層疊上下文的,那么它 z-index 設(shè)的再高也沒用。所以如果你遇到 z-index 值設(shè)了很大,但是不起作用的話,就去看看它的父級層疊上下文是否被其他層疊上下文蓋住了。
4. 層疊順序 (Stacking Order)
層疊順序 (層疊次序, 堆疊順序, Stacking Order) 描述的是元素在同一個層疊上下文中的順序規(guī)則(之前的層疊上下文和層疊等級是概念),從層疊的底部開始,共有七種層疊順序:
第 7 級順序的元素會顯示在之前順序元素的上方,也就是看起來覆蓋了更低級的元素:
除層疊順序優(yōu)先級規(guī)則之外,還有一條后來居上規(guī)則:同一個層疊順序的元素按照在 HTML 里出現(xiàn)的順序依次層疊。這兩個規(guī)則共同決定瀏覽器元素在文檔中是如何層疊的。
5. 文檔流 (Document Flow)
5.1 常規(guī)流 (Normal flow)
5.2 浮動 (Floats)
5.3 絕對定位 (Absolute positioning)
6. BFC (Block Formatting Context)
6.1 什么是 BFC
BFC (Block Formatting Context) 塊級格式化上下文,是用于布局塊級盒子的一塊渲染區(qū)域,相對應(yīng)的還有 IFC(Inline Formatting Context)內(nèi)聯(lián)格式化上下文,不是本文重點,讀者可以自行查閱相關(guān)知識。
BFC 是 Web 頁面 CSS 視覺渲染的一部分,用于決定塊盒子的布局及浮動相互影響范圍的一個區(qū)域。
— MDN - 塊格式化上下文
一個 BFC 的范圍包含創(chuàng)建該上下文元素的所有子元素,但不包括創(chuàng)建了新 BFC 的子元素的內(nèi)部元素。這從另一方角度說明,一個元素不能同時存在于兩個 BFC 中。因為如果一個元素能夠同時處于兩個 BFC 中,那么就意味著這個元素能與兩個 BFC 中的元素發(fā)生作用,就違反了 BFC 的隔離作用。
觸發(fā) BFC 的方式有:
注意: display:table 也可以生成 BFC 的原因在于 Table 會默認(rèn)生成一個匿名的 table-cell,是這個匿名的 table-cell 生成了 BFC。
6.2 用法
1. 阻止相鄰元素的 margin 合并
屬于同一個 BFC 的兩個相鄰塊級子元素的上下 margin 會發(fā)生重疊,(設(shè)置 writing-mode:tb-rl時,水平 margin 會發(fā)生重疊)。所以當(dāng)兩個相鄰塊級子元素分屬于不同的 BFC 時可以阻止 margin 重疊。可以給任一個相鄰塊級盒子的外面包一個 div,通過改變此 div 的屬性使兩個原盒子分屬于兩個不同的 BFC,以此來阻止 margin 重疊。
代碼和預(yù)覽參見:Codepen - 使用BFC阻止margin合并:https://codepen.io/SHERlocked93/pen/eVOevN
2. 阻止元素被浮動元素覆蓋
一個正常文檔流的塊級元素可能被一個 float 元素覆蓋,擠占正常文檔流,因此可以設(shè)置一個元素的 float、 display、 position 值等方式觸發(fā) BFC,以阻止被浮動盒子覆蓋。
代碼和預(yù)覽參見:Codepen - 使用BFC阻止元素被浮動元素覆蓋:https://codepen.io/SHERlocked93/pen/pazdzB
3. 包含浮動元素
通過改變包含浮動子元素的父盒子的屬性值,觸發(fā) BFC,以此來包含子元素的浮動盒子。
代碼和預(yù)覽參見:Codepen - 使用BFC包含浮動元素:https://codepen.io/SHERlocked93/pen/OQLOqG
7. 實戰(zhàn)
下面一起來看幾個例子實戰(zhàn)一下,幫助理解。
7.1 普通情況
三個 relative 定位的 div 塊中各有 absolute 的不同顏色的 span.red、 span.green、 span.blue,它們都設(shè)置了 position:absolute;
代碼和預(yù)覽參見:Codepen - 普通情況:https://codepen.io/SHERlocked93/pen/aaPord
那么當(dāng)沒有元素包含 z-index 屬性時,這個例子中的元素按照如下順序?qū)盈B(從底到頂順序):
紅綠藍都屬于 z-index 為 auto 的定位元素,因此按照 7 層層疊順序規(guī)則來說同屬于層疊順序第 6 級,所以按 HTML 中的出現(xiàn)順序?qū)盈B:紅->綠->藍
7.2 在相同層疊上下文的父元素內(nèi)的情況
紅綠位于一個 div.first-box 下,藍位于 div.second-box 下,紅綠藍都設(shè)置了 position:absolute, first-box 與 second-box 都設(shè)置了 position:relative;
代碼和預(yù)覽參見:Codepen - 父元素不同但都位于根元素下:https://codepen.io/SHERlocked93/pen/RYENBw
這個例子中,紅藍綠元素的父元素 first-box 與 second-box 都沒有生成新的層疊上下文,都屬于根層疊上下文中的元素,且都是層疊順序第 6 級,所以按 HTML 中的出現(xiàn)順序?qū)盈B:紅->綠->藍
7.3 給子元素增加 z-index
紅綠位于一個 div.first-box 下,藍黃位于 div.second-box 下,紅綠藍都設(shè)置了 position:absolute,如果這時給綠加一個屬性 z-index:1,那么此時 .green 位于最上面;
如果再在 .second-box 下 .green 后加一個絕對定位的 span.gold,設(shè)置 z-index:-1,那么它將位于紅綠藍的下面;
代碼和預(yù)覽參見:Codepen - 設(shè)置了z-index:https://codepen.io/SHERlocked93/pen/gdZOrK
這個例子中,紅藍綠黃元素的父元素中都沒有生成新的層疊上下文,都屬于根層疊上下文中的元素
所以這個例子中的從底到高顯示的順序就是:黃->紅->藍->綠
7.4 在不同層疊上下文的父元素內(nèi)的情況
紅綠位于一個 div.first-box 下,藍位于 div.second-box 下,紅綠藍都設(shè)置了 position:absolute,如果 first-box 的 z-index 設(shè)置的比 second-box 的大,那么此時無論藍的 z-index 設(shè)置的多大 z-index:999,藍都位于紅綠的下面;如果我們只更改紅綠的 z-index 值,由于這兩個元素都在父元素 first-box 產(chǎn)生的層疊上下文中,此時誰的 z-index 值大,誰在上面;
代碼和預(yù)覽參見:Codepen - 不同層疊上下文的父元素:https://codepen.io/SHERlocked93/pen/gdZbOJ
這個例子中,紅綠藍都屬于設(shè)置了 z-index 的定位元素,不過他們的父元素創(chuàng)建了新的層疊上下文;
所以這個例子中從低到到顯示的順序:藍->紅->綠
(我遇到的的情況就屬于這個例子類似情形)
7.5 給子元素設(shè)置 opacity
紅綠位于 div.first-box 下,藍位于 div.second-box 下,紅綠藍都設(shè)置了 position:absolute,綠設(shè)置了 z-index:1,那么此時綠位于紅藍的最上面;
如果此時給 first-box 設(shè)置 opacity:.99,這時無論紅綠的 z-index 設(shè)置的多大 z-index:999,藍都位于紅綠的上面;
如果再在 .second-box 下 .green 后加一個 span.gold,設(shè)置 z-index:-1,那么它將位于紅綠藍的下面;
代碼和預(yù)覽參見:Codepen - opacity的影響:https://codepen.io/SHERlocked93/pen/GXPRWB
之前已經(jīng)介紹了,設(shè)置 opacity 也可以形成層疊上下文,因此:
所以這個例子中從低到到顯示的順序:黃->紅->綠->藍
關(guān)注微信公眾號:安徽思恒信息科技有限公司,了解更多技術(shù)內(nèi)容……
德經(jīng)第二十二章中有一句是說“少則得,多則惑”,這句話的意思是:少取則真得,貪多則反而導(dǎo)致自身的混亂。結(jié)合我親身經(jīng)歷,更容易理解這句話的意思。
有一段時間,我們天都學(xué)習(xí)10個小時,這種情況一直持續(xù)了大半個月。可是效果卻幾乎等于沒有,這段時間內(nèi)每天都會有大量的信息涌入你的腦袋,在學(xué)的那一刻,你感覺你已經(jīng)完全會了。但是過個一兩天,你卻完全不記得你到底學(xué)過些什么,像失憶了似的。
艾賓浩斯記憶曲線也告訴我們,大腦的記憶是一個緩慢的過程,想要對某一知識記憶深刻,就需要不斷地重復(fù)練習(xí)。直到隨時隨地拿來就用的地步,你就再也不會忘記了。
為什么說少則得,多則惑呢?每天只學(xué)一點,練習(xí)好幾遍,把這個知識點刻到腦子里面去,這樣日積月累你會發(fā)現(xiàn)你已經(jīng)學(xué)會了很多。每天學(xué)習(xí)很多知識點,很少時間去練習(xí),過段時間你會發(fā)現(xiàn)你什么都沒有記住,到用的時候根本想不起來,還得返回頭再去學(xué)習(xí)一遍。徒增學(xué)習(xí)成本,也就是多則惑的道理。
好了言歸正傳,今天我們來學(xué)習(xí)html中的表格和表單,這兩個可不是一個東西哦。
表格:excel表格知道吧,橫行豎起列的那種表格。看圖:
上面是一個9行2列的表格,在html里面也有這種表格,我們來使用html的table表格標(biāo)簽來實現(xiàn)一個5行3列的表格。
上圖中table標(biāo)簽表示這是一個表格,tr表示一行,圖中我寫了五行,都用紅圈標(biāo)注了出來,每個tr里面又包含著td,td表示列,第1行里面有3列,第2、3、4、5行每行里面都有3列。
在瀏覽器中的效果:
和我們想象中的樣子好像有點不一樣,沒有格子,這是因為我們沒有設(shè)置的緣故,table標(biāo)簽允許你通過border屬性來設(shè)置邊框(也就是格子),那我們來給它設(shè)置一個邊框吧。
通過給table標(biāo)簽添加border="1",就可以讓表格有邊框了,來看看瀏覽器中的效果:
還是有點別扭,我腦海里面的表格應(yīng)該是和艾賓浩斯記憶曲線的那張表格一樣才對啊,現(xiàn)在的這個表格有點鏤空的感覺,第1行的第1列和第1行的第2列,也就是“關(guān)羽”、“男”之前有距離,如何把這個距離去掉呢?我們可以通過table標(biāo)簽的cellspacing屬性把距離去掉,試一下:
加了cellspacing="0" 屬性后,瀏覽器中的效果如下:
當(dāng)然了, table標(biāo)簽的cellspacing屬性的不光可以等于0,還可以等于其他值,比如我們就是希望有距離,那么我們設(shè)置成20試一下:
瀏覽器中的效果:
cellspacing屬性的值應(yīng)該取多少,按照你的需求來設(shè)置就好了。
現(xiàn)在還有一個問題,我覺得每個單元格的太小了,也就是“關(guān)羽”這個格子的邊框和“關(guān)羽”這兩個字貼得太緊了,一點都不好看,我們可以讓他稍微有點距離,那樣看起來應(yīng)該比較美觀一點。這個需求可以通過table標(biāo)簽的cellpadding屬性來設(shè)置,其實也就是設(shè)置內(nèi)邊距,關(guān)于內(nèi)邊距的概念我們在《踏上編程之路的必經(jīng)之路之html篇三》中講解過,如果忘記的同學(xué)可以返回去看一下。
我們將cellpadding設(shè)置為10,在瀏覽器中的效果如下:
現(xiàn)在整個表格感覺是豎起來的,能不能讓他感覺是橫著呢?table標(biāo)簽允許你調(diào)整它的寬度,只要寬度夠了,感覺起來自然就是橫的了。我們通過table標(biāo)簽的width屬性來調(diào)整表格的寬度:
調(diào)整表格的寬度為600,瀏覽器中的效果如下:
表格中的文字現(xiàn)在是左對齊,也就是靠近單元格的左邊,我們可以讓它居中,或者靠右對齊(右對齊),文字的對齊方式可以通過tr標(biāo)簽的align屬性來控制:
注意文字對齊方式,是給tr標(biāo)簽(也就是table的行標(biāo)簽)設(shè)置了align屬性,不是給table,不要寫錯地方了。align="center"就是讓文字居中,align="right"就是讓文字右對齊,如果不寫,默認(rèn)是左對齊。
設(shè)置了文字對齊方式后,瀏覽器中的效果如下:
最我們整體調(diào)整一下,我需要有邊框(border="1",設(shè)置為0就是沒有邊框),單元格之間不要距離(cellspacing="0",設(shè)置成其它值就是有距離),內(nèi)邊距需要5(cellpadding="5"),表格寬度需要400(width="400"),文字統(tǒng)一都是居中對齊(table標(biāo)簽的tr標(biāo)簽上面設(shè)置align="center"),整體設(shè)置后的代碼如下:
瀏覽器中的效果如下:
其實table標(biāo)簽也有一個align屬性,它可以讓整表格在瀏覽器中的居中、靠左或者靠右對齊,有興趣的同學(xué)可以自己嘗試一下。
最后提醒一句,代碼中的各種標(biāo)簽和標(biāo)簽的屬性還有單雙引號,都必須是英文的,如果你寫成中文的,是不正確的。
舉個例子:
良好的行動力,是成功的一半,動手練起來。
篇中我們介紹了文本的一些樣式,這篇接著講文本樣式。
6.文本下劃線
一般文本下劃線都用在什么地方呢?我想到一個就是畫重點考前劃重點,有沒有畫面感,^v^。
用css來實現(xiàn)劃重點,也是別具風(fēng)格呀。
<!DOCTYPE html>
<html>
<head>
<title>css顏色與度量單位</title>
<style>
span{
text-decoration:underline;
}
</style>
</head>
<body>
<p>
在做等離子物理對撞實驗的時候,如果把第三能量的極坐標(biāo),向負(fù)方向調(diào)整三個阿爾法單位,那么對最終的結(jié)果將會產(chǎn)生多少影響?
<br>
<span>2伽馬一步徐龍根號3</span>
</p>
</body>
</html>
text-decoration可以給文本設(shè)置下劃線,上劃線,刪除線,取消線。
上面代碼實現(xiàn)效果如下:
這個效果看起來兩行之間的距離有點擁擠,我們可以調(diào)整的它們的距離,稍微遠一點,讓它們看起不那么擁擠。
7.文本的行間距
用line-height來指定行間距,因為文本都包含在p標(biāo)簽中,所以我們給p標(biāo)簽加了行間距為50px
調(diào)整后的效果如下:
看起來下劃線的文字還是不夠顯眼啊,我們再給它加點顏色上去,會更好。
這回好多了。夠顯眼,就絕對記得住。
text-decoration后面可以設(shè)置的值如下:
值 | 說明 |
none | 讓本身有劃線裝飾的文本取消掉 |
underline | 讓文本的底部出現(xiàn)一條下劃線 |
overline | 讓文本的頭部出現(xiàn)一條上劃線 |
line-through | 讓文本的中部出現(xiàn)一條刪除線 |
blink | 讓文本進行閃爍,基本不支持了 |
text-decoration:none這個會讓本身有劃線裝飾的文本取消掉的意思,例如a標(biāo)簽,天生就帶下劃線,那要不想要自帶的下劃線就可以利用這個樣式給它去掉。
來嘗試一下
<!DOCTYPE html>
<html>
<head>
<title>css顏色與度量單位</title>
<style>
p{
line-height: 50px;
}
span{
text-decoration:underline;
color: red;
}
</style>
</head>
<body>
<p>
在做等離子物理對撞實驗的時候,如果把第三能量的極坐標(biāo),向負(fù)方向調(diào)整三個阿爾法單位,那么對最終的結(jié)果將會產(chǎn)生多少影響?
<br>
<span>2伽馬一步徐龍根號3</span>
<br>
<a href="http://www.baidu.com">百度</a>
</p>
</body>
</html>
百度兩個字下面天生就帶了下?lián)Q線,要去掉請使用text-decoration:none
其余幾個大家可以自己動手嘗試一下效果。
8.設(shè)置英文文本轉(zhuǎn)換為大小寫
這個標(biāo)題很好理解,就是專門針對英文的,如果想把英文文本轉(zhuǎn)換大小寫可以使用
<!DOCTYPE html>
<html>
<head>
<title>css顏色與度量單位</title>
<style>
p{
line-height: 50px;
}
span{
text-decoration:underline;
color: red;
}
a{
text-decoration:none;
}
</style>
</head>
<body>
<p>
在做等離子物理對撞實驗的時候,如果把第三能量的極坐標(biāo),向負(fù)方向調(diào)整三個阿爾法單位,那么對最終的結(jié)果將會產(chǎn)生多少影響?
<br>
<span>2伽馬一步徐龍根號3</span>
<br>
<a href="http://www.baidu.com">百度</a>
<br>
<span class="english">
no zuo no die you why cry
<br>
you zuo you die don't ask why
</span>
</p>
</body>
</html>
頁面效果如下:
這里的英文文本也是寫在了span標(biāo)簽里面,受span標(biāo)簽樣式的影響這里也變成了紅色,也加了下劃線。我們給它取消掉這些樣式。并給它設(shè)置讓英文單詞首字母變成大寫的樣式。
下面給出text-transform的值和作用的表格,大家可以自行動手嘗試效果。
值 | 說明 |
none | 將已被轉(zhuǎn)換大小寫的值恢復(fù)到默認(rèn)狀態(tài) |
capitalize | 將英文單詞首字母大寫 |
uppercase | 將英文轉(zhuǎn)換為大寫字母 |
lowercase | 將英文轉(zhuǎn)換為小寫字母 |
9.文本添加陰影
text-shadow:5px 5px 5px red;
這里有四個值(3個5px和一個red):第一個值代表水平偏移;第二個值代表垂直偏移;第三個值代表陰影模糊度(可選);第四個值代表陰影顏色(可選)。
10.設(shè)置文本的對齊方式
我們可以設(shè)置文本的對齊方式,如果你用過word文檔的話,那一定知道左對齊、右對齊、居中對齊。css里面同樣有
我們來嘗試一下居中對齊
值 | 說明 |
left | 靠左對齊,默認(rèn) |
right | 靠右對齊 |
center | 居中對齊 |
justify | 內(nèi)容兩端對齊 |
start | 讓文本處于開始的邊界 |
end | 讓文本處于結(jié)束的邊界 |
start和end屬于css3新增的功能,IE和Opera瀏覽器可能不支持。
11.處理文本之間的距離(letter-spacing)
也就是兩個字間的距離,通過例子來感受一下
很明顯的可以看到字間距變大了。
12.設(shè)置英文單詞之間的距離(word-spacing)
13.文本首行的縮進(text-indent)
一般每個段落的首行都要縮進,這是書寫書信文件時的規(guī)定。
我們?nèi)サ袅司又袑R的樣式,是為了更好地演示首行縮進的效果。
看效果圖紅框的地方,明顯有縮進。
好了,以上就是今天的內(nèi)容了。
希望大家可以早日學(xué)會編程,踏上高薪之路,早日成為白富美、高富帥。動手練,聽我的沒錯。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。