Bootstrap 的目標(biāo)是在最新的桌面和移動(dòng)瀏覽器上有最佳的表現(xiàn),也就是說(shuō),在較老舊的瀏覽器上可能會(huì)導(dǎo)致某些組件表現(xiàn)出的樣式有些不同,但是功能是完整的。
特別注意,我們堅(jiān)決支持這些瀏覽器的最新版本。在 Windows 平臺(tái),我們支持 Internet Explorer 8-11。請(qǐng)看下面列出的詳細(xì)信息。
Chrome | Firefox | Internet Explorer | Opera | Safari | |
---|---|---|---|---|---|
Android | 支持 | 支持 | N/A | 不支持 | N/A |
iOS | 支持 | N/A | 不支持 | 支持 | |
Mac OS X | 支持 | 支持 | 支持 | 支持 | |
Windows | 支持 | 支持 | 支持 | 支持 | 不支持 |
Bootstrap 在 Chromium 和 Linux 版 Chrome、Linux 版 Firefox 和 Internet Explorer 7 上的表現(xiàn)也是很不錯(cuò)的,雖然我們不對(duì)其進(jìn)行官方支持。
瀏覽器 bug 列表中列出了影響 Bootstrap 正常功能的瀏覽器 bug。
Internet Explorer 8 和 9 是被支持的,然而,你要知道,很多 CSS3 屬性和 HTML5 元素 -- 例如,圓角矩形和投影 -- 是肯定不被支持的。另外, Internet Explorer 8 需要 Respond.js 配合才能實(shí)現(xiàn)對(duì)媒體查詢(xún)(media query)的支持。
Feature | Internet Explorer 8 | Internet Explorer 9 |
---|---|---|
border-radius |
不支持 | 支持 |
box-shadow |
不支持 | 支持 |
transform |
不支持 |
支持, with -ms prefix |
transition |
不支持 | |
placeholder |
不支持 |
在開(kāi)發(fā)環(huán)境和生產(chǎn)(線上)環(huán)境需要支持 Internet Explorer 8 時(shí),請(qǐng)務(wù)必注意下面給出的警告。
如果 Respond.js 和 CSS 文件被放在不同的域名或子域名下面(例如,使用CDN)時(shí)需要一些額外的設(shè)置。請(qǐng)參考 RRespond.js 文檔 獲取詳細(xì)信息。
由于瀏覽器的安全機(jī)制,Respond.js 不能在通過(guò) file://
協(xié)議(打開(kāi)本地HTML文件所用的協(xié)議)訪問(wèn)的頁(yè)面上發(fā)揮正常的功能。如果需要測(cè)試 IE8 下面的響應(yīng)式特性,務(wù)必通過(guò) http 協(xié)議訪問(wèn)頁(yè)面(例如搭建 apache、nginx 等)。請(qǐng)參考 RRespond.js 文檔獲取更多信息。
@import
指令Respond.js 不支持通過(guò) @import
指令所引入的 CSS 文件。例如,Drupal 一般被配置為通過(guò) @import
指令引入CSS文件,Respond.js 對(duì)其將無(wú)法起到作用。請(qǐng)參考 Respond.js 文檔獲取更多信息。
當(dāng) box-sizing: border-box; 與 min-width、max-width、min-height 或 max-height 一同使用時(shí),IE8 不能完全支持 box-sizing 屬相。由于此原因,從 Bootstrap v3.0.1 版本開(kāi)始,我們不再為 .container 賦予 max-width 屬性。
當(dāng) @font-face
與 :before
在 IE8 下共同使用時(shí)會(huì)出現(xiàn)問(wèn)題。由于 Bootstrap 對(duì) Glyphicons 的樣式設(shè)置使用了這一組合方式,如果某個(gè)頁(yè)面被瀏覽器緩存了,并且此頁(yè)面不是通過(guò)點(diǎn)擊“刷新”按鈕或通過(guò) iframe 加載的,那么就會(huì)導(dǎo)致字體文件尚未加載的情況下就開(kāi)始繪制此頁(yè)面。當(dāng)鼠標(biāo)滑過(guò)頁(yè)面(body)時(shí),頁(yè)面上的某些圖標(biāo)就會(huì)顯現(xiàn),鼠標(biāo)滑過(guò)其他沒(méi)有顯現(xiàn)的圖標(biāo)時(shí),這些圖標(biāo)就能顯示出來(lái)了。請(qǐng)參考 issue #13863 了解詳細(xì)信息。
Bootstrap 不支持 IE 古老的兼容模式。為了讓 IE 瀏覽器運(yùn)行最新的渲染模式下,建議將此 <meta>
標(biāo)簽加入到你的頁(yè)面中:
<meta http-equiv="X-UA-Compatible" content=`"IE=edge"`>
按 F12
鍵打開(kāi) IE 的調(diào)試工具,就可以看到 IE 當(dāng)前的渲染模式是什么。
此 meta 標(biāo)簽被包含在了所有 Bootstrap 文檔和實(shí)例頁(yè)面中,為的就是在每個(gè)被支持的 IE 版本中擁有最好的繪制效果。
請(qǐng)參考 這個(gè)發(fā)表在 StackOverflow 上的問(wèn)題。
國(guó)內(nèi)瀏覽器廠商一般都支持兼容模式(即 IE 內(nèi)核)和高速模式(即 webkit 內(nèi)核),不幸的是,所有國(guó)產(chǎn)瀏覽器都是默認(rèn)使用兼容模式,這就造成由于低版本 IE (IE8 及以下)內(nèi)核讓基于 Bootstrap 構(gòu)建的網(wǎng)站展現(xiàn)效果很糟糕的情況。幸運(yùn)的是,國(guó)內(nèi)瀏覽器廠商逐漸意識(shí)到了這一點(diǎn),某些廠商已經(jīng)開(kāi)始有所作為了!
將下面的 <meta>
標(biāo)簽加入到頁(yè)面中,可以讓部分國(guó)產(chǎn)瀏覽器默認(rèn)采用高速模式渲染頁(yè)面:
<meta name="renderer" content="webkit">
目前只有360瀏覽器支持此<meta>
標(biāo)簽。希望更多國(guó)內(nèi)瀏覽器盡快采取行動(dòng)、盡快進(jìn)入高速時(shí)代!
Internet Explorer 10 并沒(méi)有對(duì) 屏幕的寬度 和 視口(viewport)的寬度 進(jìn)行區(qū)分,這就導(dǎo)致 Bootstrap 中的媒體查詢(xún)并不能很好的發(fā)揮作用。為了解決這個(gè)問(wèn)題,你可以引入下面列出的這段 CSS 代碼暫時(shí)修復(fù)此問(wèn)題:
@-ms-viewport { width: device-width; }
然而,這樣做并不能對(duì) Windows Phone 8 Update 3 (a.k.a. GDR3) 版本之前的設(shè)備起作用,由于這樣做將導(dǎo)致 Windows Phone 8 設(shè)備按照桌面瀏覽器的方式呈現(xiàn)頁(yè)面,而不是較窄的“手機(jī)”呈現(xiàn)方式,為了解決這個(gè)問(wèn)題,還需要加入以下 CSS 和 JavaScript 代碼來(lái)化解此問(wèn)題。
@-webkit-viewport { width: device-width; }
@-moz-viewport { width: device-width; }
@-ms-viewport { width: device-width; }
@-o-viewport { width: device-width; }
@viewport { width: device-width; }
if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
var msViewportStyle = document.createElement('style')
msViewportStyle.appendChild(
document.createTextNode(
'@-ms-viewport{width:auto!important}'
)
)
document.querySelector('head').appendChild(msViewportStyle)
}
請(qǐng)查看 Windows Phone 8 and Device-Width 以了解更多信息。
作為提醒,我們將上面的代碼加入到了所有 Bootstrap 文檔和實(shí)例頁(yè)面中。
OS X 上搭載的 v7.1 以前 Safari 和 iOS v8.0 上搭載的 Safari 瀏覽器的繪制引擎對(duì)于處理 .col-*-1
類(lèi)所對(duì)應(yīng)的很長(zhǎng)的百分比小數(shù)存在 bug。也就是說(shuō),如果你在一行(row)之中定義了12個(gè)單獨(dú)的列(.col-*-1
),你就會(huì)看到這一行比其他行要短一些。除了升級(jí) Safari/iOS 外,有以下幾種方式來(lái)應(yīng)對(duì)此問(wèn)題:
為最后一列添加 .pull-right
類(lèi),將其暴力向右對(duì)齊
手動(dòng)調(diào)整百分比數(shù)字,讓其針對(duì) Safari 表現(xiàn)更好(這比第一種方式更困難)
<body>
元素在 iOS 和 Android 上對(duì) overflow: hidden
的支持很有限。結(jié)果就是,在這兩種設(shè)備上的瀏覽器中,當(dāng)你滾動(dòng)屏幕超過(guò)模態(tài)框的頂部或底部時(shí),<body>
中的內(nèi)容將開(kāi)始隨著滾動(dòng)。
還有,如果你正在使用 fixed 定位的導(dǎo)航條或在模態(tài)框上面使用輸入框,還會(huì)遇到 iOS 在頁(yè)面繪制上的 bug,當(dāng)觸發(fā)虛擬鍵盤(pán)之后,其不會(huì)更新 fixed 定位的元素的位置。這里有幾種解決方案,包括將 fixed 定位轉(zhuǎn)變?yōu)?position: absolute
定位,或者啟動(dòng)一個(gè)定時(shí)器手工修正組件的位置。這些沒(méi)有加入 Bootstrap 中,因此,需要由你自己選擇最好的解決方案并加入到你的應(yīng)用中。
在 iOS 設(shè)備上,由于導(dǎo)航組件(nav)的復(fù)雜的 z-indexing 屬性,.dropdown-backdrop 元素并未被使用。因此,為了關(guān)閉導(dǎo)航條上的下拉菜單,必須直接點(diǎn)擊下拉菜單上的元素(或者任何其他能夠觸發(fā) iOS 上 click 事件的元素)。
頁(yè)面縮放功能不可避免的會(huì)將某些組件搞得亂七八糟,不光是 Bootstrap ,整個(gè)互聯(lián)網(wǎng)上的所有頁(yè)面都是這樣。針對(duì)具體問(wèn)題,我們或許可以修復(fù)它(如果有必要的話,請(qǐng)先搜索一下你的問(wèn)題,看看是否已有解決方案,然后在向我們提交 issue)。然而,我們更傾向于忽略這些問(wèn)題,由于這些問(wèn)題除了一些 hack 手段,一般沒(méi)有直接的解決方案。
即便是在某些很現(xiàn)代的瀏覽器中,打印頁(yè)面功能也還是存在很多陷阱。
舉個(gè)例子,從 Chrome v32 開(kāi)始,打印一個(gè)支持媒體查詢(xún)的頁(yè)面時(shí),不管如何設(shè)置留白,Chrome 總是使用一個(gè)遠(yuǎn)遠(yuǎn)小于實(shí)際頁(yè)面尺寸的視口寬度的值作為頁(yè)面寬度。這就導(dǎo)致被打印的頁(yè)面總是被呈現(xiàn)為在超小屏幕(extra-small)上的效果(也就是激活了 Bootstrap 針對(duì)超小屏幕的柵格排布方式)。 參考 #12078 了解更多信息。 推薦解決方案:
@screen-*
Less 變量的值,讓你的頁(yè)面總是大于 extra-small另外,從 Safari v8.0 開(kāi)始,固定寬度的 .container
會(huì)導(dǎo)致 Safari 使用非常小的字號(hào)來(lái)打印頁(yè)面。參見(jiàn) #14868了解跟多信息。下面這段 CSS 代碼提供了一個(gè)臨時(shí)解決方案:
@media print {
.container {
width: auto;
}
}
Android 4.1 (甚至某些較新版本)系統(tǒng)的默認(rèn)瀏覽器被設(shè)置為默認(rèn)打開(kāi)頁(yè)面的應(yīng)用程序(不同于 Chrome)。不幸的是, 一般情況下,這些瀏覽器有很多 bug 以及和 CSS 標(biāo)準(zhǔn)不一致的地方。
如果 <select>
元素應(yīng)用了 border-radius 和/
或 border 樣式,Android 系統(tǒng)默認(rèn)的瀏覽器將不會(huì)顯示側(cè)邊欄控件。 使用下面的代碼片段來(lái)刪除有問(wèn)題的 CSS 并且在Android 系統(tǒng)默認(rèn)的瀏覽器上,<select> as an
呈現(xiàn)為無(wú)樣式元素??梢酝ㄟ^(guò)檢測(cè)用戶(hù)代理(user agent)的特征串來(lái)避免干擾 Chrome、Safari 和 Mozilla 瀏覽器。
<script>
$(function () {
var nua = navigator.userAgent
var isAndroid = (nua.indexOf('Mozilla/5.0') > -1 && nua.indexOf('Android ') > -1 && nua.indexOf('AppleWebKit') > -1 && nua.indexOf('Chrome') === -1)
if (isAndroid) {
$('select.form-control').removeClass('form-control').css('width', '100%')
}
})
</script>
見(jiàn) JS Bin 上的 demo。
為了在老舊的瀏覽器上盡量提供最好的展現(xiàn),Bootstrap 針對(duì)瀏覽器使用了一些 CSS hack 手段,為的是針對(duì)特定瀏覽器版本彌補(bǔ)瀏覽器自身的 bug。這些 CSS hack 手段在 CSS 校驗(yàn)器那里會(huì)被認(rèn)為是無(wú)效代碼。還有一些地方,我們使用了某些未被完全標(biāo)準(zhǔn)化的 CSS 特性,純粹是為了實(shí)現(xiàn)漸進(jìn)式增強(qiáng)的思路。
上面提到的這些校驗(yàn)器報(bào)告的警告信息并不會(huì)對(duì)實(shí)際使用造成影響,因?yàn)榉?hack 部分的 CSS 是完全合格的,hack 部分不會(huì)對(duì)非 hack 部分的功能產(chǎn)生影響,這就是我們故意無(wú)視這些校驗(yàn)器警告的原因。
同樣,我們的 HTML 文檔中也有一些針對(duì) Firefox bug 的 hack 代碼,在 HTML 校驗(yàn)時(shí)也會(huì)被警告。