《深入解析CSS》笔记

如果我大一大二的时候接触这本书,我想,我现在应该就能养成一个良好的编码习惯了吧,我是说在css页面布局这块,还好,不算太迟。下面我将把我读的这本书的知识点写出。但我还是建议诸位去读下原著,微信读书能搜到,免费的。

1.关于单位的使用

1)如果属性值根据元素的 font-size 获得,则使用 em,如padding\margin\line-height\width\height 等值(使字体大小变化时元素周围的间距会等比例缩放)
2)其他一切单位使用 rem

2.要使HTML页面随缩放而整体缩放,您可以使用以下两种方法:

1)使用响应式设计

响应式设计是一种使网站能够适应不同设备和屏幕大小的方法。通过使用响应式设计,您可以使用CSS和HTML等技术来确保页面元素在不同屏幕上都保持良好的布局。
要使用响应式设计,您可以使用以下技术:

1))使用媒体查询(Media Queries):媒体查询是一种CSS技术,它可以让您根据设备的屏幕大小来更改样式。您可以使用媒体查询来设置不同的样式规则,以适应不同的屏幕大小。

2))使用百分比宽度:使用百分比宽度可以让元素相对于其父元素进行缩放,因此当页面缩放时,元素将相应地缩放。

3)))使用弹性布局(Flexbox):Flexbox是一种CSS布局技术,它可以让您轻松地在不同屏幕大小和设备上排列元素。使用Flexbox,您可以轻松地实现响应式设计。
2)使用视口单位(Viewport Units)


视口单位是一种相对单位,它相对于视口的尺寸。使用视口单位,您可以使页面元素相对于视口进行缩放。
要使用视口单位,请在HTML页面的视口元素中设置以下属性:
php复制<meta name="viewport" content="width=device-width, initial-scale=1.0">

这将使页面宽度等于设备宽度,并将初始缩放级别设置为1.0。然后,您可以使用CSS的视口单位(vw、vh、vmin和vmax)来设置元素的大小,这些单位将相对于视口的大小进行缩放。
例如,以下代码将一个元素设置为视口宽度的50%,并随着视口的缩放而缩放:
css复制div {
  width: 50vw;
}


3.px,em,rem的用法
用em设置padding,margin,border
rem设置font-size
一般会用rem设置字号,用px设置边框,用em设置其他大部分属性,尤其是内边距、外边距和圆角(不过我有时用百分比设置容器宽度)。
拿不准的时候,用rem设置字号,用px设置边框,用em设置其他大部分属性
通过给页面根元素设置不同字号,我们响应式地重新定义了整个网页的em和rem

4.层叠

1)层叠是决定如何解决样式声明冲突的规则,是CSS语言的基础

2)当声明冲突时,层叠会依据三种条件解决冲突。(1) 样式表的来源:样式是从哪里来的,包括你的样式和浏览器默认样式等。(2) 选择器优先级:哪些选择器比另一些选择器更重要。(3) 源码顺序:样式在样式表里的声明顺序。

3)总体的优先级按照由高到低排列如下所示:(1) 作者的!important(2) 作者(你自己)(3) 用户代理(浏览器默认)

4)浏览器将优先级分为两部分:HTML的行内样式(<a   style="这就是HTML的行内样式">)和选择器的样式。   行内样式的优先级是大于选择器样式的

 5)同等数量下:id选择器   >class选择器  >  标签选择器  ,但是一个id大于n个class的优先级

另外:伪类选择器(如:hover)和属性选择器(如[type="input"])与一个类选择器的优先级相同。通用选择器(*)和组合器(>、+、~)对优先级没有影响。

6)有一个好方法来统计和表示优先级

另外需要注意的一点:id只会生效一次,就是说id是唯一的,浏览器只会将样式和方法给第一个,后面的获取不到 ,所以在写代码时,尽量用class,少用id,优先级考虑上也是用class好,这样方便你后期再添加id覆盖样式

7)源码顺序也会影响层叠,顺序的记忆口诀是“LoVe/HAte”(“爱/恨”),即link(链接)、visited(访问)、hover(悬停)、active(激活)。注意,如果将一个选择器的优先级改得跟其他的选择器不一样,这个规则就会遭到破坏,可能会带来意想不到的结果。

8)浏览器遵循三个步骤,即来源、优先级、源码顺序,来解析网页上每个元素的每个属性。如果一个声明在层叠中“胜出”,它就被称作一个层叠值(层叠值——作为层叠结果,应用到一个元素上的特定属性的值)。

5.继承

1)如果一个元素的某个属性没有层叠值,则可能会继承某个祖先元素的值。

2) 不是所有的属性都能被继承。默认情况下,只有特定的一些属性能被继承,通常是我们希望被继承的那些。它们主要是跟文本相关的属性:color、font、font-family、font-size、font-weight、font-variant、font-style、line-height、letter-spacing、text-align、text-indent、text-transform、white-space以及word-spacing。还有一些其他的属性也可以被继承,比如列表属性:list-style、list-style-type、list-style-position以及list-style-image。表格的边框属性border-collapse和border-spacing也能被继承。注意,这些属性控制的是表格的边框行为,而不是常用于指定非表格元素边框的属性。

6.margin,padding1的顺序:上,右,下,左

属性值还可以缩写。如果声明结束时四个属性值还剩一个没指定,没有指定的一边会取其对边的值。指定三个值时,左边和右边都会使用第二个值。指定两个值时,上边和下边会使用第一个值。如果只指定一个值,那么四个方向都会使用这个值。

7.特殊值控制层叠
有两个特殊值可以赋给任意属性,用于控制层叠:inherit和initial。

有时,我们想用继承代替一个层叠值。这时候可以用inherit关键字。可以用它来覆盖另一个值,这样该元素就会继承其父元素的值。还可以使用inherit关键字强制继承一个通常不会被继承的属性,比如边框和内边距。通常在实践中很少这么做

需要撤销作用于某个元素的样式。这可以用initial关键字来实现。

声明display: initial等价于display:inline。不管应用于哪种类型的元素,它都不会等于display: block。这是因为initial重置为属性的初始值,而不是元素的初始值。inline才是display属性的初始值。

8.当设置padding、height、width、border-radius等属性时,使用em会很方便。这是因为当元素继承了不同的字号,或者用户改变了字体设置时,这些属性会跟着元素均匀地缩放。

在定义这些盒子的样式时,可以用em指定内边距和圆角。给每个元素设置1em的内边距和圆角,再分别指定不同的字号,那么这些属性会随着字体一起缩放。

9.如果知道字号的像素值,但是想用em声明,可以用一个简单的公式换算:用想要的像素大小除以父级(继承)的像素字号。比如,想要一个10px的字体,元素继承的字体是12px,则计算结果是10/12 = 0.8333em。如果想要一个16px的字体,父级字号为12px,则计算结果是16/12 = 1.3333em。在本章我们还会进行几次这样的计算。

10.em的复杂之处在于同时用它指定一个元素的字号和其他属性。这时,浏览器必须先计算字号,然后使用这个计算值去算出其余的属性值。这两类属性可以拥有一样的声明值,但是计算值不一样。

11.em用在内边距、外边距以及元素大小上很好,但是用在字号上就会很复杂。值得庆幸的是,我们有更好的选择:rem(因为文字会逐级减小,如果都是0.9em的话)

 

12.rem不是相对于当前元素,而是相对于根元素的单位。不管在文档的什么位置使用rem,1.2rem都会有相同的计算值:1.2乘以根元素的字号

13.媒体查询,即@media规则,可以指定某种屏幕尺寸或者媒体类型(比如,打印机或者屏幕)下的样式。这是响应式设计的关键部分

 

14.使用calc()定义字号calc()函数内可以对两个及其以上的值进行基本运算。当要结合不同单位的值时,calc()特别实用。它支持的运算包括:加(+)、减(−)、乘(×)、除(÷)。加号和减号两边必须有空白,因此我建议大家养成在每个操作符前后都加上一个空格的习惯,比如calc(1em + 10px)。(clac()的用处不止于定义字号,在页面的宽度设计时,配合百分比,也能达到响应式的结果)

15.有些属性允许无单位的值(即一个不指定单位的数)。支持这种值的属性包括line-height、z-index、font-weight(700等于bold,400等于normal,等等)。任何长度单位(如px、em、rem)都可以用无单位的值0,因为这些情况下单位不影响计算值,即0px、0%、0em均相等。警告一个无单位的0只能用于长度值和百分比,比如内边距、边框和宽度等,而不能用于角度值,比如度,或者时间相关的值,比如秒。

使用无单位的数值时,继承的是声明值,即在每个继承子元素上会重新算它的计算值。这样得到的结果几乎总是我们想要的。我们可以用一个无单位的数值给body设置行高,之后就不用修改了,除非有些地方想要不一样的行高

16.自定义属性

 使用JavaScript设置一个自定义属性

 

 如果运行以上脚本,所有继承了--main-bg属性的元素都会更新,使用新的值。在网页中,第一个面板的背景色会改为浅蓝色。第二个面板保持不变,因为它依然继承了深色容器里的属性。利用这种技术,就可以用JavaScript实时切换网站主题,或者在网页中突出显示某些元素,或者实时改变任意多个元素。只需要几行JavaScript代码,就可以进行更改,从而影响网页上的大量元素

17.盒模型的默认行为(如图3-4所示)。当给一个元素设置宽或高的时候,指定的是内容的宽或高,所有内边距、边框、外边距都是追加到该宽度上的。

 这种行为会让一个宽300px、内边距10px、边框1px的元素渲染出来宽322px(宽度加左右内边距再加左右边框)。如果这些值使用不同的单位,情况就会更复杂。

18.调整盒模型

box-sizing的默认值为content-box,这意味任何指定的宽或高都只会设置内容盒子的大小。将box-sizing设置为border-box后,height和width属性会设置内容、内边距以及边框的大小总和,这刚好符合示例的要求。

盒模型的box-sizing为border-box。在这个模型中,内边距不会让一个元素更宽,而是让内部的内容更窄。

19.全局修改盒模型为border-box

 20.盒模型通常不会被继承,但是使用inherit关键字可以强制继承。如下述代码所示,可以在必要时选中第三方组件的顶级容器,将其恢复为content-box。这样组件的内部元素会继承该盒模型。

.third-party-component { box-sizing: content-box; }

21. 正的外边距会将容器的边缘往里推,而负的外边距则会将边缘往外拉

22.除非别无选择,否则不要明确设置元素的高度。先寻找一个替代方案。设置高度一定会导致更复杂的情况。

23.接下来介绍的两个是很有用的属性:min-height和max-height。你可以用这两个属性指定最小或最大值,而不是明确定义高度,这样元素就可以在这些界限内自动决定高度。

 24. 使用内边距让内容垂直居中

 

不管容器里的内容显示为行内、块级或者其他形式,这种方法都有效,但有时我们想给容器设置固定高度,或者无法使用内边距,因为想让容器内另一个子元素靠近容器的顶部或者底部。

25. 可以用一个自然高度的容器吗?给容器加上相等的上下内边距让内容居中。

❑ 容器需要指定高度或者避免使用内边距吗?对容器使用display: table-cell和vertical-align:middle。

❑ 可以用Flexbox吗? 如果不需要支持IE9,可以用Flexbox居中内容。

❑ 容器里面的内容只有一行文字吗?设置一个大的行高,让它等于理想的容器高度。这样会让容器高度扩展到能够容纳行高。如果内容不是行内元素,可以设置为inline-block。

❑ 容器和内容的高度都知道吗?将内容绝对定位。参见第7章。(只有当前面提到的方法都无效时才推荐这种方式。)

❑ 不知道内部元素的高度?用绝对定位结合变形(transform)。参见第15章的例子。(还是只有当前面提到的方法都无效时才推荐该方法。)

26.不同于内边距和边框宽度,外边距可以设置为负值。负外边距有一些特殊用途,比如让元素重叠或者拉伸到比容器还宽。

如果设置左边或顶部的负外边距,元素就会相应地向左或向上移动,导致元素与它前面的元素重叠,如果设置右边或者底部的负外边距,并不会移动元素,而是将它后面的元素拉过来。给元素底部加上负外边距并不等同于给它下面的元素顶部加上负外边距。

27. 如果不给一个块级元素指定宽度,它会自然地填充容器的宽度。但如果在右边加上负外边距,则会把它拉出容器。如果在左边再加上相等的负外边距,元素的两边都会扩展到容器外面。

警告如果元素被别的元素遮挡,利用负外边距让元素重叠的做法可能导致元素不可点击

28.弹性子元素的外边距不会折叠,而这一块刚好用了Flexbox布局。内边距也能解决这个问题。给头部添加上下内边距,外边距就不会在容器外部折叠。

如下方法可以防止外边距折叠。

❑ 对容器使用overflow: auto(或者非visible的值),防止内部元素的外边距跟容器外部的外边距折叠。这种方式副作用最小。

❑ 在两个外边距之间加上边框或者内边距,防止它们折叠。

❑ 如果容器为浮动元素、内联块、绝对定位或固定定位时,外边距不会在它外面折叠。

❑ 当使用Flexbox布局时,弹性布局内的元素之间不会发生外边距折叠。网格布局(参见第6章)同理。

❑ 当元素显示为table-cell时不具备外边距属性,因此它们不会折叠。此外还有table-row和大部分其他表格显示类型,但不包括table、table-inline、table-caption。

29.猫头鹰选择器:通用的方式,不管网页结构如何变化都能够生效。这就是Heydon Pickering所说的迟钝的猫头鹰选择器(lobotomized owl selector)(以下简称猫头鹰选择器),因为它长这样:* +*。

猫头鹰选择器的顶部外边距对侧边栏有个副作用。因为侧边栏是主列的相邻兄弟元素,所以它也会有顶部外边距。因此要将其恢复为0,还需要给主列补上内边距。

30.Flexbox正在迅速取代浮动在页面布局中的地位。对新手开发人员而言,Flexbox的行为很直观,可预测性更好。你可能会问是否还有必要学习浮动,CSS浮动的时代是不是结束了?在现代浏览器中,不用浮动也能比过去更好地实现布局,甚至可以完全弃用浮动。但是如果要支持IE浏览器,现在放弃浮动还为时过早。只有IE10和IE11支持Flexbox,而且还有一些bug。如果不想碰到bug,或者需要支持旧版浏览器,浮动也许是更好的选择。另外,如果你在支持旧代码库,它很可能用到了浮动布局。为了维护旧代码,也需要了解浮动的工作原理。还有一点,浮动布局通常不需要那么多的标记,新的布局方法则需要添加额外的容器元素。如果你写样式时不允许修改标记,浮动更能满足你的需求。此外,要实现将图片移动到网页一侧,并且让文字围绕图片的效果,浮动仍然是唯一的方法。

31.通过将内容放置到两个嵌套的容器中,然后给内层的容器设置外边距,让它在外层容器中居中(如图4-5所示)。Web开发人员Brad Westfall把这种布局方式叫作双容器模式(double container pattern)。

32.请注意,要给包含浮动的元素清除浮动,而不是给别的元素,比如浮动元素本身,或包含浮动的元素后面的兄弟元素。

 33.清除浮动和display: table在清除浮动时使用display: table能够包含外边距,是因为利用了CSS的一些特性。创建一个display: table元素(或者是本例的伪元素),也就在元素内隐式创建了一个表格行和一个单元格。因为外边距无法通过单元格元素折叠(参见第3章),所以也无法通过设置了display: table的伪元素折叠。看起来似乎使用display: table-cell也能达到相同的效果,但是clear属性只能对块级元素生效。表格是块级元素,但是单元格并不是。因此,clear属性无法跟display:table-cell一起使用。所以要用display: table来清除浮动,同时利用隐式创建单元格来包含外边距。

34.修改清除浮动的代码,让其包含所有的外边距

 这个版本使用display: table而不是display:block。给::before和::after伪元素都加上这一属性,所有子元素的外边距都会包含在容器的顶部和底部之间。