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