当前位置: 首页 > Web前端 > CSS

重获css(5)——浏览器默认样式

时间:2023-03-30 14:13:23 CSS

上一节介绍了五种样式的来源,我们通过一张图来回顾一下。上面的三层我们应该都不陌生了。在下面的两层中,自定义样式一般是指改变字体大小和字体样式,这个不太好说。而最受关注的就是浏览器的默认样式。不同浏览器的默认样式有些不同,尤其是老版本的浏览器。现在高级的浏览器都在向统一标准靠拢,这对前端程序员来说是件好事。虽然有一些差异,但大部分还是一样的。我先贴代码,具体解读慢慢说吧(只说重点,比较简单或者不常用的就不说了)。html,地址,blockquote,body,dd,div,dl,dt,fieldset,form,frame,frameset,h1,h2,h3,h4,h5,h6,noframes,ol,p,ul,center,dir,hr,menu,pre{display:block}/*以上都是按照block显示,如果没有规定,则按照默认inline显示*/li{display:list-item}/*显示值程序员常用的是:inline/block/inline-block,很少用到list-itemlist-item的显示效果,可以通过例子来验证。...首先,可以使用其他标签来实现list-item的效果,而不是ul-li。其次,您必须意识到浏览器将HTML视为一棵dom树。至于显示的效果,是通过浏览器默认的css实现的,即样式都是通过css设计的,与html无关*/head{display:none}table{display:table}/*display:table和block最大的区别是:wrapping。说到换行,就不得不提到float和absolute*/tr{display:table-row}thead{display:table-header-group}tbody{display:table-row-group}tfoot{display:table-footer-group}col{display:table-column}colgroup{display:table-column-group}td,th{display:table-cell;}/*其他与table相关的显示值,研究意义不大,table-cell值得一提。table-cell是最新的多列布局解决方案,比使用float更有效(不兼容IE6、7)。其实table-cell依赖于其他表格相关的显示,但是浏览器会帮我们完成这些工作,所以我们不用手动填写*/caption{display:table-caption}th{font-重量:更大胆;text-align:center}/*标题设置为粗体,文字默认居中*/caption{text-align:center}body{margin:8px;line-height:1.12}/*不同的浏览器边距不一样,所以需要设置【*{margin:0}】line-height:1.12英文没问题,中文就显得别扭了。另外,1.12是一个Relative值(即1.12em),文字相关距离设置最好使用relative值*/h1{font-size:2em;边距:.67em0}h2{字体大小:1.5em;边距:.75em0}h3{字体大小:1.17em;margin:.83em0}h4,p,blockquote,ul,fieldset,form,ol,dl,dir,menu{margin:1.12em0}/*em是一个相对单位,1em是一个单位,浏览器默认的一个单位为16px,可以通过body{font-size:20px}修改一个单位的值,p的字号为1em,h1为2em,h2为1.5em等。另外,与文字最好用相关距离值的相对单位,例如行高:1.4;margin:.5em等这样做的好处是当自定义1em的绝对px时,line-height也会改变*//*注意如果我们自己写css【*{margin:0}】,我们可以覆盖p、h1、h2和其他标签的边距。我们都知道*选择器的权重最低,但是它可以覆盖标签。Selector,表示浏览器已经在这里做了一些事情。浏览器不允许默认样式和用户自定义样式“公平竞争”,而是优先考虑用户自定义样式*/h5{font-size:.83em;边距:1.5em0}h6{font尺寸:.75em;margin:1.67em0}h1,h2,h3,h4,h5,h6,b,strong{font-weight:bolder}/*在这里你可以看到哪个标签文本是粗体*/blockquote{margin-left:40px;margin-right:40px}i,cite,em,var,address{font-style:italic}/*这里可以看到哪些标签是斜体*/pre,tt,code,kbd,samp{font-family:monospace}pre{white-space:pre}button,textarea,input,object,select{display:inline-block;}/*不知道内联块长什么样?或者不知道inline-block有什么特点?在这里可以看到哪些标签是inline-block,就知道inline-block的用途了。inline-block的具体使用,后面会详细介绍,这里只指出*/big{font-size:1.17em}small,sub,sup{font-size:.83em}sub{vertical-align:sub}sup{vertical-align:super}table{border-spacing:2px;}thead,tbody,tfoot{vertical-align:middle}td,th{vertical-align:inherit}s,strike,del{text-decoration:line-through}hr{border:1pxinset}/*为什么


默认情况下如此丑陋,尤其是在IE下,这是罪魁祸首*/ol,ul,dir,menu,dd{margin-left:40px}ol{list-style-type:decimal}/*ul和ol将有默认左边距,在这里你可以看到为什么会有差距,以及间距的具体大小是多少*/olul,ulol,ulul,olol{margin-top:0;margin-bottom:0}u,ins{text-decoration:underline}br:before{content:“A”}/*?????????????*/:before,:after{white-space:pre-line}/*
为什么可以实现换行?浏览器在获取到html的br标签时,只会解析成一个dom节点,而“换行”的功能是通过这个实现的吗?????*/center{text-align:center}abbr,acronym{font-variant:small-caps;letter-spacing:0.1em}:link,:visited{text-decoration:underline}:focus{outline:thindottedinvert}/*开始双向设置(不要改变)*/BDO[DIR="ltr"]{direction:ltr;unicode-bidi:bidi-override}BDO[DIR="rtl"]{方向:rtl;override}*[DIR="ltr"]{方向:ltr;unicode-bidi:embed}*[DIR="rtl"]{方向:rtl;unicode-bidi:embed}/*这些标签或属性都不常用*/@mediaprint{h1{page-break-before:always}h1,h2,h3,h4,h5,h6{page-break-after:avoid}ul,ol,dl{page-break-before:avoid}/*对于打印分页时的设置,不常用*//*以下都是基于标签选择器,标签选择器有比class和id选择器的权重低。因此,用户自定义样式,无论是使用标签、类还是id,都可以覆盖默认的标签选择器*/Browserdefaultstyle先说说样式最大的体验,这个很重要。需要从概念上重新认识html和css。以前总以为浏览器本身就知道各种html标签,会根据规则设置标签的外观。比如p是分块显示,ul有margin-left,h1加粗显示……我以前一直以为这些标签都是默认显示的方法,跟css没有关系。它是由浏览器本身完成的。css设置网页样式,加载后渲染。现在我知道这个想法是错误的。其实浏览器加载完html后,只是为了一件事生成一个dom树。浏览器将html变成dom树结构,完成html的结构化。至于view的后续渲染,p是一个block,br是一个换行符,这是融合了css之后的。而浏览器集成css是另一条路线,它与解析html是分开的。这里的“css”包含了浏览器的默认样式。可以结合下图来理解:一句话,浏览器把加载的html变成了dom树,但是此时没有显示样式。所以显示的样式都是css定义的,浏览器只会通过css渲染视图样式。2、为什么块元素p、h1、ul、div默认都是分块显示的,这里有定义。所以,不要说div天生就是块——这句话应该换成:浏览器的默认样式自然规定div是块——这就是为什么div是块!它是由默认样式指定的,而不是由浏览器的内核指定的。默认情况下,没有块的元素显示为内联。3.display:list-item我们在使用display的时候,常用的取值有:inline/block/inline-block,list-item是不用的。那么这里list-item的作用是什么呢?我们不妨自己尝试一下:看看你看到没有,ul-li中的效果出现了,如果加上margin-left,会不会和ul-li一样?那么,为什么ul-li默认会这样显示呢?——list-item是“罪魁祸首”。4.display:table首先给出一个快速的问题:和
在容器大小上最大的区别是什么(仅容器大小,不考虑内容差异)?请在两秒内说出答案。答案是——div的宽度与父容器的宽度相同,表格的宽度取决于内容——也就是表格被“包裹”了。例如:上图中,第一个div默认是一个block,它的宽度占满了整个页面。第二个div设置了display:table,宽度根据内容而定。这就是“包裹”。说到“环绕”,就不得不想到float和absolute。这里不能细说,我会在后面的文章中详细讲到。有兴趣的可以先去看看。大家想一想,在你们做的项目中,哪里需要这种“包裹”,而不是写死宽度或者用js计算宽度?如果你想不出来,我会截图提醒你。如下图所示:5.display:table-cell在上面的截图中,我们可以看到很多眼花缭乱的显示,而且都是和表格相关的。从字面意思可以看出,这就是浏览器为了渲染出一个完整的表格所需要的很多显示方式(PS:貌似一个简单的表格就有那么多的渲染规则,让我们想到了思维的严密性关于问题和逻辑)。这里的大部分东西都是我们永远不会用到的东西,了解不需要的就可以了,没必要深究。但是我们可以使用这个table-cell,并用它来做一件很重要的事情——多列布局。多列布局在CSS中的重要性不用我多说。传统模式下,大家都用float来解决这个问题,但是float写的代码复杂,宽度调整不灵活,浏览器兼容性也有问题。这就是为什么有一个新的解决方案——table-cell,注意,IE6和7是不行的!举个简单的例子:记得刚学html的时候,不知道怎么用div+css进行多栏布局,所以就用table来进行多栏布局。现在,你可以使用table-cell做一个像表格一样的多列布局,效果和表格完全一样。6.bodystylebody{margin:8px;line-height:1.12}在body中定义了两种样式,如上图所示。首先,默认情况下,页面上的文字不会直接触及浏览器的边框,这是因为默认样式设置了正文的边距。这里有一个问题需要注意。不同的浏览器可能会为body设置不同的margin值,所以大家都知道CSS中使用*{margin:0}来解决这个兼容性问题。如前所述,选择器比body标签选择器处于较低级别,因此当两者来自同一来源时(例如,都来自内部样式),它不会起作用,即使它是“后加载”。{margin:0}仍然有效的原因是浏览器默认样式的优先级低于外部和内部样式。例如:其次,浏览器的默认样式也为body设置了line-height。line-height的取值为1.12,对英文比较友好,中文就显得有点拥挤。line-height是继承的,如果在body中设置,body下面的所有文字都会继承生效。另外注意这里的line-height:1.12是一个相对值,是文字高度的1.12倍。看到这里,我们在写line-height的时候,也要注意使用相对值,而不是绝对值。如下:上图是三种写行高的形式,你觉得哪种形式最好?有什么不同?Case1:始终按1.4倍文字计算,不考虑文字高度,适应任意变化;情况2:一直按照1.4em计算,随着em值的变化,与文字高度无关(此时文字高度可能已经通过绝对px值改变了大小,不随em而变化);情况3:它是25px,绝对。相信大家会发现,通过一个line-height来窥探的方法有很多种。如果理解了这三种情况,从软件设计和系统扩展的角度,我们当然会选择第一种。7.em和px大家都在设置文字的高度或者与文字相关的距离,比如p的margin和line-height(刚刚说完上面的,就不细说了),你会用吗em还是px?——反正我不熟悉css的时候,用的是px。因为px是固定大小,一目了然。——当然也不利于扩展。因此,我们建议您使用em。而浏览器的默认样式也建议我们这样写:如上图,它设置h1的字号为2em,垂直边距为0.67em,h2的字号为1.5em,垂直尺寸为0.75em...p的垂直边距是1.12em,字体大小1em(上图没有,但是整个文件都有)em是多少?——em是浏览器认可的长度单位,但不是绝对的,也不是固定的,而是相对的。相对计算一定要有参照物,所以这里的相对指的是相对于父元素的font-size,因此,使用em作为长度单位是实现弹性设计的关键。大家都知道px是绝对长度单位制,永远不会变。默认情况下,浏览器命令1em===16px。现在你知道为什么p默认是16px了吧。而且你还知道h1是p的2倍高,h2是p的1.5倍...(你知道的越来越多了。..)当然我们可以通过css修改1em的值。由于font-size和margin都是由em定义的,所以修改em时,只要修改了fontsize,margin值也会随之修改。这就是em好用的地方,也是弹性设计的体现!从现在开始,所有与字体大小相关的css都将使用em!8.粗体和斜体上图中标出了整个html中哪些元素设置为粗体/斜体。重点还是思维转换的问题:h1不是天生粗体,只是设置了font-weight:bolderstyle...这里需要提个题外话:有什么区别?有什么区别?是W3C默认的粗体风格。如果你不想写font-weight:bold;要达到简单的粗体效果,使用是一个不错的选择,但如果要强调语义,更合适。建议使用语义标签。9、inline-block相信刚开始学习使用inline-block的朋友都有一个困惑:什么是inline-block?这时候,如果你很勤奋好学,可以上网查资料,然后做各种实验。——精神可嘉,行为不可取。学习还是有捷径的。看看浏览器默认样式告诉你的快捷键:button和input都是inline-block!这样一来,点播一下子就明白了,至少能给你一个很好的形象概念。看一下button和input的表现,就知道inline-block长啥样了:可以在父容器中居中,可以设置高宽边距,不会像table或者div那样占一整行...——这是内联块——记住这是浏览器默认样式告诉你的。原文地址:http://www.cnblogs.com/wangfu...