HTML5語義標(biāo)簽的兼容問題

先說點(diǎn)基礎(chǔ)的。

HTML的發(fā)展歷程

我們在學(xué)習(xí)HTML的過程中,總是聽到HTML5這個詞,這到底是是什么意思呢。大概可以這么想就是相當(dāng)于HTML的第五個版本,那么之前的版本是什么樣子呢。
下面請看早期的HTML4.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
</head>
<body>
    這是HTML4的嚴(yán)格模式,注意DTD里面的strict.dtd
   快捷方式: html:4s
</body>
</html>

HTML4的松散模式

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
</head>
<body>
    這是HTML4的松散模式,注意DTD里面的loose.dtd
   快捷方式: html:4t
</body>
</html>

再早起有XHTML的版本

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
</head>
<body>
    XHTML的嚴(yán)格模式
    快捷方式:html:xs
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
</head>
<body>
    XHTML的松散模式
    快捷方式:html:xt
</body>
</html>

上門的幾個版本都有共同特點(diǎn),都包含一個繁雜的DTD,或者稱之為DOCTYPE 文件類型。再來看看我們目前的HTML5的版本。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    沒有了復(fù)雜的DOCTYPE
    快捷方式:html:5
</body>
</html>

是否有種耳目一新的感覺呢。當(dāng)然了HTML5不只是這里簡單的改變了這個DTD的內(nèi)容。我們今天討論一下其中比較簡單的一部分:語義化標(biāo)簽。

語義化標(biāo)簽

語義化是所有計算機(jī)語言追求的目標(biāo),就是說你只要看到寫出來的內(nèi)容就知道他是什么定西。比如HTML5中引入了header標(biāo)簽標(biāo)示網(wǎng)頁的頭部,footer標(biāo)示網(wǎng)頁的底部,字面意思也可以理解成網(wǎng)頁的腳部。這些標(biāo)簽的加入使得HTML的代碼具有了更高的可讀性。
比如,我們之前的網(wǎng)頁結(jié)構(gòu)如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div class="header">網(wǎng)頁的頭部</div>
    <div class="nav">網(wǎng)頁的主體內(nèi)容</div>
    <div class="footer">網(wǎng)頁的腳部</div>
</body>
</html>

這里網(wǎng)頁的每一個部分都是使用div來實現(xiàn)的。幾乎沒有任何可讀性。但是在HTML5中我們的結(jié)構(gòu)如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <header></header>
    <section></section>
    <footer></footer>
</body>
</html>

基本上我們一眼就能夠看出來每一部分代碼的作用以及內(nèi)容。這對我們開發(fā)以及維護(hù)來說是非常友好的,同時也非常的有利于網(wǎng)頁SEO的。
但是問題來了:語義化標(biāo)簽在IE中存在一些問題。請看下面的代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        header{
            width: 100%;
            height: 200px;
            background: red;
        }
    </style>
</head>
<body>
    <header></header>
    <nav></nav>
    <footer></footer>
</body>
</html>

在Chrome的運(yùn)行結(jié)果如下圖。

Chrome運(yùn)行結(jié)果

但是在IE8運(yùn)行如下

IE8以下如下

黃色的部分是開發(fā)者工具選中時的盒子模型,這說明IE8以下沒有將header按照正常的標(biāo)簽進(jìn)行樣式渲染。說白了就是不認(rèn)識他,那應(yīng)該如何處理這種情況呢。

方法一

  • 第一步標(biāo)簽必須設(shè)置為塊標(biāo)簽
header{
    width: 100%;
    height: 200px;  
    background: red;
    display:block;
}
  • 第二部使用js創(chuàng)建對應(yīng)的標(biāo)簽(必須添加在網(wǎng)頁的頭部)
    <script>
        document.createElement('header');
    </script>

這里創(chuàng)建的標(biāo)簽不需要手動添加在DOM中,網(wǎng)頁就會識別這樣的標(biāo)簽了。
運(yùn)行結(jié)果如下:


缺點(diǎn):這種方式雖然能夠解決這個問題,但是每一種語義化的標(biāo)簽都需要js去創(chuàng)建標(biāo)簽,這是很不合理的。

方法二

在第一種方法的基礎(chǔ)上,我們在不確定哪些語義化標(biāo)簽可能會用到需要去創(chuàng)建,我們可以使用html5shiv.js插件實現(xiàn)這部分工作。
插件源碼地址:https://github.com/aFarkas/html5shiv/blob/master/src/html5shiv.js
CDN地址:https://www.bootcdn.cn/html5shiv/
只需要在頁面中引入對應(yīng)的腳本,就能夠?qū)崿F(xiàn)語義化標(biāo)簽的兼容。

<script src="html5shiv.js"></script>

當(dāng)然插件介紹還可以兼容其他一些瀏覽器比如低版本的Safari以及FF。

The HTML5 Shiv enables use of HTML5 sectioning elements in legacy Internet Explorer and provides basic HTML5 styling for Internet Explorer 6-9, Safari 4.x (and iPhone 3.x), and Firefox 3.x.

最后: 不是所有的瀏覽器都有必要加載這么一段js腳本,所以需要我們按需加載一下。

<!--[if lt IE 9]>
    <script src="html5shiv.js"></script>
<![endif]-->

關(guān)于上面的條件注釋語法,可以觀看我的另一篇文章。HTML條件注釋

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • HTML、XML、XHTML 有什么區(qū)別 1.HTML 是用來描述網(wǎng)頁的一種語言,指的是超文本標(biāo)記語言 (Hype...
    饑人谷_牛牛閱讀 815評論 0 2
  • HTML、XML、XHTML有什么區(qū)別? XMLXML是The Extensible Markup Languag...
    zx9426閱讀 509評論 0 1
  • 格式后期處理。 Jeremy Keith在 Fronteers 2010 上的主題演講 今天我想跟大家談一談HTM...
    LordZhou閱讀 1,208評論 0 17
  • 本文主要介紹Html5和Html4的區(qū)別。 語法的改變 內(nèi)容類型HTML5 的文件擴(kuò)展符與內(nèi)容類型保持不變。擴(kuò)展符...
    layjoy閱讀 1,932評論 0 23
  • 問答題1 /72瀏覽器頁面有哪三層構(gòu)成,分別是什么,作用是什么?參考答案構(gòu)成:結(jié)構(gòu)層、表示層、行為層分別是:HTM...
    _Yfling閱讀 1,293評論 0 23

友情鏈接更多精彩內(nèi)容