1.CSS介紹:
引題:
網(wǎng)站中的所有頁面的標(biāo)題都是黑色
老板需要將頁面中的所有的標(biāo)題改為紅色
定義:
Cascade Style Sheet 層疊樣式表
html 在一個(gè)網(wǎng)頁中負(fù)責(zé)的事情是一個(gè)頁面的結(jié)構(gòu)
css(層疊樣式表) 在一個(gè)網(wǎng)頁中主要負(fù)責(zé)了頁面的數(shù)據(jù)樣式。
優(yōu)勢(shì):
使得頁面的結(jié)構(gòu)和表現(xiàn)分離
2.CSS引入方式:
行內(nèi)樣式:
<h2 style="color:#0F0">Hello World</h2>
內(nèi)部樣式:
內(nèi)部樣式
外部樣式:
外部樣式
優(yōu)先級(jí)問題???
行內(nèi)樣式 > 內(nèi)部樣式 > 外部樣式 就近原則
link和@import引入外部樣式的區(qū)別???
link與@import區(qū)別
3.CSS選擇器
作用:選擇器的作用就是找到對(duì)應(yīng)的數(shù)據(jù)進(jìn)行樣式化
格式:選擇器{ 屬性:屬性值; }
常見的選擇器
4.偽類和偽元素:
它們?cè)试S應(yīng)用的樣式用于文檔不存在的結(jié)構(gòu)上,或者是通過當(dāng)前元素的狀態(tài)甚至是文檔自身的狀態(tài)而推斷的某些東西上。偽類選擇器就是對(duì)元素處于某種狀態(tài)下進(jìn)行樣式的。
<a>標(biāo)簽的偽使用
案例嘗試
5.常用操作屬性
背景與文本
表格
邊框
6.盒子模型
盒子模型就是把一個(gè)html邊框比作成了一個(gè)盒子的邊框,盒子模型要做用于操作數(shù)據(jù)與邊框之間的距離或者 是邊框與邊框之間的距離。
盒子模型主要是用于操作內(nèi)邊距(padding)與外邊距(margin)
盒子模型
嘗試代碼
絕對(duì)定位與相對(duì)定位區(qū)別:
position: absolute;絕對(duì)定位:絕對(duì)定位是相對(duì)于元素最近的已定位的祖先元素(即是設(shè)置了絕對(duì)定位或者相對(duì)定位的祖先元素)。如果元素沒有已定位的祖先元素,那么它的位置則是相對(duì)于最初的包含塊(body)。
絕對(duì)定位本身與文檔流無關(guān),因此不占空間,普通文檔流中的元素的布局就當(dāng)絕對(duì)定位的元素不存時(shí)一樣,所以 它們可以覆蓋頁面上其他的元素,且可以通過z-index屬性來控制這些層的對(duì)方順序。
絕對(duì)定位
position: relative;相對(duì)定位:相對(duì)定位是相對(duì)于元素在文檔中的初始位置——首先它出現(xiàn)在它所在的位置上(即不設(shè)置position時(shí)的位置,然后通過設(shè)置垂直或水平位置,讓這個(gè)元素“相對(duì)于”它的原始起點(diǎn)進(jìn)行移動(dòng);
注意,在使用相對(duì)定位時(shí),無論是否進(jìn)行移動(dòng),元素仍然占據(jù)原來的空間。因此,移動(dòng)元素會(huì)導(dǎo)致它覆蓋其它框。
相對(duì)定位
PS:這里只是對(duì)css的簡單使用總結(jié),里面還有很多技術(shù),可以參考菜鳥教程,W3CSCHOOL等在線教程
如果我們的頁面上存在非常多的樣式,譬如有我們開發(fā)頁面的時(shí)候的自定義樣式,也有引入的組件庫樣式。這時(shí)候樣式將會(huì)非常混亂難以管理。
當(dāng)我們想覆蓋一些本身非我們書寫的樣式時(shí)候,往往不得不通過使用優(yōu)先級(jí)權(quán)重更高的樣式名,去覆蓋那些樣式。
同時(shí),當(dāng)樣式優(yōu)先級(jí)感到難以控制時(shí),開發(fā)者習(xí)慣濫用 !important 去解決,這又循環(huán)導(dǎo)致了后續(xù)更混亂的樣式結(jié)構(gòu)。
基于讓 CSS 得到更好的控制和管理的背景,CSS @layer 應(yīng)運(yùn)而生。
CSS Cascade Layers,也叫做CSS級(jí)聯(lián)層,是Cascading and Inheritance Level5 規(guī)范中新增了一個(gè)新的 CSS 特性。
@layer聲明了一個(gè) 級(jí)聯(lián)層, 同一層內(nèi)的規(guī)則將級(jí)聯(lián)在一起, 這給予了開發(fā)者對(duì)層疊機(jī)制的更多控制。語法也非常簡單,看這樣一個(gè)例子:
@layer utilities {
/* 創(chuàng)建一個(gè)名為 utilities 的級(jí)聯(lián)層 */
}
這樣,我們就創(chuàng)建一個(gè)名為 utilities 的 @layer 級(jí)聯(lián)層。
@layer規(guī)則可以通過三種方式其一來創(chuàng)建級(jí)聯(lián)層。第一種方法如上方代碼所示,它創(chuàng)建了一個(gè)塊級(jí)的@規(guī)則,其中包含作用于該層內(nèi)部的CSS規(guī)則。
@layer utilities {
.padding-sm {
padding: .5rem;
}
.padding-lg {
padding: .8rem;
}
}
一個(gè)級(jí)聯(lián)層同樣可以通過 @import 來創(chuàng)建,規(guī)則存在于被引入的樣式表內(nèi):
@import(utilities.css) layer(utilities);
你也可以創(chuàng)建帶命名的級(jí)聯(lián)層,但不指定任何樣式。例如,單一的命名層:
@layer utilities
或者,多個(gè)命名層也可以被同時(shí)定義。例如:
@layer theme, layout, utilities
這一做法很有用,因?yàn)閷幼畛醣恢付ǖ捻樞驔Q定了它是否有父級(jí)層。對(duì)于聲明而言,如果同一聲明在多個(gè)級(jí)聯(lián)層中被指定,最后一層中的將優(yōu)先于其他層。
因此,在上面的例子中,如果 theme 層和 utilities 層中存在沖突的規(guī)則,那么 utilities 層中的將優(yōu)先被應(yīng)用。
即使 utilities 層中規(guī)則的 優(yōu)先級(jí)低于 theme 層中的,該規(guī)則仍會(huì)被應(yīng)用。一旦級(jí)聯(lián)層順序建立之后,優(yōu)先級(jí)和出現(xiàn)順序都會(huì)被忽略。
這將使創(chuàng)建CSS選擇器變得更加簡單,因?yàn)槟悴恍枰_保每一個(gè)選擇器都有足夠高的優(yōu)先級(jí)來覆蓋其他沖突的規(guī)則,你只需要確保它們出現(xiàn)在一個(gè)順序更靠后的級(jí)聯(lián)層中。
注:在已經(jīng)聲明級(jí)聯(lián)層的名字后,它們的順序隨即被確立,你可以重復(fù)聲明某級(jí)聯(lián)層的名字來向其添加CSS規(guī)則。這些樣式將被附加到該層的末尾,且級(jí)聯(lián)層之間的順序不會(huì)改變。
其他不屬于任何一級(jí)聯(lián)層的樣式將被集中到同一匿名層,并置于所有層的前部,這意味著任何級(jí)聯(lián)層內(nèi)定義的規(guī)則都將覆蓋外部聲明的規(guī)則。
級(jí)聯(lián)層允許嵌套,例如:
@layer framework {
@layer layout {
}
}
向 layout 層內(nèi)部的 framework 層附加規(guī)則,只需用 . 連接這兩層。
@layer framework.layout {
p {
margin-block: 1rem;
}
}
如果創(chuàng)建了一個(gè)級(jí)聯(lián)層但并未指定名字,例如:
@layer {
p {
margin-block: 1rem;
}
}
那么則稱為創(chuàng)建了一個(gè)匿名層。除創(chuàng)建后無法向其添加規(guī)則外,該層和其他命名層功能一致。
@layer [ <layer-name># | <layer-name>? {
<stylesheet>
} ]
級(jí)聯(lián)層可以通過多種方式聲明:
1、使用@layer 塊規(guī)則,并立即為其分配樣式:
@layer reset {
* { /* Poor Man's Reset */
margin: 0;
padding: 0;
}
}
2、使用規(guī)則@layer 語句,沒有指定任何樣式:
@layer reset;
3、將@import 與layer關(guān)鍵字或layer()函數(shù)一起使用
@import(reset.css) layer(reset);
以上每一個(gè)都創(chuàng)建了一個(gè)名為 的級(jí)聯(lián)層reset。
級(jí)聯(lián)層會(huì)按它們聲明的順序排序。
在下面的例子中,我們建立四個(gè)級(jí)聯(lián)層:reset,base,theme,和utilities。
@layer reset { /* 創(chuàng)建級(jí)聯(lián)層 “reset” */
* {
margin: 0;
padding: 0;
}
}
@layer base { /* 創(chuàng)建級(jí)聯(lián)層 “base” */
…
}
@layer theme { /* 創(chuàng)建級(jí)聯(lián)層 “theme” */
…
}
@layer utilities { /* 創(chuàng)建級(jí)聯(lián)層 “utilities” */
…
}
按照它們的聲明順序,層順序變?yōu)椋?/span>
reset
base
theme
utilities
重復(fù)使用級(jí)聯(lián)層名稱時(shí),樣式將附加到現(xiàn)有級(jí)聯(lián)層。級(jí)聯(lián)層的順序保持不變,因?yàn)橹挥械谝淮蔚某霈F(xiàn)已經(jīng)確定順序:
@layer reset { /* 創(chuàng)建第一個(gè)級(jí)聯(lián)層 “reset” */
…
}
@layer base { /* 創(chuàng)建第二個(gè)級(jí)聯(lián)層 “base” */
…
}
@layer theme { /* 創(chuàng)建第三個(gè)級(jí)聯(lián)層 “theme” */
…
}
@layer utilities { /* 創(chuàng)建第四個(gè)級(jí)聯(lián)層 “utilities” */
…
}
@layer base { /* 會(huì)將樣式添加至級(jí)聯(lián)層“base” */
…
}
重新使用級(jí)聯(lián)層名稱時(shí)層順序保持不變的使@layer 語法變得更加方便和嚴(yán)謹(jǐn)。使用它,可以預(yù)先建立圖層順序,然后將所有 CSS 附加到它:
@layer reset; /* 創(chuàng)建第一個(gè)級(jí)聯(lián)層 “reset” */
@layer base; /* 創(chuàng)建第二個(gè)級(jí)聯(lián)層 “base” */
@layer theme; /* 創(chuàng)建第三個(gè)級(jí)聯(lián)層“theme” */
@layer utilities; /* 創(chuàng)建第四個(gè)級(jí)聯(lián)層 “utilities” */
@layer reset { /* 添加樣式至級(jí)聯(lián)層 “reset” */
…
}
@layer theme { /* 添加樣式至級(jí)聯(lián)層 “theme” */
…
}
@layer base { /* 添加樣式至級(jí)聯(lián)層 “base” */
…
}
@layer theme { /* 添加樣式至級(jí)聯(lián)層 “theme” */
…
}
當(dāng)然你可以用更短的語法來聲明級(jí)聯(lián)層,
@layer reset, base, theme, utilities;
從上面可以看出,多個(gè)級(jí)聯(lián)層被聲明時(shí),最后一個(gè)級(jí)聯(lián)層的聲明會(huì)獲勝。像這樣,
@import(reset.css) layer(reset); /* 第一個(gè)級(jí)聯(lián)層 */
@layer base { /* 第二個(gè)級(jí)聯(lián)層 */
form input {
font-size: inherit;
}
}
@layer theme { /*第三個(gè)級(jí)聯(lián)層 */
input {
font-size: 2rem;
}
}
按以往CSS級(jí)聯(lián)來進(jìn)行分析的話,form input(多層級(jí))的優(yōu)先級(jí)會(huì)大于input,但是由于級(jí)聯(lián)層所起的作用,@layer theme的input會(huì)取勝。
級(jí)聯(lián)層支持嵌套使用,如下:
@layer base { /* 第一個(gè)級(jí)聯(lián)層*/
p { max-width: 70ch; }
}
@layer framework { /* 第二個(gè)級(jí)聯(lián)層 */
@layer base { /* 第二級(jí)聯(lián)層的嵌套子級(jí)聯(lián)層1 */
p { margin-block: 0.75em; }
}
@layer theme { /* 第二級(jí)聯(lián)層的嵌套子級(jí)聯(lián)層2 */
p { color: #222; }
}
}
在這個(gè)例子中有兩個(gè)級(jí)聯(lián)外層:
base
framework
該framework層本身也包含兩層:
base
theme
如果要將樣式附加到嵌套級(jí)聯(lián)層,需要使用以下全名來引用它,
@layer framework {
@layer default {
p { margin-block: 0.75em; }
}
@layer theme {
p { color: #222; }
}
}
@layer framework.theme {
/* 這些樣式會(huì)被添加到@layer framework層里面的theme層 */
blockquote { color: rebeccapurple; }
}
@media (min-width: 30em) {
@layer layout {
.title { font-size: x-large; }
}
}
@media (prefers-color-scheme: dark) {
@layer theme {
.title { color: white; }
}
}
如果第一個(gè)@media (min-width: 30em)匹配(基于視口尺寸),則layout級(jí)聯(lián)層層將在圖層順序中排在第一位。如果只有@media (prefers-color-scheme: dark)匹配,theme則將是第一層。
如果兩者匹配,則圖層順序?qū)閘ayout, theme。如果沒有匹配,則不定義層。
CSS的全稱是
Cascading Style Sheets,
中文翻譯為“層疊樣式表”。
1、聲明沖突
● 什么是聲明沖突?
舉個(gè)栗子:
【1】代碼:
【2】顯示效果:
通過上述栗子,我們可以看出什么是“聲明沖突”。
所謂“聲明沖突”就是同一樣式,多次應(yīng)用到同一元素。
● 怎么解決聲明沖突?
沖突 !=錯(cuò)誤
通過CSS層疊解決聲明沖突,瀏覽器會(huì)自動(dòng)處理。
2、層疊
● 層疊的三部曲
● 比較重要性(優(yōu)先級(jí))
先了解幾個(gè)概念:
① 樣式表的分類:
I、用戶樣式表
瀏覽器的用戶提供。
II、作者樣式表
網(wǎng)頁開發(fā)者提供。
III、默認(rèn)樣式表
瀏覽器自身提供。
② 重要聲明與普通聲明
若屬性值后跟上! important 就表示這是一條重要聲明,反之則是普通聲明。
注意:一般不建議使用! important ,在實(shí)際開發(fā)中,需求在不斷變化,重要聲明可能變成普通申明。
③ 重要性(優(yōu)先級(jí))從高到低:
重要性(優(yōu)先級(jí))高的會(huì)替換重要性(優(yōu)先級(jí))低的樣式。
● 比較特殊性
比較特殊性,看選擇器的適用范圍的大小。
總體規(guī)則:選擇器選中的范圍越窄,越特殊。
越特殊的樣式會(huì)被最終應(yīng)用。
特殊性從高到低:內(nèi)聯(lián)樣式——id選擇器——類選擇器——元素選擇器——通配符選擇器
在比較特殊性時(shí),每個(gè)沖突的聲明會(huì)生成四位數(shù)(a b c d)來比較特殊性,值越大,越特殊。
千位:如果是內(nèi)聯(lián)樣式,記1,否則記0。
看下面
百位:等于選擇器中id選擇器的數(shù)量
十位:等于選擇器中所有類選擇器、屬性選擇器、偽類選擇器的數(shù)量
個(gè)位:等于選擇器中所有元素選擇器、偽元素選擇器的數(shù)量
● 比較源次序
當(dāng)CSS樣式的重要性和特殊性都相同時(shí),
比較源次序,簡單說就是最后出現(xiàn)的聲明勝出,其他的淘汰。
3、小試牛刀
● html代碼
● css代碼
當(dāng)元素的一個(gè)繼承屬性 (inherited property)沒有指定值時(shí),則取父元素的同屬性的計(jì)算值 computed value。只有文檔根元素取該屬性的概述中給定的初始值(initial value)(這里的意思應(yīng)該是在該屬性本身的定義中的默認(rèn)值)。
通常,跟文字內(nèi)容相關(guān)的屬性都能被繼承。
1、繼承屬性的一個(gè)典型例子就是 color 屬性。給出以下樣式規(guī)則:
p { color: green; }
<p>This paragraph has <em>emphasized text</em> in it.</p>
…文本 "emphasized text" 就會(huì)呈現(xiàn)為綠色,因?yàn)?em 元素繼承了 p 元素 color 屬性的值,而沒有獲取 color 屬性的初始值(這個(gè) color 值用于頁面沒有指定 color 時(shí)的根元素)。
2、非繼承屬性的一個(gè)典型例子就是 border 屬性。給出以下樣式規(guī)則:
p { border: medium solid; }
<p>This paragraph has <em>emphasized text</em> in it.</p>
…文本 "emphasized text" 就沒有邊框,因?yàn)?border-style 屬性的初始值為none。
3、如何查看一個(gè)元素是默認(rèn)繼承還是默認(rèn)不繼承?
● 查看權(quán)威網(wǎng)站:
https://developer.mozilla.org/zh-CN/docs/Web/HTML
● 比如查看background是否默認(rèn)繼承
4、特殊CSS屬性值
- inherit:手動(dòng)(強(qiáng)制)繼承,將父元素的值取出應(yīng)用到該元素
- initial:初始值,將該屬性設(shè)置為默認(rèn)值
1、CSS渲染過程
● 確定聲明值
參考樣式表中沒有沖突的聲明,作為CSS屬性值
● 層疊沖突
對(duì)樣式表有沖突的聲明使用層疊規(guī)則,確定CSS屬性值
● 使用繼承
對(duì)仍然沒有值的屬性,若可以繼承,則繼承父元素的值
● 使用默認(rèn)值
對(duì)仍然沒有值的屬性,使用默認(rèn)值
2、小試牛刀
問題:
a元素中的“”顯示的是什么顏色?
p元素中的“Python大星”顯示的是什么顏色?
why?歡迎評(píng)論區(qū)留言。
>>>《Python Web全棧之旅04--Web前端●走入CSS的世界》
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。