先決條件: | 熟悉核心 HTML , CSS 和 JavaScript 語言; 高級(jí)跨瀏覽器測試原則的概念。 |
---|---|
目的: | 能夠診斷常見的HTML和CSS跨瀏覽器問題,并使用適當(dāng)?shù)墓ぞ吆图夹g(shù)來修復(fù)它們。 |
HTML和CSS的一些麻煩在于這兩種語言都相當(dāng)簡單,并且開發(fā)人員通常不會(huì)認(rèn)真對(duì)待它們,因?yàn)樵诖_保代碼是精心設(shè)計(jì),高效和語義描述的目的方面, 功能。 在最壞的情況下,JavaScript用于生成整個(gè)網(wǎng)頁內(nèi)容和樣式,這使得您的網(wǎng)頁無法訪問,性能較差(生成DOM元素很昂貴)。 在其他情況下,不支持跨瀏覽器一致的新生功能,這可能使某些功能和樣式不適用于某些用戶。 響應(yīng)式設(shè)計(jì)問題也很常見 - 在桌面瀏覽器中看起來不錯(cuò)的網(wǎng)站可能會(huì)在移動(dòng)設(shè)備上提供可怕的體驗(yàn),因?yàn)閮?nèi)容太小,無法閱讀,或者網(wǎng)站由于昂貴的動(dòng)畫而緩慢。
讓我們來看看如何減少HTML / CSS導(dǎo)致的跨瀏覽器錯(cuò)誤。
我們?cè)?a href="/webstart/Cross_browser_testing/Introduction#Testingdiscovery">本系列的第一篇文章中說,開始的一個(gè)好策略是在桌面設(shè)備/移動(dòng)設(shè)備上的幾個(gè)現(xiàn)代瀏覽器中進(jìn)行測試, 在繼續(xù)專注于跨瀏覽器問題之前,請(qǐng)確保您的代碼正常工作。
在我們的調(diào)試HTML 和調(diào)試CSS 文章中,我們提供了一些關(guān)于 調(diào)試HTML / CSS - 如果你不熟悉基本知識(shí),你應(yīng)該肯定的學(xué)習(xí)這些文章,然后繼續(xù)。
基本上,這是一個(gè)問題,檢查你的HTML和CSS代碼是否正確,并且不包含任何語法錯(cuò)誤。
注意:當(dāng)不同的CSS規(guī)則開始彼此沖突時(shí),會(huì)出現(xiàn)CSS和HTML的一個(gè)常見問題。 當(dāng)您使用第三方代碼時(shí),這可能特別成問題。 例如,你可能使用一個(gè)CSS框架,并發(fā)現(xiàn)它使用的一個(gè)類名與已經(jīng)用于不同目的的類沖突。 或者,您可能會(huì)發(fā)現(xiàn)某些第三方API(例如生成廣告橫幅)生成的HTML包含您已用于其他目的的類名稱或ID。 為了確保不會(huì)發(fā)生這種情況,您需要先研究您正在使用的工具,并圍繞它們?cè)O(shè)計(jì)您的代碼。 它也值得"命名空間"CSS,例如。 如果你有一個(gè)窗口部件,請(qǐng)確保它有一個(gè)不同的類,然后啟動(dòng)選擇器,在這個(gè)類中選擇小部件內(nèi)的元素,因此沖突不大可能。 例如 .audio-player ul a
。
對(duì)于HTML,驗(yàn)證涉及確保所有代碼正確關(guān)閉和嵌套,您使用的是DOCTYPE,并且您正在使用代碼的正確目的。 一個(gè)好的策略是定期驗(yàn)證您的代碼。 可以執(zhí)行此操作的一項(xiàng)服務(wù)是W3C 標(biāo)記驗(yàn)證服務(wù),可讓您指向代碼 ,并返回錯(cuò)誤列表:
CSS有一個(gè)類似的故事 - 您需要檢查您的屬性名稱拼寫正確,屬性值拼寫正確,并對(duì)它們使用的屬性有效,您不會(huì)丟失任何花括號(hào),等等。 為此,W3C還提供了 CSS Validator 。
另一個(gè)很好的選擇是所謂的Linter應(yīng)用程序,它不僅指出錯(cuò)誤,而且還可以在CSS中標(biāo)記有關(guān)壞做法的警告,以及其他點(diǎn)。 通??梢远ㄖ泼藁?,以在其錯(cuò)誤/警告報(bào)告中更嚴(yán)格或更輕松。
有許多在線linter應(yīng)用程序,其中最好的可能是臟標(biāo)記(HTML,CSS,JavaScript)和 CSS Lint (僅限CSS)。 這些允許您將代碼粘貼到窗口中,它會(huì)標(biāo)記任何錯(cuò)誤的十字架,然后可以被徘徊以獲得錯(cuò)誤消息通知您的問題是什么。 臟標(biāo)記還允許您使用清除按鈕修復(fù)您的標(biāo)記。
0px auto; width:1204px;" alt ="">
然而,將代碼復(fù)制并粘貼到網(wǎng)頁上以檢查其有效性幾次并不是很方便。 你真正想要的是一個(gè)linter,將適合你的標(biāo)準(zhǔn)工作流程,最少的麻煩。
許多代碼編輯器都有l(wèi)inter插件。 例如,Github的 Atom 代碼編輯器有一個(gè)豐富的插件生態(tài)系統(tǒng)可用,有許多l(xiāng)inting選項(xiàng)。 為了向您展示這些插件通常如何工作的示例:
alt =""> "。 alt ="">
其他流行的編輯有類似的linting包可用。 例如,請(qǐng)參閱:
大多數(shù)瀏覽器中內(nèi)置的開發(fā)工具還提供了有用的工具來捕獲錯(cuò)誤,主要是CSS。
注意:由于瀏覽器會(huì)嘗試自動(dòng)糾正格式不正確的標(biāo)記,因此HTML錯(cuò)誤在開發(fā)人員工具中往往不易顯示; W3C驗(yàn)證器是獲取HTML錯(cuò)誤的最佳方式 - 請(qǐng)參見上面的驗(yàn)證。
例如,在Firefox中,CSS檢查器將顯示未應(yīng)用的CSS聲明,并帶有警告三角形。 懸停警告三角形將提供一個(gè)描述性的錯(cuò)誤消息:
alt ="">
其他瀏覽器devtools有類似的功能。
現(xiàn)在讓我們繼續(xù)看看一些最常見的跨瀏覽器HTML和CSS問題。 我們將關(guān)注的主要領(lǐng)域是缺乏對(duì)現(xiàn)代功能和布局問題的支持。
這是一個(gè)常見的問題,特別是當(dāng)您需要支持舊的瀏覽器(如舊的IE版本)或您使用的功能使用CSS前綴實(shí)現(xiàn)。 一般來說,大多數(shù)核心的HTML和CSS功能(例如基本HTML元素,CSS基本顏色和文本樣式)可以在大多數(shù)瀏覽器中使用; 當(dāng)您開始使用較新的功能(例如 Flexbox 或 -CN / docs / Web / Apps / Fundamentals / Audio_and_video_delivery"> HTML5視頻/音頻,甚至更新生, CSS網(wǎng)格或 -webkit-background-clip:text 。
一旦確定了您將使用的潛在問題技術(shù)列表,最好研究其支持的瀏覽器,以及相關(guān)技術(shù)是否有用。 請(qǐng)參見下面的查找?guī)椭?/a>。
一些問題可以通過利用HTML / CSS的自然方式來解決。
無法識(shí)別的HTML元素被瀏覽器視為匿名內(nèi)聯(lián)元素(實(shí)際上沒有語義值的內(nèi)聯(lián)元素,類似于 span"> < span>
元素)。 你仍然可以通過他們的名字引用它們,并用CSS樣式,例如 - 你只需要確保它們是你想要的,例如設(shè)置 display:block;
在所有 的新語義元素(例如 < article>
/ a>, < aside>
, 等等),但只在舊版本的IE不能識(shí)別它們(所以,IE 8和更低)。 這樣新的瀏覽器可以正常使用的代碼,但舊的IE版本將能夠?qū)@些元素進(jìn)行風(fēng)格。
注意:有關(guān)執(zhí)行此操作的最佳方法,請(qǐng)參見 IE條件注釋。
更復(fù)雜的元素,如HTML < video>
, < audio>
和 > < canvas>
(以及其他功能) 添加的回退的自然機(jī)制,其工作原理與上述相同。 您可以在開始和結(jié)束標(biāo)記之間添加后備內(nèi)容,而不支持的瀏覽器將有效地忽略外部元素并運(yùn)行嵌套內(nèi)容。
例如:
<video id="video" controls preload="metadata" poster="img/poster.jpg">
<source src="video/tears-of-steel-battle-clip-medium.mp4" type="video/mp4">
<source src="video/tears-of-steel-battle-clip-medium.webm" type="video/webm">
<source src="video/tears-of-steel-battle-clip-medium.ogg" type="video/ogg">
<!-- Flash fallback -->
<object type="application/x-shockwave-flash" data="flash-player.swf?videoUrl=video/tears-of-steel-battle-clip-medium.mp4" width="1024" height="576">
<param name="movie" value="flash-player.swf?videoUrl=video/tears-of-steel-battle-clip-medium.mp4" />
<param name="allowfullscreen" value="true" />
<param name="wmode" value="transparent" />
<param name="flashvars" value="controlbar=over&image=img/poster.jpg&file=flash-player.swf?videoUrl=video/tears-of-steel-battle-clip-medium.mp4" />
<img alt="Tears of Steel poster image" src="img/poster.jpg" width="1024" height="428" title="No video playback possible, please download the video from the link below" />
</object>
<!-- Offer download -->
<a href="video/tears-of-steel-battle-clip-medium.mp4">Download MP4</a>
</video>
此示例(摘自創(chuàng)建跨瀏覽器視頻播放器)包括 不僅是老版本的Flash視頻回退,還有一個(gè)簡單的鏈接,允許您下載視頻,即使Flash播放器不工作,因此至少用戶仍然可以訪問視頻。
注意:第三方庫,例如 Video.js 和 www.jwplayer.com/"class ="external"> JW Player 使用此類回退機(jī)制來提供跨瀏覽器支持。
HTML5表單元素還會(huì)顯示回退質(zhì)量 - HTML5引入了一些特殊的 < input> / a>
類型,用于將特定信息輸入到表單中,例如時(shí)間,日期,顏色,數(shù)字等。這些非常有用,特別是在移動(dòng)平臺(tái)上,其中提供輸入數(shù)據(jù)的無痛方式非常重要 為用戶體驗(yàn)。 支持平臺(tái)在使用這些輸入類型時(shí)提供特殊的UI小部件,例如用于輸入日期的日歷小部件。
以下示例顯示日期和時(shí)間輸入:
<form> <div> <label for="date">Enter a date:</label> <input id="date" type="date"> </div> <div> <label for="time">Enter a time:</label> <input id="time" type="time"> </div> </form>
該代碼的輸出如下:
label { float: left; width: 30%; text-align: right; } input { float: right; width: 65%; } label, input { margin-bottom: 20px; } div { clear: both; margin: 10px; } body { width: 400px; margin: 0 auto; }
<form> <div> <label for="date">Enter a date:</label> <input id="date" type="date"> </div> <div> <label for="time">Enter a time:</label> <input id="time" type="time"> </div> </form>
注意:您還可以查看此正在運(yùn)行的 GitHub上的forms-test.html"class ="external"> forms-test.html (請(qǐng)參閱 測試/跨瀏覽器測試/ html-css / forms-test.html"class ="external">源代碼)。
如果您在支持的瀏覽器(如桌面/ Android Chrome或iOS Safari)上查看示例,您會(huì)在嘗試輸入數(shù)據(jù)時(shí)看到特殊的小部件/功能。 在諸如Firefox或Internet Explorer的不支持的平臺(tái)上,輸入將僅回退到正常文本輸入,因此至少用戶仍然可以輸入一些信息。
注意:當(dāng)然,這可能不是一個(gè)偉大的解決方案為您的項(xiàng)目的需要 - 視覺呈現(xiàn)的差異不是很大,加上很難保證數(shù)據(jù)將以您想要的格式輸入。對(duì)于跨瀏覽器窗體, 它可能更好地依賴于簡單的表單元素,或選擇性地使用高級(jí)表單元素只支持瀏覽器,或使用一個(gè)庫提供體面的跨瀏覽器窗體小部件,如 class ="external"> jQuery UI 或 Bootstrap datepicker 。
CSS可以說是更好的回退比HTML。 如果瀏覽器遇到一個(gè)聲明或規(guī)則,它不明白,它只是跳過它,而不應(yīng)用它或拋出一個(gè)錯(cuò)誤。 這可能會(huì)讓你和你的用戶感到沮喪,如果這樣的錯(cuò)誤滑向生產(chǎn)代碼,但至少這意味著整個(gè)網(wǎng)站不會(huì)崩潰,因?yàn)橐粋€(gè)錯(cuò)誤,如果巧妙地使用你可以使用它的優(yōu)勢。
讓我們來看一個(gè)例子 - 一個(gè)簡單的CSS樣式的CSS,它有一些樣式由各種CSS3功能提供:
alt ="">
注意:您也可以在GitHub上看到此示例正在運(yùn)行 -testing / html-css / button-with-fallback.html"class ="external"> button-with-fallback.html (另見 /learning-area/tools-testing/cross-browser-testing/html-css/button-with-fallback.html"class ="external">源代碼)。
該按鈕有許多樣式的聲明,但我們最感興趣的兩個(gè)如下:
button { ... background-color: #ff0000; background-color: rgba(255,0,0,1); box-shadow: inset 1px 1px 3px rgba(255,255,255,0.4), inset -1px -1px 3px rgba(0,0,0,0.4); } button:hover { background-color: rgba(255,0,0,0.5); } button:active { box-shadow: inset 1px 1px 3px rgba(0,0,0,0.4), inset -1px -1px 3px rgba(255,255,255,0.4); }
在這里,我們提供 RGBA /developer.mozilla.org/zh-CN/docs/Web/CSS/background-color"> background-color
,可更改懸停時(shí)的不透明度,以向用戶提示按鈕 是交互式的,以及一些半透明插圖 box-shadow
/ a>陰影給按鈕一些紋理和深度。 麻煩的是,RGBA顏色和盒子陰影不擔(dān)心IE版本9以上 - 在舊版本的背景只是不會(huì)顯示出來,所以文本將是不可讀的,沒有什么好!
alt ="">
為了對(duì)此進(jìn)行排序,我們添加了第二個(gè) background-color
聲明,它只是指定了一個(gè)十六進(jìn)制顏色 - 這在真正的舊瀏覽器中是支持的,如果現(xiàn)代閃亮的特性 不工作。 發(fā)生什么是瀏覽器訪問此頁面首先應(yīng)用第一個(gè) background-color
值; 當(dāng)它到達(dá)第二個(gè) background-color
聲明時(shí),如果它支持RGBA顏色,它將用此值覆蓋初始值。 如果沒有,它將忽略整個(gè)聲明并繼續(xù)。
注意:對(duì)于其他CSS功能(例如媒體查詢)也是如此 , @ font-face
>和 @supports
阻止 - 如果它們不是 支持,瀏覽器只是忽略它們。
IE條件注釋是修改的專有HTML注釋語法,其可以用于選擇性地將HTML代碼應(yīng)用于IE的不同版本。 這已被證明是一個(gè)非常有效的機(jī)制,用于修復(fù)跨瀏覽器錯(cuò)誤。 語法如下所示:
<!--[if lte IE 8]> <script src="ie-fix.js"></script> <link href="ie-fix.css" rel="stylesheet" type="text/css"> <![endif]-->
如果瀏覽頁面的瀏覽器是IE 8或更高版本,此塊將應(yīng)用IE特定的CSS和JavaScript。 lte
表示"小于或等于",但您也可以對(duì)NOT和其他邏輯語法使用lt,gt,gte,!
。
注意:Sitepoint的 -comments /"class ="external"> Internet Explorer條件注釋提供了一個(gè)有用的初學(xué)者教程/參考,詳細(xì)解釋條件注釋語法。
正如你可以看到,這是特別有用的應(yīng)用代碼修復(fù)舊版本的IE。 我們之前提到的用例(使舊的IE版本中的現(xiàn)代語義元素可以風(fēng)格化)可以使用條件注釋輕松實(shí)現(xiàn),例如你可以在你的IE樣式表中放置這樣的東西:
aside, main, article, section, aside, nav, figure, figcaption { display: block; }
它不是那么簡單,但是 - 你還需要?jiǎng)?chuàng)建一個(gè)每個(gè)元素的你想要在DOM中通過JavaScript風(fēng)格的副本,為他們的風(fēng)格; 這是一個(gè)奇怪的怪癖,我們不會(huì)介紹這里的細(xì)節(jié)。 例如:
var asideElem = document.createElement('aside'); ...
這聽起來很痛苦,但幸運(yùn)的是有一個(gè) polyfill 可用,為您提供必要的修復(fù)程序等等 - 請(qǐng)參閱 HTML5Shiv 了解所有詳細(xì)信息(請(qǐng)參閱 class ="external">手動(dòng)安裝,以獲得最簡單的用法)。
當(dāng)然,如果您不使用正確的選擇器來選擇要?jiǎng)?chuàng)建樣式的元素,則不會(huì)應(yīng)用任何CSS功能! 如果你只是寫一個(gè)選擇器不正確,所以造型不是預(yù)期在任何瀏覽器,你只需要排除故障,找出你的選擇器有什么問題。 我們發(fā)現(xiàn),使用瀏覽器的開發(fā)工具檢查您嘗試創(chuàng)建的元素是有幫助的,然后查看DOM檢查器傾向于提供的DOM樹面包屑跟蹤,看看選擇器是否有意義。
例如,在Firefox開發(fā)工具中,您會(huì)在DOM檢查器的底部得到這種輸出:
alt ="">
例如,如果您試圖使用此選擇器,您將能夠看到它不會(huì)根據(jù)需要選擇輸入元素:
form > #date
( date
表單輸入不是直接在< form>
內(nèi);你最好使用一般的后代選擇器而不是子選擇器。
然而,在9以前版本的IE中出現(xiàn)的另一個(gè)問題是沒有一個(gè)更新的選擇器(我們主要談?wù)搨晤惡蛡卧兀?code> .org / zh-CN / docs / Web / CSS /:nth-of-type">:nth-of-type , mozilla.org/zh-CN/docs/Web/CSS/:not\">:not
, / docs / Web / CSS / :: selection"> :: selection
等)如果你想在CSS中使用這些,你需要支持舊的IE版本,一個(gè)好的舉動(dòng)是 使用Keith Clark的 Selectivizr 庫 - 這是一個(gè)小型JavaScript庫,可在現(xiàn)有JavaScript庫(如 "http://jquery.com/"class ="external"> jQuery 或 MooTools 。
p:first-child
, which won't work in old versions of IE.<style>
tag: <script type="text/javascript" src="MooTools-Core-1.6.0.js"></script> <!--[if (gte IE 6)&(lte IE 8)]> <script type="text/javascript" src="selectivizr-min.js"></script> <![endif]-->
如果你試圖運(yùn)行這個(gè)在舊版本的IE,它應(yīng)該工作正常。
margin:0px auto; width:771px;" alt ="">
另一組問題來自CSS前綴 - 這些是一個(gè)機(jī)制,或者通常用于允許瀏覽器供應(yīng)商實(shí)現(xiàn)自己的版本的CSS(或JavaScript)功能,而技術(shù)處于實(shí)驗(yàn)狀態(tài),所以他們可以玩它,并得到它 沒有與其他瀏覽器的實(shí)現(xiàn),或最終的無前綴的實(shí)現(xiàn)沖突。 例如:
-moz-
-webkit-
-ms-
下面是一些示例:
-webkit-transform: rotate(90deg); background-image: -moz-linear-gradient(left,green,yellow); background-image: -webkit-gradient(linear,left center,right center,from(green),to(yellow)); background-image: linear-gradient(to right,green,yellow);
第一行顯示 transform
屬性,其中包含 > -webkit -
前綴 - 這是需要使轉(zhuǎn)換在Chrome等工作,直到功能被完成,這樣的瀏覽器添加的屬性的前綴免費(fèi)版本(在撰寫本文時(shí),Chrome支持兩個(gè)版本 )。
最后三行顯示了三種不同版本的 linear-gradient()
a> 函數(shù),用于在元素的背景中生成線性漸變:
-moz-
prefix, and shows a slightly older version of the syntax (Firefox)-webkit-
prefix, and shows an even older, proprietary version of the syntax (this is actually from a really old version of the WebKit engine).預(yù)定的功能從來不應(yīng)該在生產(chǎn)網(wǎng)站中使用 - 它們可能會(huì)被更改或刪除而不會(huì)發(fā)出警告,并導(dǎo)致跨瀏覽器問題。 當(dāng)開發(fā)人員決定只使用屬性的 -webkit-
版本 - 這意味著網(wǎng)站不能在其他瀏覽器中工作,這是一個(gè)特別的問題。 這實(shí)際上發(fā)生了,其他瀏覽器已經(jīng)開始實(shí)現(xiàn) -webkit -
各種CSS屬性的前綴版本,所以他們將使用這樣的代碼。 瀏覽器供應(yīng)商對(duì)前綴的使用最近已經(jīng)減少,正是由于這些類型的問題,但仍有一些需要注意。
如果您堅(jiān)持使用前綴功能,請(qǐng)確保使用正確的功能。 您可以在MDN參考頁以及 caniuse.com 等網(wǎng)站上查找哪些瀏覽器需要前綴。 如果你不確定,你也可以通過直接在瀏覽器中進(jìn)行一些測試來發(fā)現(xiàn)。
嘗試這個(gè)簡單的例子:
hplogo
.var test = document.getElementById('hplogo');
test.style.transform = 'rotate(90deg)' test.style.webkitTransform = 'rotate(90deg)'
當(dāng)您開始在第二個(gè)點(diǎn)之后鍵入屬性名稱表示時(shí)(請(qǐng)注意,在JavaScript中,CSS屬性名稱是以駝峰形式寫入的,而不是連字符),JavaScript控制臺(tái)應(yīng)開始自動(dòng)填充瀏覽器中存在的屬性的名稱 并匹配到目前為止你寫的。 這對(duì)于找出在該瀏覽器中實(shí)現(xiàn)的屬性的哪些版本很有用。
撰寫本文時(shí),F(xiàn)irefox和Chrome都實(shí)現(xiàn)了 ="https://developer.mozilla.org/zh-CN/docs/Web"的 -webkit -
前綴和非前綴版本 / CSS / transform"> transform
!
一旦你找到了需要支持的前綴,你應(yīng)該把它們?nèi)繉懺贑SS中,例如:
-ms-transform: rotate(90deg); -webkit-transform: rotate(90deg); transform: rotate(90deg);
這可以確保所有支持上述任何形式的屬性的瀏覽器都能使該功能正常工作。 這是值得把非前綴的版本最后,因?yàn)檫@將是最新的版本,你會(huì)希望瀏覽器使用,如果可能的話。 如果例如瀏覽器實(shí)現(xiàn) -webkit -
版本和非前綴版本,它將首先應(yīng)用 -webkit -
版本, 前綴版本。 你希望它以這種方式發(fā)生,而不是反過來。
當(dāng)然,這樣做對(duì)很多不同的CSS規(guī)則可以得到真的很乏味。 最好使用自動(dòng)化工具為您完成。 并且存在這樣的工具:
免費(fèi)前綴JavaScript庫可以附加到網(wǎng)頁上,并且會(huì)自動(dòng)檢測所擁有的功能 瀏覽器查看頁面并根據(jù)需要添加前綴。 它真的很容易和方便使用,雖然它有一些缺點(diǎn)(請(qǐng)參閱上面的鏈接的詳細(xì)信息),可以說,解析您的網(wǎng)站中的每個(gè)樣式表,并在運(yùn)行時(shí)添加前綴可能會(huì)耗盡計(jì)算機(jī)的處理能力 為大型網(wǎng)站。
Autoprefixer\">另一種解決方案是在開發(fā)過程中自動(dòng)添加前綴,而且(以及其他一些事情)可以使用 Autoprefixer and PostCSS.\">a>和 PostCSS 。online version that allows you to enter your\">這些工具可以通過多種方式使用,例如Autoprefixer有一個(gè)在線版本,允許您輸入您的非前綴CSS在左邊,并給你一個(gè)前綴添加版本在右邊。Autoprefixer options;\">您可以使用自動(dòng)填充程序選項(xiàng)中列出的符號(hào)選擇要確保支持的瀏覽器;Browserslist queries, which this is based on, for more detail.\">也可以參閱 Browserslist查詢(詳細(xì)信息請(qǐng)參閱此鏈接)。例如,以下查詢將選擇所有主要瀏覽器的最后2個(gè)版本和9以上的IE版本。
last 2 versions, ie > 9
Autoprefixer也可以通過其他更方便的方式使用 - 請(qǐng)參見自動(dòng)前貼片使用。 例如,您可以使用任務(wù)運(yùn)行程序/構(gòu)建工具(如 Gulp 或 webpack.github.io/"class ="external"> Webpack ,以便在開發(fā)完成后自動(dòng)添加前綴。 (解釋這些工作如何超出了本文的范圍。)
您還可以為文本編輯器(如Atom或Sublime文本)使用插件。 例如,在Atom:
例如,我們輸入了以下代碼:
body { display: flex; }
我們突出顯示它并運(yùn)行Autoprefixer命令,并將其替換為:
body { display: -webkit-box; display: -ms-flexbox; display: flex; }
另一個(gè)可能出現(xiàn)的問題是瀏覽器之間的布局的差異。 歷史上,這曾經(jīng)是一個(gè)更大的問題,但最近,現(xiàn)代瀏覽器傾向于更一致地支持CSS,布局問題往往更常見的與:
注意:歷史上,Web開發(fā)人員曾經(jīng)使用過稱為重置的CSS文件,它刪除了所有應(yīng)用于HTML的默認(rèn)瀏覽器樣式,然后對(duì)頂部的所有內(nèi)容應(yīng)用自己的樣式 - 這是為了使樣式 一個(gè)項(xiàng)目更一致,并減少可能的跨瀏覽器問題,特別是對(duì)于布局等事情。 然而,它最近被視為過度殺戮。 我們?cè)诂F(xiàn)代最好的等同體是 normalize.css ,一個(gè)整潔的CSS構(gòu)建 略微在默認(rèn)瀏覽器樣式,使事情更一致,并解決一些布局問題。 建議您將normalize.css應(yīng)用于所有HTML頁面。
注意:在嘗試跟蹤一個(gè)棘手的布局問題時(shí),一個(gè)好的技巧是添加鮮艷的 / CSS / outline"> outline
添加到違規(guī)元素或附近的所有元素。 這使得它很容易看到什么放置。 有關(guān)詳細(xì)信息,請(qǐng)參見使用大綱可視化調(diào)試CSS 。
今天在網(wǎng)絡(luò)上的大部分布局工作都是使用浮動(dòng)廣告完成的 - 這是因?yàn)楦?dòng)廣受支持(回到IE4,盡管有多個(gè) bug,如果你試圖支持IE,那么也需要調(diào)查)。 然而,他們并不是真正意味著布局的目的 - 使用浮動(dòng)我們所做的是真正的黑客 - 他們有一些嚴(yán)重的限制(例如,參見 / docs / Learn / CSS / CSS_layout / Flexbox#Why_Flexbox">為什么選擇Flexbox?)
最近,出現(xiàn)了專用布局機(jī)制,如 Flexbox 和 CSS網(wǎng)格 ,這使得常見的布局任務(wù)更容易,并消除這樣的缺點(diǎn)。 然而,這些不是在瀏覽器中支持:
布局功能并不像簡單的顏色,陰影或漸變一樣容易提供優(yōu)雅的回退。 如果忽略布局屬性,則整個(gè)設(shè)計(jì)可能會(huì)碎片化。 因此,您需要使用功能檢測來檢測訪問的瀏覽器是否支持這些布局功能,并根據(jù)結(jié)果選擇性地應(yīng)用不同的布局(我們將在后面的文章中詳細(xì)介紹功能檢測)。
例如,您可以將flexbox布局應(yīng)用于現(xiàn)代瀏覽器,然后將浮動(dòng)布局應(yīng)用于不支持flexbox的舊版瀏覽器。
響應(yīng)式設(shè)計(jì)是創(chuàng)建改變以適應(yīng)不同設(shè)備形狀因素的網(wǎng)絡(luò)布局的實(shí)踐 - 例如不同的屏幕寬度,方向(縱向或橫向)或分辨率。 例如,當(dāng)在移動(dòng)設(shè)備上查看時(shí),桌面布局會(huì)顯得很糟糕,因此您需要使用 Media_Queries">媒體查詢,并確保使用視口 >。 您可以在響應(yīng)式設(shè)計(jì)的構(gòu)建塊中找到此類實(shí)踐的詳細(xì)帳戶。 a>。
分辨率也是一個(gè)大問題 - 例如,移動(dòng)設(shè)備不太可能需要比臺(tái)式機(jī)更大的圖像,并且更可能有較慢的互聯(lián)網(wǎng)連接,甚至可能是昂貴的數(shù)據(jù)計(jì)劃,浪費(fèi)帶寬更多的問題。 此外,不同的設(shè)備可以具有一定范圍的不同分辨率,這意味著較小的圖像可能出現(xiàn)像素化。 有許多技術(shù)可以解決這些問題,從簡單的移動(dòng)第一媒體查詢到更復(fù)雜的 href ="/ webstart / Multimedia_and_embedding / Responsive_images#Resolution_switching_Different_sizes">響應(yīng)式圖像技術(shù)。
可以呈現(xiàn)問題的另一個(gè)困難是對(duì)使得上述技術(shù)成為可能的特征的瀏覽器支持。 媒體查詢不支持在IE 8或更少,所以如果你想使用移動(dòng)第一布局,并具有桌面布局,然后應(yīng)用于舊的IE版本,你必須應(yīng)用媒體查詢 /developer.mozilla.org/zh-CN/docs/Glossary/polyfill"class ="glossaryLink"> polyfill 到您的網(wǎng)頁,例如 p / css3-mediaqueries-js /"class ="external"> css3-mediaqueries-js 或響應(yīng) .js 。
還有許多其他問題你會(huì)遇到的HTML和CSS; 最重要的事情,知道真正是如何在網(wǎng)上找到答案。
最好的支持信息來源是Mozilla開發(fā)者網(wǎng)絡(luò)(即您現(xiàn)在的位置!), stackoverflow.com 和 caniuse.com 。
要使用Mozilla開發(fā)者網(wǎng)絡(luò)(MDN),大多數(shù)人通過搜索引擎搜索他們正在嘗試查找信息的技術(shù),加上術(shù)語"mdn",例如"mdn HTML5 video"。 MDN包含幾種有用的內(nèi)容類型:
caniuse.com 提供了支持信息,以及一些有用的外部資源鏈接。 例如,請(qǐng)參見 http://caniuse.com/#search=video (您只需輸入 您要在文本框中搜索的要素)。
stackoverflow.com (SO)是一個(gè)論壇網(wǎng)站,您可以在其中提出問題,并讓開發(fā)人員分享他們的解決方案,查找以前的 帖子,并幫助其他開發(fā)人員。 建議您在發(fā)布新問題之前查看是否有您的問題的答案。 例如,我們?cè)赟O上搜索"跨瀏覽器html5視頻",很快就提出了 兼容性"class ="question-hyperlink external">具有全面瀏覽器兼容性的HTML5視頻。
除此之外,嘗試搜索您最喜歡的搜索引擎以找到您的問題的答案。 搜索特定的錯(cuò)誤消息通常是有用的,如果你有他們 - 其他開發(fā)人員可能會(huì)有與你一樣的問題。
現(xiàn)在,您應(yīng)該熟悉在Web開發(fā)中遇到的跨瀏覽器HTML和CSS問題的主要類型,以及如何修復(fù)它們。
更多建議: