Reset CSS 研究(技术篇)
时间过得真快,离 Reset CSS 研究(八卦篇) 已经 3 个多月了。废话少说,赶紧将技术篇写完吧。
回顾与反思
第一份 reset css 是 Tantek 的 undohtml.css, 很简单的代码,Tantek 根据自己的需要,对浏览器的默认样式进行了一些重置。
Eric 的也是如此。
YUI 除了 cssreset, 还配套有 cssfonts 和 cssbase. cssreset 清除默认样式,cssfonts 和 cssbase 则将一些元素的默认样式重设回来。
很长一段时间,* { margin: 0; padding: 0; }和 YUI cssreset 模糊了我对 reset 的理解,让我认为 reset 就应该清除掉所有样式,将一切归零。
后来阅读 Eric 的博客,发现 Eric 并不期望大家下载他的 reset.css 后直接拿去用。而是期待能根据具体需求,适量裁剪和修改后再使用。
世间的事总会有些戏剧化,Eric 的期待没有如意。大家都想得到通用解决方案,期待银弹。在这种渴求下,YUI cssreset 很彻底很干净,广为流传。
更戏剧化的是,由于 YUI 的 cssfonts 和 cssbase 只考虑了西欧文字,对汉字的考虑不多。这导致国内用户大部分只会用 cssreset. 比喻成武林秘籍的话,我们一直在用残卷。
调节显示器,有一个“重置为出厂设置”的选项。这有两重含义:一是去掉当前的设置,二是还原为出厂时的设置。CSS Reset 也一样,第一步是清除浏览器的默认样式,第二步是重设浏览器的默认样式。很明显,* { margin: 0; padding: 0; }和 YUI cssreset 偏向于第一步。
这两步并不是截然分开的。reset 的初始意图,是想减少各种浏览器下默认样式的差异。对于没有差异的默认样式,则可以根据情况,选择性重置或不重置。比如 strong, 默认都是粗体,这符合预期,就可以不重置。又比如 a, 现在的主流浏览器下默认样式无差别,但为了某些因素,比如可读性,也会考虑将下划线重置为无。
以上,是回顾,是反思,是接下来技术实现的指导思想。
技术实现
天下一大抄,抄来抄去,种种 reset 代码,长得都差不离。这没什么不好,不光解决了问题,还促进了技术传播。
但从 2004 年到现在,已经一晃眼 5 年了。曾经的一些考虑,比如针对 ie 5.5 的代码,目前已经可以大胆舍弃了。抄的过程中,努力去做到求实求证,努力求一份自己的理解,很难很难。但只要孜孜不倦,终究会有所获,有所得,有所悟。
这是我和好友正淳一起整理的一份 reset.css:
/*
KISSY CSS Reset
理念:清除和重置是紧密不可分的
特色:1.适应中文 2.基于最新主流浏览器
维护:玉伯(lifesinger@gmail.com), 正淳(ragecarrier@gmail.com)
*/
/* 清除内外边距 */
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */
dl, dt, dd, ul, ol, li, /* list elements 列表元素 */
pre, /* text formatting elements 文本格式元素 */
fieldset, lengend, button, input, textarea, /* form elements 表单元素 */
th, td { /* table elements 表格元素 */
margin: 0;
padding: 0;
}
/* 设置默认字体 */
body,
button, input, select, textarea { /* for ie */
/*font: 12px/1 Tahoma, Helvetica, Arial, "宋体", sans-serif;*/
font: 12px/1 Tahoma, Helvetica, Arial, "\5b8b\4f53", sans-serif; /* 用 ascii 字符表示,使得在任何编码下都无问题 */
}
h1 { font-size: 18px; /* 18px / 12px = 1.5 */ }
h2 { font-size: 16px; }
h3 { font-size: 14px; }
h4, h5, h6 { font-size: 100%; }
address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */
code, kbd, pre, samp, tt { font-family: "Courier New", Courier, monospace; } /* 统一等宽字体 */
small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */
/* 重置列表元素 */
ul, ol { list-style: none; }
/* 重置文本格式元素 */
a { text-decoration: none; }
a:hover { text-decoration: underline; }
abbr[title], acronym[title] { /* 注:1.ie6 不支持 abbr; 2.这里用了属性选择符,ie6 下无效果 */
border-bottom: 1px dotted;
cursor: help;
}
q:before, q:after { content: ''; }
/* 重置表单元素 */
legend { color: #000; } /* for ie6 */
fieldset, img { border: none; } /* img 搭车:让链接里的 img 无边框 */
/* 注:optgroup 无法扶正 */
button, input, select, textarea {
font-size: 100%; /* 使得表单元素在 ie 下能继承字体大小 */
}
/* 重置表格元素 */
table {
border-collapse: collapse;
border-spacing: 0;
}
/* 重置 hr */
hr {
border: none;
height: 1px;
}
/* 让非ie浏览器默认也显示垂直滚动条,防止因滚动条引起的闪烁 */
html { overflow-y: scroll; }
用途在注释里都标明了,就不多解释。测试页面在这里:CSS Reset Test. 这份测试页面花了我们很大心血,如果转载,请注明下出处,呵呵。
先说明下测试过的浏览器:IE 6+, Firefox 3.5+, Safari 4+, Chrome 2+, Opera 10+
下面解释一些和 YUI cssreset 的差异点:
- 清除内外边距的元素,去掉了 div, code(在测试浏览器中,没发现有边距), 增加了 button(感觉是 YUI 遗漏了).
- 去掉了 YUI 里对 html 颜色和背景色的设置。在测试浏览器中,没有发现差异。(要设的话,推荐
background: transparent) - 对于 address, caption, …, em, strong 等文本格式元素,做了调整。保留了 strong 和 th 的粗体。
- 对 abbr 和 acronym 做了调整,使得在非 ie6 下可视性更好。
- 去掉了 sup 和 sub 的样式,直接用浏览器默认的即可。
- 对于 input, select, textarea 表单元素,去掉了针对 ie 的 inherit, 只保留了 font-size 的 inherit hack. 因为其它 hack 经测试已失效。
- 增加了一些元素的默认样式。
此外,对整体代码的组织形式做了调整,按照元素的类别将代码进行了分组。
如何使用
请记住:永远不存在万能解决方案,永远没有银弹。
因此我的建议和 Eric 是一样的:请根据具体需求,适量裁剪和修改后再使用。
比如针对淘宝,可以在 reset.css 的基础上,修改为 reset-taobao.css.
如果是个人博客,我个人喜欢的一个方案是:reset-blog.css.
相关测试页面请查看:cssreset svn.
真实使用时,请用压缩后的版本:reset-min.css.
对于 reset.css 本身,我们期待它能尽量多的适用于各种场景,但不期待它能解决所有问题。目前而言,reset.css 里的默认样式,是我和正淳等各位同事和朋友们实践经验的总结,算是“精挑细选”,但不期待能解决所有问题。
最后,期待你的参与和建议。如果这份 reset.css 能有幸在你的项目中得到使用,则非常期待你的反馈。

July 14th, 2009 on 22:55
牛!
July 14th, 2009 on 23:32
多一款浏览器就多一份工作…这世界真是摧残web开发者哈. 被浏览器的开发者天天忽悠,他们定的默认属性我们还得知道… 这世道…
July 15th, 2009 on 8:51
真实使用时,请用压缩后的版本:reset-min.css.
这个链接似乎没有用
July 15th, 2009 on 8:59
另外,还有一点建议
如果能将里面的示例文字改成为所用的元素的语义描述,那就更好了
能为HTML的语义化做很大的贡献哦
July 15th, 2009 on 9:32
July 15th, 2009 on 9:48
@闲水小鱼:reset-min.css 的链接已修复。示例文字改成语义,有些标签不适用,没去折腾了。
@feng:reset 不是清除样式
July 16th, 2009 on 10:34
强文拜读。
文章中“reset不是清除样式”的思想我非常赞同。类似del、strong等强语义标签,默认样式就挺好的,况且在所有浏览器下表现又如此一致。
收藏啦~
July 16th, 2009 on 11:41
很好,个人感觉reset.css的本质就是清除浏览器对各个标签解释的差异性,对于浏览器解释一致的元素没必要reset。像保留strong、th的粗体就很好。
July 16th, 2009 on 20:38
思想上赞同,没什么好说的了。
July 17th, 2009 on 13:22
像保留strong、th的粗体就很好
同意…
July 17th, 2009 on 16:36
表单元素form也要清margin和padding的。在IE6、IE7中有margin
July 18th, 2009 on 12:54
@vapour: 感谢反馈,已经将 form 加上。
July 18th, 2009 on 22:44
以前一直用Eric的,没有细细深究,
永远没有银弹…
July 21st, 2009 on 15:12
請問兩個問題,下面兩個地方,不是很明白,有沒相關的例子看看?
“\5b8b\4f53″ /* 用 ascii 字符表示,使得在任何编码下都无问题 */
/* 让非ie浏览器默认也显示垂直滚动条,防止因滚动条引起的闪烁 */
html { overflow-y: scroll; }
July 22nd, 2009 on 17:31
@嗰個人:
“\5b8b\4f53″ 是“宋体”两个字的ascii码表示,是为了防止css文件文本编码差别而引起bug。这一点,我一直是用宋体的英文名称“simsun”的。
在ff等非ie浏览器下,如果页面内容不满一屏时,默认是没有纵向滚动条的。加上html { overflow-y: scroll; },则始终有纵向滚动条。
July 26th, 2009 on 18:29
@mingelz:
明白了,再多請問一個問題。
html標籤是最上層的標籤,在html標籤中設滚條合理。但我試着在body中設置該式樣也有效果。不知道,如果是 body{ overflow-y: scroll; } 的話,會出現什麽問題嗎?
August 25th, 2009 on 10:57
去掉了 YUI 里对 html 颜色和背景色的设置。在测试浏览器中,没有发现差异。 //如果在window -》 显示属性 -》外观- 》高级外观 中改变窗体的默认颜色,那么差异就出来了
August 31st, 2009 on 16:00
以前自己的reset.css也参考了很多资源,主要YUI。后来看到taobao首页的感觉挺中国化得,做了些调整然后自己用了。支持“请根据具体需求,适量裁剪和修改后再使用。”
September 4th, 2009 on 0:59
font-family:Tahoma;
Tahoma字体在IE6中不支持13px,会显示14px.
September 18th, 2009 on 17:19
对于hr应该很少使用了,我看很多reset很少对它进行重置。
你对hr的重置有点不解,想请教一下,
hr{border:none;height:1px;*color:#fff;}
height:1px的用途是什么;
*color:#fff对于有背景颜色或背景图的页面应该不太好吧?
October 9th, 2009 on 10:23
在压缩版的css里没有加html { overflow-y: scroll; }
^_^
这个我觉得是很有必要的,不知道是疏忽还是刻意的呢?
October 20th, 2009 on 22:48
大侠,压缩版的连接好像失效了,打算用大侠的reset…看到留言请邮件一份给我,谢谢:)
October 29th, 2009 on 10:02
以前reset的时候把strong & th都重置了,在工作过程中发现重置确实不是很理想
如果有特殊情况学要用到重置后的strong & th 再进行调整比较好!个人意见
November 23rd, 2009 on 13:36
呃~~~ css reset 大同小异。没有最好,只有更合适。
December 24th, 2009 on 19:43
q:before, q:after { content: ”; }
请问为何这样后,FF下q的引号就清除了?
另外,q在FF下font-family是不一样的。
January 17th, 2010 on 5:22
去掉了 YUI 里对 html 颜色和背景色的设置。在测试浏览器中,没有发现差异。(要设的话,推荐background: transparent)
摘抄一篇网上的文章片段, 我觉得YUI 设置html颜色和背景的设置应该是解决这个问题的.
1、让你想当然,给你点颜色看看
这个问题其实被很多人忽略,小到个人站点,大到门户网站都有可能犯这个错误。不信想想看,如果你所做的网站背景是白色的,那么你还会记得在 CSS 里写下 Background-color:#ffffff 这句代码吗?我敢打赌,大部分人不会!并不是因为大家偷懒,而是这个举手之劳被彻底忽略了,为什么?因为我们所用的 Windows 操作系统在大多数的情况下,运行在其上的各种软件的默认背景色是白色,这其中就包括 IE 浏览器,所以在网站背景是白色的条件下,许多的网页制作者就想当然的忽略了关于背景色的设置,反正大家都是白色,不设的话也看不出来。但是不要忘记了,Windows 从 XP 开始支持系统主题的更换,有很多第三方的主题会更改系统默认的设置,其中就包括背景色的设置,如果没有强制设定页面中的背景色,那么页面就会以当前浏览器的背景色来显示内容,其结果就是网站美观性被大大的降低,拿大家都熟悉的网易来举例,下面的截图是在我机子上浏览时的样子,由于前不久换了一套 Vista 的主题风格,所以浏览器的背景色变成了浅灰色。
仔细看看网易的 Logo ,看出来吗?对,那个 Logo 的背景是白色的,但旁边的背景色却是灰色的,换句话说就是网易整个页面的背景原定就是白色的,这在浏览器背景为白色的前提下是看不出什么来的,但是像现在这样就“漏馅”了。不光是网易 ,许多的门户站都是这样,具体我就不去举例了,可见关于 Background-color 设定的重要性。所以,不论你的网站是什么样的背景色,请一点记住把它设定好,哪怕它是白色!
January 17th, 2010 on 8:34
@ezsky: 这个问题遇到过很多次,最常见的是用户系统设置了淡绿色的背景保护色。但用户自定义的配置优先权大于页面配置,得尊重。
March 8th, 2010 on 15:09
关于字体的reset,我在实际做的过程中发现了很多问题。
body,button, input, select, textarea { /* for ie */
/*font: 12px/1 Tahoma, Helvetica, Arial, “宋体”, sans-serif;*/
font: 12px/1 Tahoma, Helvetica, Arial, “\5b8b\4f53″, sans-serif; /* 用 ascii 字符表示,使得在任何编码下都无问题 */}
这条CSS在IE7下,某些情况下,会造成兼容bug,也可能造成块挤压等bug
比如一种最常见的情况,文字前加上icon,就会造成一定icon下垂
leave a reply