HTML和CSS的一些東西會讓你忍不住說“這TM是什么玩意兒!”。以下是困惑、失策和困境這些困擾著HTML和CSS問題清單:
? Doctype的聲明
? Box Model的計算問題
? Rem單位和Mobile Safari
? 浮動(float)排在第一
? 浮動(float)和清除浮動(clear)
? 浮動和計算高度
? 浮動元素是塊級元素
? 垂直相鄰margin的倒塌
? 設計表單的行
? Firefox和<input>按鈕
? Firefox按鈕的內部輪廓
? 始終在<button>上設置type
? IE瀏覽器選擇器的限制
? 位置解釋
? 位置和寬度
? 定位與轉換
Doctype的聲明
總要有doctype聲明。我建議用html5中簡單的doctype聲明方式
<!DOCTYPE html>
不聲明doctype會導致畸形的表單、輸入框和其它的一些問題;且會讓頁面在quirk mode下顯示。
Box Model的計算問題
當元素定義了padding和border-width中的1個或2個后,你設置的width值會變得比實際的大。為了避免這個問題的發(fā)生,現(xiàn)在就用box-sizing: border-box;這種通過的方法來重新設置。
Rem單位和Mobile Safari
雖然Mobile Safari支持使用rem的所有屬性值時。但當rem被用在維媒體查詢和以不同大小無限閃爍頁面的文本時,它就不行了。
就這種情況而言,目前還是用em來代替rem吧。
html {
font-size: 16px;
}
/* Causes flashing bug in Mobile Safari */
@media (min-width: 40rem) {
html {
font-size: 20px;
}
}
/* Works great in Mobile Safari */
@media (min-width: 40em) {
html {
font-size: 20px;
}
}
求助!如果你有蘋果或WebKit關于這方面的錯誤報告,我很樂意將它放到本文中。由于它只適用于移動應用,不適用于桌面程序,Safari瀏覽器(非Mobile Safari),我不確定在哪里會報告這個錯誤。
浮動(float)排在第一
在文檔順序中,浮動的元素應該總是放在第一。浮動的元素需要一些東西來環(huán)繞,否則其順序會下降,在內容之下顯示。
<div class="parent">
<div class="float">Float</div>
<div class="content">
<!-- ... -->
</div>
</div>
浮動(float)和清除浮動(clear)
如果你使用浮動,很可能你需要使用清除浮動。任何跟著浮動元素的內容均會環(huán)繞著浮動元素,除非使用清除浮動。你可以使用以下的方法來清除浮動。
micro clearfix方法通過使用單獨的類來清除浮動
.clearfix:before,
.clearfix:after {
display: table;
content: "";
}
.clearfix:after {
clear: both;
}
或者,在parent中用auto 或 hidden 來指定overflow。
.parent {
overflow: auto; /* clearfix */
}
.other-parent {
overflow: hidden; /* clearfix */
}
考慮到overflow可能會產生意想不到的副作用,在parent中將其以特別的方式標注在定位元素旁。
專業(yè)意見!當清除浮動由于其它原因能作為屬性使用時,通過像/* clearfix */ 這樣的注釋能讓你把握自己的未來,且能讓你的同事高興。
浮動和計算高度
一個只有浮動內容的父元素將有一個計算的高度值height: 0;。給父元素加clearfix,強制瀏覽器計算一個高度值。
浮動元素是塊級元素
用了float的元素會自動地變成display: block;沒有必要兩個屬性都設置,因為float會覆蓋你的display。
.element {
float: left;
display: block; /* Not necessary */
}
有趣的事實:幾年前,我們必須要設置display: inline;,讓大多數(shù)的浮動元素能夠兼容IE6,避免雙倍margin值的bug,。不管怎樣,那些日子早已過去了。
垂直相鄰margin的倒塌
相鄰元素(一個接一個地)的頂部和底部的margin可能會在很多情況下倒塌,但對于浮動元素或絕對定位的元素絕不會出現(xiàn)這樣的情況。閱讀這篇MDN文章或CSS2規(guī)范里的collapsing margin章節(jié)來了解更多東西吧。
水平相鄰的margin永遠不會倒塌。
設計表單的行
表單的行,<tr>,不要接收border,除非你在父<table>上設置了 border-collapse: collapse;。此外,如果<tr>和子<td>或<th>有同樣的border-width,表單行的border將不起作用。點鏈接查看示例。
Firefox和<input>按鈕
由于一些未知原因,F(xiàn)irefox能提交line-height和適用不能被自定義CSS覆蓋的<input>按鈕。
你可以通過以下兩種方法解決這個問題:
1. 堅持使用<button>元素
2. 在你的按鈕中不要使用line-height
你應該先用第一種方法(不管怎樣,我都建議用這種方法,因為<button>元素很好),以下是你需要知道的:
<!-- Not so good --> <input type="submit" value="Save changes"> <input type="button" value="Cancel"> <!-- Super good everywhere --> <button type="submit">Save changes</button> <button type="button">Cancel</button>
如果你想要用第二種方法的話,只要不設置line-height且只使用padding垂直對齊按鈕文本就行了。用firefox瀏覽器打開鏈接來看看原始的問題和解決方案。
好消息!這個問題在Firefox30中似乎被解決了。對于我們以后的使用來說這是個好消息。但值得注意的是這個問題僅在新版本中得到解決,舊版本的問題并未得到解決。
Firefox按鈕的內部輪廓
Firefox用:focus給按鈕(<input>和<button>)增加了一個內部輪廓。顯然,這是為了其可訪問性做的,不過它的位置似乎相當怪異。用以下這段CSS來覆蓋它:
input::-moz-focus-inner,
button::-moz-focus-inner {
padding: 0;
border: 0;
}
你可以通過前一章節(jié)提到的例子中查看這個解決方案。
專業(yè)意見!一定要在按鈕、鏈接和輸入元素中包含一些焦點狀態(tài)。提供可訪問功能是至關重要的,對于用tab鍵來選擇內容的專業(yè)用戶亦是如此。
始終在<button>上設置type
默認值是submit,意味著表單內的button都可以提交表單。所有type=”button”的元素勻不會提交表單,type=”submit”的元素則會提交表單。
<button type="submit">Save changes</button> <button type="button">Cancel</button>
在應用中,如果在表單外使用button就使用type=”button”。
<button class="dismiss" type="button">x</button>
有趣的事實:顯然IE7不能很好的支持button的value屬性。如果不看屬性內容的話,innerHtml(<button>標簽之間的內容)可以彌補這個問題。然而,由于IE7的使用率已經(jīng)下降和給<button>設置value及innerHtml似乎極少見這兩個原因讓我覺得這并不是一個很值得關注的問題。
IE瀏覽器選擇器的限制
IE9及更早版本的IE瀏覽器每個樣式表中只支持4096個選擇器。組合樣式表和每個頁面中包含<style></style>的數(shù)量也受到了限制,最大只能31。在這個限制之后做的任何東西都會被瀏覽器給忽略掉。分割CSS,或者開始重構。我建議后者
作為一個有用的邊注,下面是瀏覽器計算選擇器的方法:
/* One selector */
.element { }
/* Two more selectors */
.element,
.other-element { }
/* Three more selectors */
input[type="text"],
.form-control,
.form-group > input { }
位置解釋
設置了position:fixed;的元素被放置在與瀏覽器窗口有關的地方。設置了position:absolute;的元素被放置在離與static(例如,relative,absolute,fixed)不同位置的父元素最近的地方。
位置和寬度
不要給已經(jīng)設置了position:[absolute|fixed];,left,right的元素設置width:100%。使用width:100%與使用left:0,right::0效果是一樣的。選擇使用其中一種,但別兩種都用。
定位與轉換
如果父元素設置了transform,那么position:fixed將不起作用。用transform創(chuàng)建一個新的包含塊,有效的強制父元素設置position:relative且固定元素的作用與position:absolute.一樣。
查看Demo和閱讀Eric Meyer's post on the matter
哈爾濱品用軟件有限公司致力于為哈爾濱的中小企業(yè)制作大氣、美觀的優(yōu)秀網(wǎng)站,并且能夠搭建符合百度排名規(guī)范的網(wǎng)站基底,使您的網(wǎng)站無需額外費用,即可穩(wěn)步提升排名至首頁。歡迎體驗最佳的哈爾濱網(wǎng)站建設。
