by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=3381css
本文参考自TJ VanToll的List of Pseudo-Elements to Style Form Controls.html
若是你想看原汁原味的译文,能够移步这里:伪元素控制表单样式. css3
我这里全部的效果都本身从新制做demo试验了下,辨别下真伪,看看window环境下的差别以及其余一些属性支持等,而后,补充、记录、备忘。web
您如今可能会以为折腾的这些东西不实用,过个1~2年,可能就是个宝了,记住这里,适时过来瞅瞅,会有别样收获。chrome
时间流逝,浏览器们支持的伪元素势必会愈来愈多,所以,这里也会不按期更新,固然,频率确定不会像大姨妈那样频繁。浏览器
由于牵扯多个浏览器,所以,内容还算挺多,有个索引仍是颇有必要的;为节约高度,水平排列,但愿还习惯。app
input[type=button]
参见“其余元素”部分的<button>元素less
input[type=checkbox] / input[type=radio]
Trident内核,也就是咱们常说的IE浏览器下(如下全部IE下的伪元素均指IE10+浏览器),使用::-ms-check
能够更改单复选框的UI. 以下CSS代码以及HTML代码:dom
::-ms-check { color: #34538b; background: #a0b3d6; padding: .5em; }
<input type="radio" /> <input type="checkbox" />
结果在window7 IE10下的效果就是这样:
ide
input[type=color]
目前IE10以及FireFox21尚未支持input[type=color]
,天然也没有响应的伪元素支持,Chrome浏览器下能够,其提供了两个伪元素用来改变默认样式:::-webkit-color-swatch-wrapper
以及::-webkit-color-swatch
.
通常而言,HTML5中表单的控件效果都是经过浏览器的Shadow Dom
建立的,脱离文档主树,不受大环境CSS影响,要控制其UI只能使用浏览器开发的伪元素API接口。比如上面的input[type=color]
在Chrome下的默认UI效果(见下)其实就是两层div,而后浏览器自带的一些CSS控制而成的效果。
而上面的两个可以使用伪元素就是指向的这两层div,咱们能够借此应用部分的CSS样式进行重置,记住,只有部分的样式能够重置。而这些伪元素CSS咱们是没法使用浏览器自带的开发工具查看到的,由于其并不属于文档树,只是背后的一颗子树。
例如,这里,咱们可使用伪元素,应用特定样式,让两层div首尾连在一块儿,就像下面这个效果:
CSS代码以下:
::-webkit-color-swatch-wrapper { border: 1px solid #777; background-image: -webkit-gradient(linear, 0 0, 100% 0, from(red), color-stop(15%, orange), color-stop(30%, yellow), color-stop(50%, green), color-stop(65%, darkcyan), color-stop(80%, blue), to(purple)); } ::-webkit-color-swatch { height:21px; position:relative; left: 40px; top:-5px; }
<input type="color">
input[type=date]
依旧Chrome浏览器是主角,目前WebKit下有以下8个伪元素能够改变日期控件的UI:
::-webkit-datetime-edit
– 控制编辑区域的::-webkit-datetime-edit-fields-wrapper
– 控制年月日这个区域的::-webkit-datetime-edit-text
– 这是控制年月日之间的斜线或短横线的::-webkit-datetime-edit-month-field
– 控制月份::-webkit-datetime-edit-day-field
– 控制具体日子::-webkit-datetime-edit-year-field
– 控制年文字, 如2013四个字母占据的那片地方::-webkit-inner-spin-button
– 这是控制上下小箭头的::-webkit-calendar-picker-indicator
– 这是控制下拉小箭头的下图为原文做者不知从哪儿搞来的内部结构,就是上面提到的Shadow Dom:
补充于2013-06-08
感谢@ethanchen提点,Shadow Dom以下几步便可查看。
Chrome浏览器下,F12打开开发者工具面板,右下角有个齿轮图片,点击之:
再展开的面板中勾选”Show Shadom DOM”便可:
<– 更新结束 –>
默认左边效果的
date
类型文本框应用以下的CSS伪元素样式后,就会变成:
::-webkit-datetime-edit { padding: 1px; background: url(/study/image/selection.gif); } ::-webkit-datetime-edit-fields-wrapper { background-color: #eee; } ::-webkit-datetime-edit-text { color: #4D90FE; padding: 0 .3em; } ::-webkit-datetime-edit-year-field { color: purple; } ::-webkit-datetime-edit-month-field { color: blue; } ::-webkit-datetime-edit-day-field { color: green; } ::-webkit-inner-spin-button { visibility: hidden; } ::-webkit-calendar-picker-indicator { border: 1px solid #ccc; border-radius: 2px; box-shadow: inset 0 1px #fff, 0 1px #eee; background-color: #eee; background-image: -webkit-linear-gradient(top, #f0f0f0, #e6e6e6); color: #666; }
我的以为8个伪类中,最实用的是使用:::-webkit-inner-spin-button { visibility: hidden; }
去除设计师讨厌的上下小箭头。
补充于2013-06-27
貌似date类型文本框在Chrome下如今多了个叉叉清除内容的效果,伪元素是::-webkit-clear-button
, 若要清除,可以使用以下代码:
::-webkit-clear-button { -webkit-appearance: none; }
input[type=file]
文件上传空间,IE10以及Chrome都有伪元素能够染指该类型控件,从哪一个浏览器开始好呢?就先IE10浏览器吧(下同)。
IE10+浏览器使用的是::-ms-browse
伪元素,能够改变按钮模样部分的边框、背景色、高度啊之类的,以下一段示例CSS代码:
::-ms-browse {
padding: .4em;
line-height: 24px; /* 光标垂直居中 */
border: 1px solid #a0b3d6;
background: #f0f3f9;
color: #34538b;
}
结果整容成下面这样子——跟郑爽同样-少女变少妇了:
IE浏览器一贯走本身的路,让别人骂去。显然,Chrome用法与之截然不同,伪元素为::-webkit-file-upload-button
,相似效果CSS以下:
::-webkit-file-upload-button { padding: .4em; line-height: 30px; border: 1px solid #a0b3d6; background: #f0f3f9; color: #34538b; }
看看Chrome整容的模样:
这……
input[type=number]
目前Webkit浏览器独掌天下,如下三个伪元素能够耍弄:
::-webkit-textfield-decoration-container
– input内部、上下箭头以及填写数值的外部容器::-webkit-inner-spin-button
– 就是Chrome下上上下下的小小按钮::-webkit-outer-spin-button
– 测到浏览器起火都不知是干吗的~从使用角度讲,下面代码是最有用的:
::-webkit-inner-spin-button {
-webkit-appearance: none; /* 上下小箭头按钮,你丫太丑了,滚粗,负分 */
}
下图为又设置了:
::-webkit-textfield-decoration-container { background-color: #f0f3f9; }
的效果与默认效果的对比:
input[type=password]
记得IE10刚出来那会儿,就有人叫嚣了:哎呀呀呀,IE10下文本框输入文字后有叉叉啊;哎呀呀呀,密码框输入后有眼睛啊;哎呀呀呀,怎么去掉啊?
我我的以为眼睛不挺好的,干吗要抹杀掉呢?
我忽然想起了一首歌:“你不要这样的看着我,个人脸会变成红苹果……”。估计你们比较害羞,被IE MM的眼睛盯着看很差意思,因此才想去掉的。
去除password
类型输入框的眼睛须要使用伪元素::-ms-reveal
,咱们可使用display
, visibility
控制显隐,也可使用color
, background
控制样式。
当咱们使用background
控制背景的时候,IE浏览器本身holder的黑色边框样式会自动瓦解,使用系统一脉相承的文本框UI,以下图所示:
若是您没有IE10浏览器,哥,出门500米右拐就是护城河,您能够跳下去——清醒下。我今天想办法搞到了咱们主站的一些访问数据,哟,IE10用 户数目超过个人想象,还老多来~用上海话讲,就是“老激棍来”,不要迷糊迷糊还在折腾IE6了,拥抱将来,拥抱变化,GOGOGO!
placeholder属性
哈哈,属性貌似比类型要吃香,可贵百花齐放百家争鸣,FireFox浏览器这回也有得登场了!
以下HTML代码:
<input placeholder="占座" />
各个浏览器轮着上~~
先看IE浏览器,:-ms-input-placeholder
一看就是虐placeholder
属性的,来个变色①+缩进,当当当当:
:-ms-input-placeholder { color: mediumvioletred; text-indent: 5px; }
//zxx: 颜色mediumvioletred
取自“CSS3下的147个颜色名称及对应颜色值”一文。
因而:
而后Chrome浏览器,喔呵,这回亮了,IE浏览器和Chrome浏览器竟然站到同一战线上了,伪元素为:::-webkit-input-placeholder
. 活脱脱就一个私有前缀的差别,相似代码:
::-webkit-input-placeholder { color: mediumvioletred; text-indent: 5px; }
相似效果:
对于首次粉墨登场的FireFox浏览器,其伪元素是::-moz-placeholder
, 听说这个伪元素是FireFox 19以后才支持的,以前是使用:-moz-placeholder
伪类。
CSS代码走起:
::-moz-placeholder {
color: mediumvioletred;
text-indent: 5px; /* 没有用 */
opacity: 1!important;
}
FireFox浏览器下占位符文字的透明度默认是0.54
, 至少我window7 FireFox 21下是如此,所以须要强制opacity: 1
让placeholder
值颜色与IE/Chrome一致。
input[type=range]
IE, Chrome, FireFox本轮均有出场。HTML测试代码都是同样的,很简单,就一个range
控件:
<input type="range" />
IE浏览器伪元素相对复杂些:
::-ms-fill-lower
: 已经拖拽的区域::-ms-fill-upper
: 尚未拖拽的区域::-ms-ticks-before
: 前面/上面的刻度线::-ms-ticks-after
: 后面、下面的刻度线::-ms-thumb
: 中间拖动的块块::-ms-track
: 拖动轨道::ms-tooltip
: 拖动时候显示的文字什么的。注意,这个元素只能用display:none
等隐藏样式。以下设置:
::-ms-fill-lower { background: orange; }
::-ms-fill-upper { background: green; }
::-ms-thumb { background: red; }
::-ms-ticks-before { display: block; color: black; }
::-ms-ticks-after { display: block; color: blue; }
::-ms-track { padding: 5px; }
::-ms-tooltip { display: none; /* 数值提示 只能是display或visibility,见截图特地标示 */
Webkit核心,如Chrome浏览器下,使用的伪元素为::-webkit-slider-runnable-track
和::-webkit-slider-thumb
. 前者指的是“跑动轨迹”,也就是那个条条元素;后者指用来拖的哪块突出的小疙瘩。应用以下CSS:
::-webkit-slider-runnable-track { border: 1px solid #a0b3d6; background: #f0f3f9; } ::-webkit-slider-thumb { outline: 1px dotted #a0b3d6; background-color: #34538b; }
效果以下,window 7下:
咱们还可使用::-webkit-slider-runnable-track:hover
以及::-webkit-slider-thumb:hover
实现鼠标通过效果(demo中有)。
对于FireFox浏览器,听说在FireFox 22下才有效果,我目前是FireFox 21, 好像已是最新版本,所以,无效果截图(个把月后查看demo可能就有效果了),代码以下:
::-moz-range-track { border: 1px solid #a0b3d6; height: 20px; background: #f0f3f9; } ::-moz-range-thumb { background: #34538b; height: 30px; }
input[type=reset]
参见<button>元素
input[type=search]
目前Chrome下小有成就,两个伪元素:::-webkit-search-cancel-button
和::-webkit-search-results-button
,前者控制输入文字后出现的叉叉,后者控制放大镜。下面的代码能够把它们所有干掉!
/* 去除圆角 */
input[type=search] { -webkit-appearance: none; }
/* 隐藏取消按钮 */ ::-webkit-search-cancel-button { -webkit-appearance: none; } /* 隐藏放大镜 */ ::-webkit-search-results-button { -webkit-appearance: none; }
input[type=submit]
参见<button>元素
input[type=text]
在IE10+浏览器下,提供了伪元素::-ms-value
, 能够更改文本框(如type=text
, type=password
等)以及下拉框(select
)的样式。例以下面的HTML代码:
<input type="text" value="雅美蝶你能再深一点么"> <input type="password" value="雅美蝶你能再深一点么"> <select><option selected>雅美蝶你能再深一点么</option></select>
配合以下的CSS:
::-ms-value { padding: 4px; color: #34538b; border: 1px solid #a0b3d6; background-color: #f0f3f9; }
因而, “蝴蝶飞呀!就象童年在风里跑
感受年少的彩虹比海更远比天还要高
蝴蝶飞呀!飞向将来的城堡
打开梦想的天窗 让那成长更快更美好……”
IE10+还提供了伪元素::-ms-clear
,能够改变或者隐藏IE10+浏览器文本框末尾的关闭小叉叉。
隐藏以下:
::-ms-clear { display: none; }
固然,咱们还可使用border
, background
等控制其UI,以下面这个效果:
<button>元素
此部分,目前,貌似仅Gecko内核浏览器有相关处理,两个伪元素,::-moz-focus-outer
和::-moz-focus-inner
, 主要针对按钮类型的元素,包括button
类型, reset
类型以及submit
类型。
例如,使用border
让这两个伪元素呈现一下:
button::-moz-focus-inner, input::-moz-focus-inner { border: 5px solid #34538b; } button::-moz-focus-outer, input::-moz-focus-outer { border: 5px solid #cad5eb; }
不过上面这些我的以为没啥屌用,除了一些极客状况,有可能有用的是一些重置,如border
与padding
:
button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
<keygen>元素
Webkit下有伪元素可控制,为::-webkit-keygen-select
, 以下设置:
::-webkit-keygen-select { border: 1px solid #a0b3d6; background-color: #f0f3f9; color: #34538b; }
<keygen>
<meter>元素
<meter>
用作测量、评分等。Webkit下有以下伪元素可控:
::-webkit-meter-bar
– 条条::-webkit-meter-optimum-value
– 得分好的时候那部分区域::-webkit-meter-suboptimal-value
– 分数凑合时候::-webkit-meter-even-less-good-value
– 分数糟糕时候区域状态以下HTML与CSS代码:
<meter low="69" high="80" max="100" optimum="100" value="92">优</meter> <meter low="69" high="80" max="100" optimum="100" value="72">良</meter> <meter low="69" high="80" max="100" optimum="100" value="52">差</meter>
.deal meter { -webkit-appearance: none; }
.::-webkit-meter-bar {
height: 1em;
background: white;
border: 1px solid black;
}
::-webkit-meter-optimum-value { background: green; } /* 好 */
::-webkit-meter-suboptimum-value { background: orange; } /* 凑合 */ ::-webkit-meter-even-less-good-value { background: blue; } /* 糟糕 */
实际上,FireFox下,对伪元素::-moz-meter-bar
也是有反应的,不过貌似效果有点偏题了,以下CSS:
::-moz-meter-bar { background: rgba(0,96,0,.6); }
结果不是背景条变化,而是进度条变了,所有都变了,以下截图:
<progress>元素
又是一个各个浏览器都有伪元素控制的HTML5控件元素。
外甥点灯笼——照旧,先看IE浏览器,伪元素为::-ms-fill
,能够改变已完成进度条的部分样式,如背景色:
::-ms-fill { background: #34538b; }
Chrome浏览器相对复杂,控制也相对精细些,其Shadow DOM以下:
::-webkit-progress-inner-element
– progress
内元素::-webkit-progress-bar
– 背景进度条::-webkit-progress-value
– 完成进度条因而,以下CSS控制:
progress { -webkit-appearance: none; } ::-webkit-progress-inner-element { } ::-webkit-progress-bar { border: 1px solid black; } ::-webkit-progress-value { background: #34538b; }
效果以下(win7 Chrome 25):
对于FireFox浏览器,::-moz-progress-bar
伪元素控制,以下CSS:
::-moz-progress-bar { background: #34538b; }
效果截图以下(win7 FF21):
<select>元素
IE10浏览器下,这厮::-ms-expand
能够改变下拉框元素的下拉按钮样式。
::-ms-expand { padding: .5em; color: #34538b; border: 1px solid #a0b3d6; background: #f0f3f9; }
<textarea>元素
Webkit下有伪元素::-webkit-resizer
能够改变右下角的拉伸小标记的样式。
例如,咱们能够隐藏之(不一样于resize: none
,仍可拉伸)或设置背景图片替换之:
::-webkit-resizer { display: none; }
::-webkit-resizer { background: url(/study/image/selection.gif); outline: 1px dotted #000; }
截图效果:
表单验证信息
仅Webkit内核浏览器目前鸟之,改变验证提示时候bubble框的UI, 伪元素以下:
::-webkit-validation-bubble
– 整个弹出框区域::-webkit-validation-bubble-arrow
– 弹出框的尖角::-webkit-validation-bubble-arrow-clipper - 弹出框尖角所在块状区域
::-webkit-validation-bubble-heading
– 文字标题占据区域::-webkit-validation-bubble-message
– 文字提示的整个方形的信息框::-webkit-validation-bubble-text-block
– 文字所在block块区域实际重置样式的时候,只要使用部分就能够了,我的愚见,::-webkit-validation-bubble-text-block
与::-webkit-validation-bubble-heading
有功能重复之嫌,所以,通常只要设置一个就能够了!::-webkit-validation-bubble-heading
要更加深刻一些。
比方说咱们要获得相似下面看似不错的UI效果:
咱们可能须要以下一些设置:
::-webkit-validation-bubble { min-width:152px; margin-top: -1px;}
::-webkit-validation-bubble-arrow { border: 1px solid #F7CE39; background: #FFFBC7; top: 4px; left: 0px; } /* 你不以为默认尖角太大了吗?这里设置小一点,默认含relative属性 */
::-webkit-validation-bubble-arrow-clipper { text-align: center; }
::-webkit-validation-bubble-heading { color: #444; }
::-webkit-validation-bubble-message { border: 1px solid #F7CE39; background: #FFFBC7; border-radius: 3px; } /* 通常而言,这是重置的主体,改变边框、背景色以及圆角大小等 */ ::-webkit-validation-bubble-text-block { font-size: 12px; }