天這篇是我們正式開篇的第一篇文章,我想和你聊聊 HTML。
我猜屏幕那一邊的你估計(jì)會(huì)說:“HTML 我很熟悉了,每天寫,這不是初級(jí)程序員才學(xué)的內(nèi)容
么,這我還能不會(huì)嗎?”
其實(shí)在我看來,HTML 并不簡單,它是典型的“入門容易,精通困難”的一部分知識(shí)。深刻理
解 HTML 是成為優(yōu)秀的前端工程師重要的一步。
我們?cè)谏弦黄恼轮兄v到了,HTML 的標(biāo)簽可以分為很多種,比如 head 里面的元信息類標(biāo)
簽,又比如 img、video、audio 之類的替換型媒體標(biāo)簽。我今天要講的標(biāo)簽是:語義類標(biāo)簽。
語義類標(biāo)簽是什么,使用它有什么好處?
語義類標(biāo)簽也是大家工作中經(jīng)常會(huì)用到的一類標(biāo)簽,它們的特點(diǎn)是視覺表現(xiàn)上互相都差不多,
主要的區(qū)別在于它們表示了不同的語義,比如大家會(huì)經(jīng)常見到的 section、nav、p,這些都是
語義類的標(biāo)簽。
語義是我們說話表達(dá)的意思,多數(shù)的語義實(shí)際上都是由文字來承載的。語義類標(biāo)簽則是純文字
的補(bǔ)充,比如標(biāo)題、自然段、章節(jié)、列表,這些內(nèi)容都是純文字無法表達(dá)的,我們需要依靠語
義標(biāo)簽代為表達(dá)。
在講語義之前,我們來說說為什么要用語義。
現(xiàn)在我們很多的前端工程師寫起代碼來,多數(shù)都不用復(fù)雜的語義標(biāo)簽, 只靠 div 和 span 就能
走天下了。
這樣做行不行呢?毫無疑問答案是行。那這樣做好不好呢?按照正確的套路,我應(yīng)該說不好,
但是在很多情況下,答案其實(shí)是好。
這是因?yàn)樵诂F(xiàn)代互聯(lián)網(wǎng)產(chǎn)品里,HTML 用于描述“軟件界面”多過于“富文本”,而軟件界面
里的東西,實(shí)際上幾乎是沒有語義的。比如說,我們做了一個(gè)購物車功能,我們一定要給每個(gè)
購物車?yán)锏纳唐诽咨?ul 嗎?比如說,加入購物車這個(gè)按鈕,我們一定要用 Button 嗎?
實(shí)際上我覺得沒必要,因?yàn)檫@個(gè)場(chǎng)景里面,跟文本中的列表,以及表單中的 Button,其實(shí)已
經(jīng)相差很遠(yuǎn)了,所以,我支持在任何“軟件界面”的場(chǎng)景中,直接使用 div 和 span。
不過,在很多工作場(chǎng)景里,語義類標(biāo)簽也有它們自己無可替代的優(yōu)點(diǎn)。正確地使用語義標(biāo)簽可
以帶來很多好處。語義類標(biāo)簽對(duì)開發(fā)者更為友好,使用語義類標(biāo)簽增強(qiáng)了可讀性,即便是在沒
有 CSS 的時(shí)候,開發(fā)者也能夠清晰地看出網(wǎng)頁的結(jié)構(gòu),也更為便于團(tuán)隊(duì)的開發(fā)和維護(hù)。除了
對(duì)人類友好之外,語義類標(biāo)簽也十分適宜機(jī)器閱讀。它的文字表現(xiàn)力豐富,更適合搜索
引擎檢索(SEO),也可以讓搜索引擎爬蟲更好地獲取到更多有效信息,有效提升網(wǎng)頁的搜
索量,并且語義類還可以支持讀屏軟件,根據(jù)文章可以自動(dòng)生成目錄等等。不過,不恰當(dāng)?shù)厥?/p>
用語義標(biāo)簽,反而會(huì)造成負(fù)面作用。這里我們舉一個(gè)常見的誤區(qū)作為例子。我們都知道 ul 是
無序列表,ol 是有序列表,所以很多接觸過語義這個(gè)概念,半懂不懂的前端工程師,特別喜歡
給所有并列關(guān)系的元素都套上 ul。實(shí)際上, ul 是長成下面的這種樣子的 (以下來自 HTML 標(biāo)準(zhǔn))。
I have lived in the following countries:
ul 多數(shù)出現(xiàn)正在行文中間,它的上文多數(shù)在提示:要列舉某些項(xiàng)。但是,如果所有并列關(guān)系都
用 ul,會(huì)造成大量冗余標(biāo)簽。錯(cuò)誤地使用語義標(biāo)簽,會(huì)給機(jī)器閱讀造成混淆、增加嵌套,給
CSS 編寫加重負(fù)擔(dān)。所以,對(duì)于語義標(biāo)簽,我的態(tài)度是:“用對(duì)”比“不用”好,“不
用”比“用錯(cuò)”好。當(dāng)然了,我覺得有理想的前端工程師還是應(yīng)該去追求“用對(duì)”它們。
與 JavaScript 這樣嚴(yán)格的編程語言相比,HTML 中語義標(biāo)簽的使用更接近我們平常說話用的
自然語言。我們說話并沒有唯一的標(biāo)準(zhǔn)措辭,語義標(biāo)簽的使用也是一樣。下面,我挑選了幾種
(我認(rèn)為)比較重要的語義標(biāo)簽使用場(chǎng)景,來為你介紹一下。
作為自然語言延伸的語義類標(biāo)簽其實(shí)語義問題不僅僅屬于理科,它還是個(gè)文科問題。所以我們
這里講語義標(biāo)簽的使用的第一個(gè)場(chǎng)景,也是最自然的使用場(chǎng)景,就是:作為自然語言和
純文本的補(bǔ)充,用來表達(dá)一定的結(jié)構(gòu)或者消除歧義。
我們先來看看“表達(dá)一定的結(jié)構(gòu)”這個(gè)場(chǎng)景。在日語中,有一個(gè)語法現(xiàn)象叫做:ルビ,它的讀
音是 ruby(著名的 ruby 語言就是據(jù)此命名的),它中文的意思大約類似于注音或者意思的注
解,它的形式可以看下圖:圖中的例子選自動(dòng)畫片《某科學(xué)的超電磁炮》第二季第一話。圖中
把 teleport 放在空間移動(dòng)上方的用法,就是日文中 ruby 的用法。“空間移動(dòng)”是動(dòng)畫中白井
黑子的技能,這里動(dòng)畫字幕上寫的是“空間移動(dòng)”,動(dòng)畫里的臺(tái)詞則用了英文發(fā)
音“Teleport”,這里就形成了一個(gè)使用
ruby 的場(chǎng)景。ruby 的這個(gè)形式,在中國的網(wǎng)友中間最近被玩出了新花樣,比如表情包。
有時(shí)候微信聊天,不能用 ruby 這樣的東西真的是好急啊,只好用括號(hào)代替,效果真是差了不
少。在 HTML5 中,就引入了這個(gè)表示 ruby 的標(biāo)簽,它由 ruby、rt、rp 三個(gè)標(biāo)簽來實(shí)現(xiàn)。
所以說,這些情況里存在的語義,其實(shí)原本就存在了,只是我們用純文字是沒法表達(dá)的,
HTML作為一種“超文本”語言,支持這些文字表達(dá)就是必要的了。還有一種情況是,HTML
的有些標(biāo)簽實(shí)際上就是必要的,甚至必要的程度可以達(dá)到:如果沒有這個(gè)標(biāo)簽,文字會(huì)產(chǎn)生歧
義的程度。
這里我們可以介紹一下 em 標(biāo)簽。
我們看看這句話,
1. 今天我吃了一個(gè)蘋果.
再比如:
昨天我吃了一個(gè)香蕉。
今天我吃了一個(gè)蘋果。
看上去它很清楚,但是實(shí)際上,這句話放到不同上下文中,可能表達(dá)完全不
同的意思。
昨天我吃了兩個(gè)蘋果。
今天我吃了一個(gè)蘋果。
試著讀一讀,這兩段里面的“今天我吃了一個(gè)蘋果”,你是不是發(fā)現(xiàn)讀音不自覺地發(fā)生了變化?
實(shí)際上,不僅僅是讀音,這里的意思也發(fā)生了變化。前一段中,表示我今天吃的是蘋果,而不是別的什么東西,后一段中,則表示我今天只吃了一個(gè)蘋果,沒有多吃。
當(dāng)沒有上下文時(shí),如何消除歧義呢?這就要用到我們的 em 標(biāo)簽了。em 表示重音:
通過 em 標(biāo)簽,我們可以消除這樣的歧義。
一些文章常常會(huì)拿 em 和 strong 做對(duì)比,實(shí)際上,我們只要理解了 em 的真正意思,它和
strong 可謂天差地別,并沒有任何混淆的可能。
作為標(biāo)題摘要的語義類標(biāo)簽
介紹完自然語言的語義場(chǎng)景后,我想介紹的另一個(gè)語義重要使用場(chǎng)景,就是文章的結(jié)構(gòu)。中國古
代小說就形成了“章 - 回”的概念,西方的戲劇也有幕的區(qū)分,所以人類的自然語言作品也是如出一轍。
HTML 也應(yīng)該支持這樣的需求。HTML 語義標(biāo)簽中,有不少是用于支持這樣的結(jié)構(gòu)的標(biāo)簽。
語義化的 HTML 能夠支持自動(dòng)生成目錄結(jié)構(gòu),HTML 標(biāo)準(zhǔn)中還專門規(guī)定了生成目錄結(jié)構(gòu)的算
法,即使我們并不打算深入實(shí)踐語義,也應(yīng)該盡量在大的層面上保證這些元素的語義化使用。
首先我們需要形成一個(gè)概念,一篇文檔會(huì)有一個(gè)樹形的目錄結(jié)構(gòu),它由各個(gè)級(jí)別的標(biāo)題組成。這
個(gè)樹形結(jié)構(gòu)可能不會(huì)跟 HTML 元素的嵌套關(guān)系一致。
這段 HTML 幾乎是平鋪的元素,但是它的標(biāo)題結(jié)構(gòu)是:
HTML 語義
弱語義
今天我吃了一個(gè) <em> 蘋果 </em>。
今天我吃了 <em> 一個(gè) </em> 蘋果。
例如:
.文本類屬性
① 字體類型
語法:font-family:字體1,字體2,字體3...;
body{font-family: "宋體,楷書"; }
設(shè)置多個(gè)字體時(shí),瀏覽器會(huì)優(yōu)先識(shí)別字體1,找不到則識(shí)別字體2,都無法識(shí)別時(shí),顯示瀏覽器默認(rèn)字體。
② 字體大小
語法:font-size:數(shù)值+單位;
p{font-size: 12px}
字體大小單位有px、em、rem、pt;瀏覽器默認(rèn)大小為16px;字體大小一般設(shè)置為偶數(shù)值;谷歌瀏覽器識(shí)別最小字體為12px。
③ 字體加粗
p{font-weight: normal}
屬性值:normal常規(guī)、bold加粗、bolder更粗、100-900數(shù)值
數(shù)值100-900字體加粗程度不同,其中100-500為常規(guī)字體,600-900為加粗字體。
④字體顏色
p{color: 顏色值;}
顏色值寫法有三種:直接寫顏色單詞,如red;十六進(jìn)制寫法,如color:#000;rgb寫法 ,color:rgb(0,0,0);
⑤字體傾斜
font-style: normal;
font-style: italic; 傾斜
⑥復(fù)合寫法
font:字體大小/行高 字體類型;
font: 12px/24px "宋體"
⑦行高
語法: line-height:數(shù)值+單位;
數(shù)值不能為負(fù)值
⑧水平對(duì)齊方式
語法:text-align:left; 左對(duì)齊
text-align:center 居中
text-align:right 右對(duì)齊
text-align:justify 兩端對(duì)齊,只對(duì)英文起作用
⑨文本修飾
text-decoration:none; 去掉文本修飾,可去掉超鏈接(對(duì)a標(biāo)簽使用)的下劃線
text-decoration:underline; 下劃線
text-decoration:overline; 上劃線
text-decoration:line-through; 刪除線
文本縮進(jìn)
text-indent:數(shù)值+單位;
數(shù)值為正向后縮進(jìn),負(fù)值向前縮進(jìn)
強(qiáng)制在一行顯示
white-space:nowrap;
長單詞換行
word-warp:break-word;
2.背景類屬性
語法:background-color:顏色值;
屬性值同字體顏色屬性值相同用法
語法:background-image:url(圖片路徑);
語法:background-position:left;
水平方向:left、center、right
垂直方向:top、center、bottom
屬性值為數(shù)值時(shí),水平方向向右為正,向左為負(fù),垂直方向向下為正,向上為負(fù)。水平和垂直方向都居中時(shí)可寫background-position:center;
background-attachment:scroll;
屬性值:scroll 默認(rèn)值;fixed 固定
當(dāng)容器出現(xiàn)滾動(dòng)條時(shí),背景圖固定不滾動(dòng),可設(shè)置為fixed。
語法:background-repeat:repeat;
屬性值:repeat平鋪;no-repeat;repeat-x橫向平鋪;repeat-y縱向平鋪。
background:背景圖 背景平鋪 背景位置
background:url(13211.jpg) no-repeat right bottom;
3.列表屬性
語法:list-style-type:disc;
屬性值:disc實(shí)心圓;circle空心圓;square實(shí)心方塊;decimal數(shù)字;none去除列表符號(hào)。
4.偽類選擇器
語法: 選擇符:hover{屬性:屬性值;}
p:hover{color:red;}
超鏈接a標(biāo)簽的四個(gè)狀態(tài):
a) a:link 超鏈接的初始狀態(tài),鏈接沒有被訪問過時(shí)的狀態(tài)
b) a:visited 鏈接訪問過后的狀態(tài)
c) a:hover 鼠標(biāo)懸停在超鏈接上的狀態(tài)(鼠標(biāo)滑過)
d) a:active 超鏈接被激活時(shí)的狀態(tài)(鼠標(biāo)按下)
display -- block;(轉(zhuǎn)換為塊元素&& 顯示) none(隱藏 && 不保留原來的位置) -- 重要!
visibility -- visible(顯示) hidden (隱藏 && 保留原來的位置 )
復(fù)習(xí):
overflow:hidden; 1.之前解決父子關(guān)系垂直嵌套的合并塌陷問題。2.清除浮動(dòng)
overflow -- hidden 內(nèi)容超出的部分隱藏(重點(diǎn)的) scroll(強(qiáng)制出現(xiàn)滾動(dòng)條樣式) auto(根據(jù)內(nèi)容多少來判斷是否出現(xiàn)滾動(dòng)條 )
目的:為了有效地減少服務(wù)器接受和發(fā)送請(qǐng)求的次數(shù),提高頁面的加載速度
實(shí)現(xiàn)原理: 只請(qǐng)求一張圖 --只是展示不同位置的小圖。
案例使用:
background-image 背景圖片
background-repeat 是否平鋪
background-position 背景定位
小小注意點(diǎn):
1.精靈技術(shù)主要針對(duì)背景圖片,插入的img不需要這個(gè)技術(shù)
2.需要測(cè)量每個(gè)小背景圖片的大小和位置
3.給盒子指定小的背景圖片時(shí),背景定位基本都是負(fù)值
##
優(yōu)勢(shì):瀏覽器支持性比較好,靈活性大;體積小,加載速度快,節(jié)省帶寬流量;減輕服務(wù)器壓力。
注意:字體圖標(biāo)是字體 不是圖片
1.把包包里面的font文件夾復(fù)制出來一份,放在我們項(xiàng)目根目錄。
2.在html文件標(biāo)簽里面添加結(jié)構(gòu)
3.在html文件樣式style里面聲明字體:告訴代碼和別人使用我們自己自定義的字體(一定注意路徑問題)
4.給盒子設(shè)置字體即可
原來的不能刪除,繼續(xù)使用,此時(shí)我們需要這樣做
把壓縮包里面的selection.json 從新上傳,然后,選中自己想要新的圖標(biāo),從新下載壓縮包,替換原來文件夾即可。
重新導(dǎo)入selection.json 生成 新的字體包--》追加選擇字體 --》點(diǎn)擊下載 --》把之前項(xiàng)目中fonts刪除--》替換成新的字體包里面的fonts文件夾
本質(zhì):還是利用了盒子的邊框
做法:
1.寬高為 零
2.四個(gè)邊都要的,只保留我們需要的邊框顏色,其他的 顏色透明即可。
3.為了照顧兼容問題,設(shè)置:line-height:0; font-size:0;
三角形案例:
.demo {
position: relative;
width: 200px;
height: 100px;
background-color: pink;
}
i {
position: absolute;
top: 35px;
left: 200px;
width: 0;
height: 0;
border: 15px solid transparent;
border-left-color: hotpink;
}
<div class="demo">
<i></i>
</div>
<ul>
<li style="cursor:default;">我是默認(rèn)的小白鼠標(biāo)樣式</li>
<li style="cursor:pointer;">我是鼠標(biāo)小手樣式</li>
<li style="cursor:move;">我是鼠標(biāo)移動(dòng)樣式</li>
<li style="cursor:text;">我是鼠標(biāo)文本樣式</li>
<li style="cursor:not-allowed;">我是鼠標(biāo)禁止樣式</li>
</ul>
?
cursor:pointer; -- 記住!
cursor:move; --記住!
cursor:not-allowed; --記住!
outline: 0/ none; ----- 去掉輪廓線
resize:none;
div {
border: 2px solid red;
}
img {
/* 這個(gè)屬性加給圖片本身,千萬不要加給圖片的父級(jí)盒子 */
vertical-align: middle;
}
?
<div>
<img src="images/ldh.jpg" alt="">
</div>
1.必須強(qiáng)制一行顯示 white-space:nowrap;
2.超出部分隱藏 overflow:hidden;
3.文字省略號(hào)代替超出的文本 text-overflow:ellipsis;
overflow: hidden;
/*文字省略號(hào)代替*/
text-overflow: ellipsis;
/* 彈性伸縮盒子模型顯示 */
display: -webkit-box;
/* 限制在一個(gè)塊元素顯示的文本的行數(shù) */
-webkit-line-clamp: 3;
/* 設(shè)置或檢索伸縮盒對(duì)象的子元素的排列方式 */
-webkit-box-orient: vertical;
前置知識(shí)點(diǎn):
relative -- 相對(duì)定位占位置
absolute --- 絕對(duì)定位不占位置
float ---- 浮動(dòng)不占位置
浮動(dòng) -- 壓不住下面標(biāo)流的圖片和文字。
text-align:center --- 給父親元素添加,可以讓子盒子(行內(nèi)塊/行內(nèi)元素)水平居中。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。