摘要:示例多選框和單選框給多選框和單選框添加樣式是很讓人凌亂的。通向漂亮表單之路一些有用的庫(kù)和拓展工具盡管在復(fù)選框和單選框上的表現(xiàn)力已經(jīng)夠用了,但離其支持高級(jí)表單組件仍然遙遙無(wú)期。其表單部分挺有用的。
系列文章說(shuō)明
原文
在本文中,我們將了解如何在HTML表單上使用CSS,為那些難于自定義的表單組件加以樣式。如前文所述,文本框和按鈕很適合使用CSS,而現(xiàn)在我們得來(lái)探索HTML表單樣式的那些坑了。
在進(jìn)一步討論前,先回顧下兩種HTML表單組件:
比較糟糕的
一些元素只能使用很少的樣式,而且得依賴一些復(fù)雜的技巧,偶爾還得用到CSS3的高級(jí)知識(shí)。
丑陋的
別指望用CSS給這些元素添加樣式了。在最好的情況,你還能寫(xiě)一點(diǎn)不能跨瀏覽器支持的代碼,而且還不可能完全控制這些元素的樣式。
除了文本框和按鈕,表單組件面臨的最大問(wèn)題,是CSS在多數(shù)情況下沒(méi)有足夠的表現(xiàn)力來(lái)恰當(dāng)?shù)亟o復(fù)雜組件添加樣式。
近來(lái)HTML和CSS的演進(jìn)已在拓展CSS的表現(xiàn)力:
CSS2.1很受限,只提供了三個(gè)偽類(lèi):
:active
:focus
:hover
CSS Selector Level 3新增了幾個(gè)和HTML表單相關(guān)的偽類(lèi):
:enabled
:disabled
:checked
:indeterminate
CSS Basic UI Level 3也添加了幾個(gè)偽類(lèi)用于描述組件狀態(tài):
:default
:valid
:invalid
:in-range
:out-of-range
:required
:optional
:read-only
:read-write
CSS Selector Level 4正處于開(kāi)發(fā)狀態(tài),而且討論的重點(diǎn)并不在于增加更多內(nèi)容以改進(jìn)表單:
:user-error只是:invalid偽類(lèi)的一個(gè)增強(qiáng)版、
雖然上述這些都是個(gè)好的開(kāi)始,但其中仍有兩個(gè)問(wèn)題:第一,某些瀏覽器并不會(huì)實(shí)現(xiàn)CSS2.1之外的特性。第二,這些改進(jìn)并未好到能處理諸如日期選擇器之類(lèi)的復(fù)雜組件。
瀏覽器廠商也為拓展CSS在表單上的表現(xiàn)力做了些試驗(yàn),最好得了解下哪些可以使用。
警告:雖然這些實(shí)驗(yàn)挺有趣的,但它們并非標(biāo)準(zhǔn)、并不可靠。若你要使用它們(通常你也不會(huì)這么做),你得自己擔(dān)起風(fēng)險(xiǎn),而且使用非標(biāo)準(zhǔn)屬性也是可能阻礙Web發(fā)展的做法。
Mozilla的CSS拓展
:-moz-placeholder
:-moz-submit-invalid
:-moz-ui-invalid
:-moz-ui-valid
Webkit的CSS拓展
::-webkit-input-placeholder
更多拓展
Microsoft的CSS拓展
:-ms-input-placeholder
Opera沒(méi)有和HTML表單相關(guān)的拓展
控制表單元素的外觀基于 WebKit- (Chrome, Safari) 和 Gecko- (Firefox) 的瀏覽器為HTML組件提供了最高等級(jí)的定制。這些定制也是跨平臺(tái)的,所以瀏覽器需要一個(gè)機(jī)制來(lái)轉(zhuǎn)換那些能被改變樣式的表單組件的原生外觀和體驗(yàn)。
于是它們使用了私有屬性:-webkit-appearance 或 -moz-appearance。這些屬性是非標(biāo)準(zhǔn)的,也不應(yīng)被使用。實(shí)際上,它們?cè)赪ebkit和Gecko上的表現(xiàn)也不盡相同。但是,有一個(gè)值是應(yīng)該知道的:none,使用該值你就可以獲得對(duì)組件樣式的(幾乎所有)控制權(quán)。
所以,若你在一個(gè)元素上應(yīng)用樣式時(shí)遇到問(wèn)題,可以試著使用這些私有屬性(譯注:用none值覆蓋默認(rèn)值)。下面我們會(huì)看到幾個(gè)例子,但最為人熟知的用例是重置Webkit瀏覽器上搜索框的樣式。
示例 多選框和單選框注意:在我們討論Web技術(shù)時(shí),是難于預(yù)測(cè)未來(lái)的,但拓展CSS的表現(xiàn)力確實(shí)很難。另一些做了探索工作的標(biāo)準(zhǔn)如Shadow DOM提供了新的視角。我們對(duì)完全可配置樣式的表單的追求還遠(yuǎn)未結(jié)束。
給多選框和單選框添加樣式是很讓人凌亂的。例如,多選框和單選框的大小往往不會(huì)發(fā)生改變,而且不同瀏覽器的表現(xiàn)相當(dāng)不同。
一個(gè)簡(jiǎn)單例子考慮如下示例:
span { display: inline-block; background: red; } input[type=checkbox] { width : 100px; height: 100px; }
不同瀏覽器的處理如下:
瀏覽器 | 渲染效果 |
---|---|
Firefox 16 (Mac OSX) | |
Chrome 22 (Mac OSX) | |
Opera 12.01 (Mac OSX) | |
Internet Explorer 9 (Windows 7) | |
Internet Explorer 7 (Windows XP) |
由于Opera和IE沒(méi)有諸如-webkit-appearance和-moz-appearance之類(lèi)的特性,所以使用這類(lèi)特性是不太合適的。幸運(yùn)的是,在這種情況下用CSS還能找出解決辦法來(lái)。舉一個(gè)常見(jiàn)的例子:
加一些基本樣式:
body { font: 1em sans-serif; } form { display: inline-block; padding: 0; margin : 0; } fieldset { border : 1px solid #CCC; border-radius: 5px; margin : 0; padding: 1em; } label { cursor : pointer; } p { margin : 0; } p+p { margin : .5em 0 0; }
現(xiàn)在,我們來(lái)加樣式以獲得一個(gè)定制的復(fù)選框。
我們的計(jì)劃是用我們自己的圖像來(lái)替換原生的復(fù)選框。首先得準(zhǔn)備一張具有所有復(fù)選框所需狀態(tài)的圖像,這些狀態(tài)有:未勾選、已勾選、禁用未勾選、禁用已勾選。該圖像可用CSS雪碧圖來(lái)做:
先從隱藏原生的復(fù)選框開(kāi)始,我們只是簡(jiǎn)單地把它們從頁(yè)面的可視范圍中挪出。這里有兩個(gè)要重點(diǎn)考慮的事:
別使用display:none來(lái)隱藏復(fù)選框,因?yàn)槿缜懊嫣岬降模覀冃枰WC復(fù)選框?qū)τ脩艨捎谩J褂?b>display:none的話,復(fù)選框就不再是用戶可訪問(wèn)的,即不能再勾選或者不勾選它。
我們將使用一些CSS3選擇器來(lái)實(shí)現(xiàn)我們的樣式。為支持老舊瀏覽器,可以在我們要用的選擇器前加:root偽類(lèi)。在已有的實(shí)現(xiàn)中,支持我們需要的選擇器的瀏覽器也支持:root偽類(lèi),而剩下的瀏覽器就不支持了。所以這是一種用來(lái)識(shí)別老舊瀏覽器的方便做法,老舊瀏覽器中將會(huì)看到普通的復(fù)選框、而現(xiàn)代瀏覽器中將會(huì)看到定制的復(fù)選框。
:root input[type=checkbox] { /* 原生的復(fù)選框會(huì)從頁(yè)面的可視范圍中被挪出 */ position: absolute; left: -1000em; }
現(xiàn)在我們已經(jīng)移除了原生的復(fù)選框,可以添加我們自己的了,這里會(huì)在原生復(fù)選框后面的元素使用:before偽元素。下面的選擇器中,我們先用屬性選擇器來(lái)獲取復(fù)選框;然后使用相鄰兄弟選擇器來(lái)獲取原來(lái)復(fù)選框后的label。最后我們通過(guò)給:before偽元素添加樣式,用其來(lái)顯示我們定制的復(fù)選框。
:root input[type=checkbox] + label:before { content: ""; display: inline-block; width : 16px; height : 16px; margin : 0 .5em 0 0; background: url("https://developer.mozilla.org/files/4173/checkbox-sprite.png") no-repeat 0 0; /* 下一屬性用于在文本基線調(diào)整復(fù)選框的位置 */ vertical-align: bottom; position: relative; bottom: 2px; }
接下來(lái)用原來(lái)復(fù)選框的:checked和:disabled偽類(lèi)來(lái)改變我們定制的復(fù)選框的狀態(tài)。由于我們使用了CSS雪碧圖,我們只需要調(diào)整背景的位置而已。
:root input[type=checkbox]:checked + label:before { background-position: 0 -16px; } :root input[type=checkbox]:disabled + label:before { background-position: 0 -32px; } :root input[type=checkbox]:checked:disabled + label:before { background-position: 0 -48px; }
最后也是很重要的一步:當(dāng)用戶使用鍵盤(pán)在不同表單組件間瀏覽時(shí),每個(gè)組件應(yīng)該能看到聚焦的效果。由于我們隱藏了原生的復(fù)選框,所以只能自己實(shí)現(xiàn)這一特性來(lái)讓用戶知曉他們正處于何處。下列的CSS實(shí)現(xiàn)了對(duì)我們的定制復(fù)選框的聚焦:
:root input[type=checkbox]:focus + label:before { outline: 1px dotted black; }
最終效果如下:
演示
處理選擇框噩夢(mèng)元素被認(rèn)為是一個(gè)“丑陋的”組件,因?yàn)椴惶赡芙o它添加跨平臺(tái)的樣式。當(dāng)然,還是有一些可以探討的東西的,這里就不長(zhǎng)篇大論了,先看個(gè)例子:
select { width : 80px; padding : 10px; } option { padding : 5px; color : red; }
后面的表格展示了不同瀏覽器如何在兩種情況下處理這一樣式。(渲染效果中)前兩列只是簡(jiǎn)單的例子,后兩列則使用了些定制的CSS來(lái)獲得對(duì)組件外觀的更多控制,如下所示:
select, option { -webkit-appearance : none; /* 獲得對(duì)Webkit瀏覽器里外觀的控制 */ -moz-appearance : none; /* 獲得對(duì)Gecko瀏覽器里外觀的控制 */ /* 獲得對(duì)Presto (Opera) 和 Trident (IE)瀏覽器里外觀的控制 注意這也能在Gecko瀏覽器里起作用,且對(duì)Webkit瀏覽器有副作用 */ background : none; }
瀏覽器 | 普通渲染(關(guān)閉) | 普通渲染(打開(kāi)) | 調(diào)整后渲染(關(guān)閉) | 調(diào)整后渲染(打開(kāi)) |
---|---|---|---|---|
Firefox 16 (Mac OSX) | ||||
Firefox 16 (Windows 7) | ||||
Chrome 22 (Mac OSX) | ||||
Chrome 22 (Windows 7) | ||||
Opera 12.01 (Mac OSX) | ||||
Internet Explorer 9 (Windows 7) | N/A | N/A | ||
Internet Explorer 7 (Windows XP) | N/A | N/A |
如你所見(jiàn),即使使用了 -*-qppearance 屬性,仍會(huì)有問(wèn)題存在:
padding屬性在不同操作系統(tǒng)和瀏覽器中的處理是不一致的。
老舊的IE不支持平滑的樣式。
火狐沒(méi)有能給予下拉箭頭樣式的方式。
若想要給下拉菜單中的元素以樣式,則Chrome和Opera在不同系統(tǒng)下的表現(xiàn)不盡相同。
同時(shí),在本例中,我們只討論了三個(gè)CSS屬性;想想要考慮更多的CSS屬性會(huì)有多么混亂。可見(jiàn),CSS確實(shí)不太適合用來(lái)改變這些組件的外觀和體驗(yàn),但它仍讓你能做些調(diào)整,如果你愿意忍受不同瀏覽器或不同操作系統(tǒng)上的不同的話。
我們將在下篇文章:[表單組件的屬性兼容表]()中嘗試指出哪些屬性是可用的。
通向漂亮表單之路:一些有用的庫(kù)和拓展工具盡管CSS在復(fù)選框和單選框上的表現(xiàn)力已經(jīng)夠用了,但離其支持高級(jí)表單組件仍然遙遙無(wú)期。即使在元素上有一些可能,但文件組件、日期選擇器等仍不能被添加樣式。
若你想獲得對(duì)表單組件的完整控制權(quán),你就得依賴Javascript,別無(wú)選擇。在[怎樣創(chuàng)建定制表單組件]()一文中,我們將了解如何自己實(shí)現(xiàn)它,而如今有一些很有用的庫(kù)可以幫到你:
Uni-form是一個(gè)規(guī)范了表單格式和使用CSS給予表單樣式的框架。在和jQuery一起使用時(shí),它也提供了些額外的可選特性。
Formalize是一些常見(jiàn)Javascript框架(如jQuery、Dojo、YUI等)的一個(gè)插件,用于規(guī)范化和定制表單。
Niceforms是個(gè)提供了完整web表單定制的獨(dú)立Javascript方法。你可以使用一些內(nèi)建的主題、也可自己創(chuàng)建。
下面幾個(gè)庫(kù)則不止用于處理表單,但它們?cè)谔幚鞨TML表單時(shí)有很多有趣的特性:
jQuery UI提供了些非常有趣的可定制高級(jí)組件,比如日期選擇器(特別關(guān)注了無(wú)障礙訪問(wèn))。
Twitter Bootstrap非常有用,如果你想規(guī)范化你的表單的話。
WebShim是一個(gè)龐大的工具,用于處理那些支持HTML5的瀏覽器。其web表單部分挺有用的。
要知道,綁定CSS和Javascript會(huì)引起副作用。所以若你選擇了上述的一種庫(kù),就得時(shí)常保證在腳本失效時(shí)會(huì)可回退的樣式表。造成腳本失效的原因很多,特別在移動(dòng)端,故你的Web站點(diǎn)或app設(shè)計(jì)得能最好地處理這些情況。
結(jié)論當(dāng)在HTML表單上使用CSS仍存在許多坑時(shí),有很多方法可以繞過(guò)這些坑。本來(lái)是沒(méi)有確切、通用的解決方案的,但現(xiàn)代瀏覽器帶來(lái)了新可能。而現(xiàn)在,最佳方案是研究不同瀏覽器對(duì)用在HTML表單組件的CSS的支持程度。
下篇文章,我們將探索各種HTML表單組件對(duì)那些最重要的CSS屬性的支持程度:[表單組件的屬性兼容表]()。
參見(jiàn)Dive into HTML5: Forms
Useful ideas and guidelines for good web form design
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/49937.html
摘要:示例多選框和單選框給多選框和單選框添加樣式是很讓人凌亂的。通向漂亮表單之路一些有用的庫(kù)和拓展工具盡管在復(fù)選框和單選框上的表現(xiàn)力已經(jīng)夠用了,但離其支持高級(jí)表單組件仍然遙遙無(wú)期。其表單部分挺有用的。 系列文章說(shuō)明 原文 在本文中,我們將了解如何在HTML表單上使用CSS,為那些難于自定義的表單組件加以樣式。如前文所述,文本框和按鈕很適合使用CSS,而現(xiàn)在我們得來(lái)探索HTML表單樣式的那...
摘要:并非所有組件受的影響都是平等的如今在表單使用時(shí)依然有一些困難這些問(wèn)題可歸為三類(lèi)還好的若存在跨平臺(tái)問(wèn)題,一些元素可以只添加少許的樣式,有如下幾個(gè)結(jié)構(gòu)元素此外,還有所有的文本框組件單行或多行,以及按鈕。 系列文章說(shuō)明 原文 本文中,我們將學(xué)習(xí)如何使用CSS來(lái)讓HTML表單看起來(lái)更漂亮,這可能需要竅門(mén)才能做到。由于歷史及技術(shù)上的原因,表單組件并不太適合使用CSS;而也正因?yàn)橛羞@些困難,許...
摘要:并非所有組件受的影響都是平等的如今在表單使用時(shí)依然有一些困難這些問(wèn)題可歸為三類(lèi)還好的若存在跨平臺(tái)問(wèn)題,一些元素可以只添加少許的樣式,有如下幾個(gè)結(jié)構(gòu)元素此外,還有所有的文本框組件單行或多行,以及按鈕。 系列文章說(shuō)明 原文 本文中,我們將學(xué)習(xí)如何使用CSS來(lái)讓HTML表單看起來(lái)更漂亮,這可能需要竅門(mén)才能做到。由于歷史及技術(shù)上的原因,表單組件并不太適合使用CSS;而也正因?yàn)橛羞@些困難,許...
摘要:一個(gè)表單由一或多個(gè)部件組成,這些部件可以是文本框單行或多行選擇框按鈕復(fù)選框或單選按鈕。在我們的示例里,一個(gè)文本框中用了該屬性的默認(rèn)值,該值表示一個(gè)基本的單行文本框,用于接收無(wú)控制或驗(yàn)證的任何文本。 前言 這個(gè)系列譯自mdn上的一份表單指南,原文詳盡闡述了表單相關(guān)的基礎(chǔ)知識(shí)。而表單作為一個(gè)經(jīng)典的頁(yè)面交互方式,是每個(gè)前端工程師繞不開(kāi)的話題,通過(guò)翻譯這個(gè)系列的文章既是有助于掃清自己的知識(shí)盲區(qū)...
摘要:提到老舊瀏覽器,我們腦海中往往復(fù)現(xiàn)的就是舊版的。但幸運(yùn)的是,有一些技巧可以協(xié)助解決由老舊瀏覽器引起的的問(wèn)題。放棄表單和老舊瀏覽器的最大問(wèn)題是對(duì)的支持。結(jié)論如你所見(jiàn),處理老舊瀏覽器所涉及的內(nèi)容不止有表單。 系列文章說(shuō)明 原文 所有的web開(kāi)發(fā)者都會(huì)很快(或者很痛苦地)意識(shí)到Web是一個(gè)粗糙的環(huán)境,其中最糟糕的一點(diǎn)就是老舊的瀏覽器。提到老舊瀏覽器,我們腦海中往往復(fù)現(xiàn)的就是舊版的IE。但...
閱讀 1651·2021-09-22 15:21
閱讀 2870·2021-09-09 09:32
閱讀 2697·2021-09-02 09:52
閱讀 3312·2019-08-30 14:02
閱讀 2226·2019-08-26 13:25
閱讀 1458·2019-08-26 13:24
閱讀 1609·2019-08-26 10:31
閱讀 1563·2019-08-26 10:16