开本系列,谈谈一些有趣的 CSS
题目,题目类型天马行空,想到什么说什么,不只为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节。css
解题不考虑兼容性,题目天马行空,想到什么说什么,若是解题中有你感受到生僻的 CSS 属性,赶忙去补习一下吧。html
不断更新,不断更新,不断更新,重要的事情说三遍。前端
谈谈一些有趣的CSS题目(一)-- 左边竖条的实现方法git
谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型github
谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少浏览器
谈谈一些有趣的CSS题目(四)-- 从倒影提及,谈谈 CSS 继承 inheritide
谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略布局
谈谈一些有趣的CSS题目(六)-- 全兼容的多列均匀布局问题post
谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案
谈谈一些有趣的CSS题目(九)-- 巧妙的实现 CSS 斜线
全部题目汇总在个人 Github 。
正文从这里开始。 大部分的时候,做为前端,咱们在写 CSS 样式以前,都知道须要添加一份 reset.css
,可是有深究过reset.css
每一句的人恐怕很少,其实其中也是有不少学问的,知己知彼,真正厘清它,对提升 CSS 大有裨益。
先来看看早先 YUI 的一个版本的 reset.css
,这是一份历史比较悠久的 RESET 方案:
body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, textarea, p, blockquote, th, td { margin: 0; padding: 0; } table { border-collapse: collapse; border-spacing: 0; } fieldset, img { border: 0; } address, caption, cite, code, dfn, em, strong, th, var { font-style: normal; font-weight: normal; } ol, ul { list-style: none; } caption, th { text-align: left; } h1, h2, h3, h4, h5, h6 { font-size: 100%; font-weight: normal; } q:before, q:after { content: ''; } abbr, acronym { border: 0; }
首先,咱们要知道 CSS RESET 的目的是什么?是为了消除不一样的浏览器在默认样式上不一样表现,可是到今天,现代浏览器在这方面的差别已经小了不少。
看看第一段:
body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, textarea, p, blockquote, th, td { margin: 0; padding: 0; }
这一条样式的目的是在于,清除元素的默认 margin
和 padding
。
可是这一段代码是充满问题的。
padding
和 margin
的;上面的意思是,这一段代码其实作了不少无用功!
要知道,CSS RESET 的做用域是全局的。咱们都知道在脚本代码中应该尽可能避免滥用全局变量,可是在 CSS 上却老是会忘记这一点,大量的全局变量会致使项目大了以后维护起来很是的棘手。
再看看这一段:
h1, h2, h3, h4, h5, h6 { font-size: 100%; font-weight: normal; } ol, ul { list-style: none; }
这一段代码,目的是统一了 h1~h6 的表现,取消了标题的粗体展现,取消了列表元素的项目点。
好像没什么问题,可是诸如 h1~h六、ol、ul 这些拥有具体语义化的元素,一旦去掉了它们自己的特性,而又没有赋予它们自己语义化该有的样式(常常没有),致使愈来愈多人弄不清它们的语义,侧面来讲,这也是如今愈来愈多的页面上 div 满天飞,缺少语义化标签的一个重要缘由。
YUI 版本的 reset 无论高矮胖瘦,一刀切的方式,看似将全部元素统一在同一块儿跑线上,实则是多了不少冗余代码,得不偿失。
因此,YUI 的 reset.css 的诸多问题,催生出了另外一个版本的 reset.css ,名为 Normalize.css。
Normalize.css 有着详尽的注释,因为篇幅太长,能够点开网址看看,本文不贴出所有代码。
Normalize.css 与 reset.css 的风格刚好相反,没有无论三七二一的一刀切,而是注重通用的方案,重置掉该重置的样式(例如body的默认margin),保留该保留的 user agent 样式,同时进行一些 bug 的修复,这点是 reset 所缺少的。
Normalize.css 注释完整,每一段代码都说明了做用,总结来讲,它作了如下几个工做(摘自官网):
简单翻译一下,大概是:
真心建议各位抽时间读一读 Normalize.css 的源码,加上注释一共就 460 行,多了解了解各个浏览器历史遗留的一些坑。
那么,最后再讨论下取舍问题。是否 Normalize.css 就真的比 reset.css 好呢?
也不见得,Normalize.css 中重置修复的不少 bug ,其实在咱们的项目中十个项目不见得有一个会用得上,那么这些重置或者修复,某种意义上而言也是所谓的冗余代码。
我以为最重要的是,拒绝拿来主义,不要人云亦云,看见别人说这个 reset.css 好用,也不了解一下,拿来就上到项目中。又或者说写代码几年了,知道每次都引用一个 reset ,却从没有去细致了解其中每一句的含义。
当团队根据项目须要(可能混合部分了 reset 或者 normalize )编写了一份适合团队项目的 reset 以后,随着不断的迭代或者说是复用,颇有可能这个版本的 reset.css 会逐渐添加许多其余的全局性的样式,从而又从新陷入上面说的那些问题。
因此我以为,reset.css 也是须要维护的,关于最佳的 reset.css ,没有一劳永逸的方案,根据项目灵活配置,作出取舍微调,适量裁剪和修改后再使用。
最后,搞技术的同窗仍是应该要有所追求,不要知足于消费别人的总结,必定要去源头看看。
到此本文结束,若是还有什么疑问或者建议,能够多多交流,原创文章,文笔有限,才疏学浅,文中如有不正之处,万望告知。