概括地說,我把調(diào)試流程分為 3 個階段:
評估并快速修復(fù)
還原和重現(xiàn)
定位根源并修復(fù)
我們挨個解釋每個階段并實踐一個例子。
評估并快速修復(fù)
如果 CSS 是你的主要工作語言,或者你對 CSS 有一定的理解和實踐經(jīng)驗的話,解決 CSS 問題就有很多簡單的方法,否則的話,方法就少一些。
有經(jīng)驗的 CSS 開發(fā)者可能都知道的一些 CSS 陷阱:
圖片周邊存在有趣的空白?設(shè)置 display: block(圖片默認是內(nèi)聯(lián)的,因此會有空白)。
元素排列不正確?你可能有浮動的元素。
絕對定位元素不顯示、位置錯誤或者被遮擋?你可能沒有設(shè)置父元素的 position 屬性或者用 transform 及 opacity 創(chuàng)建一個 z-index 上下文。
偽元素不顯示?你可能忘記了設(shè)置 ‘content’的值。
這樣的 “bug” 有一大堆。實際上根本沒有 bug,更多的是開發(fā)者缺少對瀏覽器行為的理解。更準確地說,是 CSS 代碼讓瀏覽器怎么做。
對這些 CSS 特性熟悉的開發(fā)者能夠快速定位到問題并且修復(fù)。他們對 bug 的認識與那些對 CSS 不了解的人會產(chǎn)生分歧。這樣在解決 CSS bug 中對‘工作流’需求的重要性的認識就會因人而異。
對于‘快速修復(fù)’中沒有覆蓋的陌生問題,在開發(fā)者工具中靠猜來解決問題的方式已經(jīng)沒什么價值。即使運氣好問題被解決了,也很難判斷出問題到底是怎樣被解決的。
如果出現(xiàn)的問題不能被輕易解決,先確定問題區(qū)域的范圍,抓取 HTML 標簽(也就是拷貝 DOM),進入下一個調(diào)試階段:還原和重現(xiàn)。
專業(yè)提示:大多數(shù)瀏覽器的開發(fā)者工具會讓你選擇包裹元素并拷貝 HTML 區(qū)塊。在 Chrome 的開發(fā)者工具中,要連同包裹元素一起拷貝,需要點擊 ‘Copy > Copy OuterHTML’。
還原和重現(xiàn)
本階段的 CSS bug 修復(fù)在類似 Codepen 的幫助下異常簡單。我們目的主要是復(fù)現(xiàn)出此問題 – 也就是引起 bug 的代碼。這能讓我們快速定位 bug,直搗黃龍。
為清晰起見,只把相關(guān)的 HTML 和 CSS 提取出來復(fù)現(xiàn)問題。你既可以手打 HTML 對應(yīng)的 CSS,也可以復(fù)制真實的代碼。如果可能的話,不用把所有 CSS 代碼一股腦拷貝過去重現(xiàn)問題,保證最精簡的要素即可。保持逐步增加 CSS 的習(xí)慣,問題就會自己找到你。
在快要接近真相時,往往只需要一個特殊的 CSS 屬性的改變就能讓 bug 暴露出來。
相對應(yīng)的做法是,把所有 CSS 都扔進入復(fù)現(xiàn)問題,然后每次移除一點,直到問題出現(xiàn)。在實踐中,我發(fā)現(xiàn)這略笨,不用也因人而異,你可能有不同的見解。
逐步地增加或刪除 CSS 代碼已經(jīng)是重現(xiàn)問題和定位故障的固定套路了。
那么 HTML 標簽?zāi)兀?br/>
假設(shè)使用最少 CSS 代碼復(fù)現(xiàn)問題時,效果有如原始代碼一樣。這也是有用的,我們現(xiàn)在看 HTML 標簽。
第一件事要做的,也是不能跳過的,就是檢查標簽的有效性。即使報告出我們不關(guān)心的問題(比如 meta),至少能保證它不會以某種方式破壞美感。我們希望能發(fā)現(xiàn)未閉合的標簽、沒有引號的屬性,以及其它任何可能影響瀏覽器解析的問題。建議你使用 W3C validator。
一旦標簽檢查通過,將有助于消除瀏覽器引入意外樣式的可能性。這樣做:
首先,把所有元素改成 div(塊級元素)和 span(行內(nèi)元素),保證它們只被 CSS 的類選擇器選中。也許有必要把額外的選擇器移除,如把 a.link 改為 .link。
通過使用固定的標簽我們消除了瀏覽器針對特定元素引入默認樣式的可能性。表單元素是個特例(馬上會在例子中見到)。
如果把所有元素改成 div 和 span,問題消失了,那么瀏覽器引入默認樣式的嫌疑就被確定了。現(xiàn)在在 computed styles 面板中尋找瀏覽器增加了什么樣式,想辦法覆蓋它。總之就是要看計算后的樣式。