css之解读浏览器默认样式
Created at 2016-08-20 Updated at 2017-01-06 Category Front-End
理念上的转变
浏览器加载了html之后只为一件东西——dom
树,浏览器把html
变为dom
树结构,就完成了对html
的结构化。至于后来对视图的渲染,p是block
、br
换行,那是整合了css
之后的事情。而浏览器整合css
又是另一个路线,和解析html
是分开的。这里的“css”
就包含了浏览器默认样式。
一句话,浏览器将载入的html
变为dom
树,但是此时没有任何显示样式。所以显示的样式,都是css定义的,浏览器只会通过css来渲染视图样式
block元素
为何默认情况下p
、h1
、ul
、div
都是block
显示,就是这里定义的。所以,不要再说div
天生就是block
——这句话应该换成:浏览器默认样式天生规定了div是block——所以才导致了div是block!是默认样式规定的,不是浏览器的内核规定的。
没有设置block
的元素,默认为inline
显示
display: list-item
我们在使用display
,常用的值一般是:inline/block/inline-block
,用不到list-item
。那这里的list-item
到底有什么作用?
出现了ul-li
中的效果了吧,如果再加一个margin-left
是不是就跟ul-li
一样了?所以,ul-li
为什么会默认显示成那种样子?——list-item
才是“罪魁祸首”
diplay:table
先给出一个快速思考题:<table>
和<div>
在容器尺寸上最大区别是什么(只是容器尺寸,不考虑内容区别)?请在两秒钟内说出答案。
答案是——div
宽度和父容器相同,table
宽度根据内容而定——即table
具有“包裹性”
第一个div
默认是block
,宽度撑满整个页面。第二div
设置了display:table
,宽度根据内容而定。这就是“包裹性”
display: table-cell
这里的大部分都是我们一直都不会用到的,用不到的了解即可,没必要深究。但是这个table-cel
我们却能用得到,而且是用它来干一件很重要的事情——多列布局
传统模式下大家都使用float
来解决这一问题,但是float
写出来的东西代码复杂,宽度调整不灵活,浏览器兼容性有问题。所以才有了新方案——table-cell
,注意,IE6、7
不行
你可以用table-cell
,像用table
一样做多列布局,做出来的效果和table
做出来的效果是一模一样的
body样式
在body
中,定义了两个样式
不同浏览器为body设置的margin值可能不一样,因此大家都知道在
css
中用*{margin:0}
来解决这一兼容性问题浏览器默认样式还为
body
设置了line-height
,line-height
这个值1.12是对英文比较友好,中文状态下就显得有点拥挤。Line-height
是具有继承性的,在body
中设置了,body
下面所有的文字都会继承生效
这里的line-height: 1.12
是一个相对值,即是文字高度的1.12
倍。看到这里,我们在写line-height
的时候,也一定要注意使用相对值,不要使用绝对值。如下:
上图是编写line-height
的三种形式,大家觉得哪种形式最好?区别是什么?
- 情况1:永远按照文字的
1.4
倍计算,不管文字的高度如何,可适应任何变化; - 情况2:永远按照
1.4em
计算,随着em
的值改变,不管文字高度如何(此时文字高度可能已经通过绝对的px
值该表了大小,而不是随em改变的); - 情况3:就是
25px
,绝对的。
相信看到这里大家会发现,通过一个line-height
我能能窥探到的道道有很多。如果大家看懂了这三种情况,从软件设计和系统扩展的角度说,当然我们都会选择第一种
。
em和px
因为px
是固定大小,一目了然。——当然,它也不利于扩展
因此,我们推荐大家用em
。而且浏览器的默认样式也建议我们这样书写:
em
是什么?——em
是一个浏览器识别的长度单位,但是它不是绝对的、固定的,而是相对的。大家都知道px
是一个绝对的长度单位制,它永远不会改变。浏览器默认情况下令1em === 16px
。现在你知道为何p默认是16px
了吧。而且你还知道了h1
是p
高度的两倍,h2
是p高度的1.5
倍
粗体和斜体
上图中,标注了在整个html
中,哪些元素设置了粗体/斜体。重点还是一个思维转换的问题:h1
不是天生的粗体,而是设置了font-weight:bolder
的样式而已
inline-block
看看浏览器默认样式告诉你的捷径:button
、input
就是inline-block
!这样以点播你就会一下子明白,最起码能给你一个很好的形象的概念。看看button
和input
的表现,你就知道inline-block
是什么样子了