前端知识杂记——CSS

对前端开发知识的一些梳理,主要参考前端开发面试题及对它的补充,持续完善…

盒子模型

盒模型指定元素如何显示,页面上的每个元素都被看成一个矩形框,这个框由元素的内容、内边距、边框和外边距组成。

内边距出现在元素的周围,如果在元素上添加背景,那么背景就会被应用于内容和内边距组成区域。常常使用内边距在元素周围创建一个隔离带。外边距是透明的,一般使用它控制元素之间的间隔。

CSS3中新增了一种盒模型计算方式:box-sizing熟悉。盒模型默认的值是content-box, 新增的值是padding-box和border-box,几种盒模型计算元素宽高的区别如下:
box

box-sizing属性:控制元素的盒模型的解析模式

  1. content-box(默认)
    让元素维持W3C的标准盒模型。元素的宽度/高度由border + padding + content的宽度/高度决定,设置width/height属性指的是content部分的宽/高
  2. border-box
    让元素维持IE传统盒模型(IE6以下版本和IE6~7的怪异模式)。设置width/height属性指的是border + padding + content

属性继承:

  • 可继承的样式:font-size font-family color, text-indent;
  • 不可继承的样式:border padding margin width height;

containing block

BFC和haslayout

Windows上的IE使用布局概念来控制元素的尺寸和定位,“拥有布局”(has layout)的元素负责本身及其子元素的尺寸设置和定位,如果一个元素没有“拥有布局”,那么它的尺寸和位置由最近的拥有布局的祖先元素控制。more

Flexbox

display

常用的:

  1. none 关闭一个元素的显示(对布局没有影响);其所有后代元素都也被会被关闭显示。文档渲染时,该元素如同不存在。
  2. inline 元素宽度由内容决定,与其他元素并列在一行
  3. block 可以设置宽度,独占一行
  4. inline-block 宽度可以自行设置,类似block,但是与其他元素共占一行,类似inline。长用于设置垂直居中
  5. table-cell 标签元素以表格单元格的形式呈现
    更多

position

浮动

visibility

  1. visible:默认值。元素是可见的。
  2. hidden:元素是不可见的。会占据页面上的空间
  3. collapse:当在表格元素中使用时,此值可删除一行或一列,但是它不会影响表格的布局。被行或列占据的空间会留给其他内容使用。如果此值被用在其他的元素上,会呈现为 “hidden”。
  4. inherit: 规定应该从父元素继承 visibility 属性的值。
    任何的版本的 Internet Explorer (包括 IE8)都不支持 “inherit” 和 “collapse” 属性值。

position跟display、margin collapse、overflow、float这些特性相互叠加

margin和padding使用场景

  1. margin:
    需要在border外侧添加空白时
    空白处不需要背景(色)时
    上下相连的两个盒子之间的空白,需要相互抵消时。如15px + 20px的margin,将得到20px的空白
  2. padding
    需要在border内测添加空白时
    空白处需要背景(色)时。
    上下相连的两个盒子之间的空白,希望等于两者之和时。如15px + 20px的padding,将得到35px的空白
    margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。margin用于布局分开元素使元素与元素互不相干;padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段“呼吸距离”

外边距叠加

简单地说,就是两个或多个毗邻(父子元素或兄弟元素)的普通流中的块元素垂直方向上的 margin 会发生叠加。这种方式形成的外边距即可称为外边距叠加

毗邻是指没有被非空内容、padding、border 或 clear 分隔开

margin叠加会发生在2种关系下,一种是父子元素,一种是兄弟元素

  • 父子元素(分2种情况)之间发生margin叠加的条件

    1. 父元素和第一个子元素发生margin-top叠加
      • 父元素没有创建BFC
      • 父元素和第一个子元素之间没有非空内容
        • 父元素没有border-top
        • 父元素没有padding-top
    2. 父元素和最后一个子元素发生margin-bottom叠加
      • 父元素没有创建BFC
      • 父元素height为auto、min-height为0
      • 父元素和最后一个子元素之间没有非空内容
      • 父元素没有border-bottom
      • 父元素没有padding-bottom

    解决:为父元素创建BFC、为父元素设置相应的padding或者border

  • 兄弟元素之间发生外边距叠加的条件

    • 兄弟元素都不是float元素
    • 兄弟元素都不是absolute元素
    • 兄弟元素都不是inline-block元素

    那么避免:让兄弟元素float、让兄弟元素absolute、让兄弟元素inline-block more


CSS选择符

  1. id选择器( # myid)
  2. 类选择器(.myclassname)
  3. 标签选择器(div, h1, p)
  4. 相邻选择器(h1 + p)
  5. 子选择器(ul > li)
  6. 后代选择器(li a)
  7. 通配符选择器( * )
  8. 属性选择器(a[rel = “external”])
  9. 伪类选择器(a:hover, li:nth-child)

可继承的样式: font-size font-family color, UL LI DL DD DT;

不可继承的样式:border padding margin width height ;
`

CSS优先级

优先级就近原则,同权重情况下样式定义最近者为准;
优先级关系:内联样式 > ID 选择器 > 类选择器 = 属性选择器 = 伪类选择器 > 标签选择器 = 伪元素选择器
属性后插有 !important 的属性拥有最高优先级
以下是权重的规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

标签及伪元素的权重为1,class(伪类、属性)的权重为10,id的权重为100,以下例子是演示各种定义的权重值
/*权重为1*/
div{
}
/*权重为10*/
.class1{
}
/*权重为100*/
#id1{
}
/*权重为100+1=101*/
#id1 div{
}
/*权重为10+1=11*/
.class1 div{
}
/*权重为10+10+1=21*/
.class1 .class2 div{
}

CSS3新增伪类

1
2
3
4
5
6
7
8
9
10
11
p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。
p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素。
p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素。
p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素。
p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素。

:after 在元素之前添加内容,也可以用来做清除浮动。
:before 在元素之后添加内容
:enabled
:disabled 控制表单控件的禁用状态。
:checked 单选框或复选框被选中。`

CSS3新特性

  1. 各种CSS选择器
  2. 圆角
  3. 多列布局
  4. 阴影和反射
  5. 文字特效
  6. 文字渲染
  7. 线性渐变
  8. 旋转,缩放,定位,倾斜,动画,多背景

媒体查询

响应式设计


  • 布局

    1. 自适应布局
    2. 圣杯布局
      负margin
      双飞翼布局
      圣杯布局和双飞翼布局解决问题的方案在前一半是相同的,也就是三栏全部float浮动,但左右两栏加上负margin让其跟中间栏div并排,以形成三栏布局。

      不同在于解决”中间栏div内容不被遮挡“问题的思路不一样:
      圣杯布局,为了中间div内容不被遮挡,将中间div设置了左右padding-left和padding-right后,将左右两个div用相对布局position: relative并分别配合right和left属性,以便左右两栏div移动后不遮挡中间div。

      双飞翼布局,为了中间div内容不被遮挡,直接在中间div内部创建子div用于放置内容,在该子div里用margin-left和margin-right为左右两栏div留出位置。
      多了1个div,少用大致4个css属性(圣杯布局中间divpadding-left和padding-right这2个属性,加上左右两个div用相对布局position: relative及对应的right和left共4个属性,一共6个;而双飞翼布局子div里用margin-left和margin-right共2个属性,6-2=4)(https://www.zhihu.com/question/21504052/answer/50053054)

    3. 居中
      水平垂直居中

浏览器的兼容性

图片

在网页中的应该使用奇数还是偶数的字体

抽离样式模块

我理解的应该是提取页面公共样式。
一个项目的CSS可以拆分成2部分:公共CSS和业务CSS。我们在项目中抽出的这部分可以模块化的CSS就可以归类为公共CSS。这部分的代码命名不应涉及到具体的业务,只应对其在模块中负责的具体逻辑负责。
可以把网站的字体大小,公共控制,共用模块的样式都抽离出来,作为单独的模块来处理。这样,团队中的每个人如果需要这样的样式,都可以用这种公共样式,以此提高代码的重用率。
好的复用模块,应该是完整的、独立的。完整就是包含 PSD 中遇到的各种情况,对于不同的情况,只需要添加不同的类或者改用不同结构即可。独立性就是与其他模块和结构完全独立,直接粘贴复制不会产生任何影响。

全屏滚动

视觉差

手动写动画最小时间间隔

多数显示器默认频率是60Hz,即1秒刷新60次,所以理论上最小间隔为1/60*1000ms = 16.7ms

CSS 预处理器 / 后处理器

预处理器例如:LESS、Sass、Stylus,用来预编译Sass或less,增强了css代码的复用性,
还有层级、mixin、变量、循环、函数等,具有很方便的UI组件模块化开发能力,极大的提高工作效率。

后处理器例如:PostCSS,通常被视为在完成的样式表中根据CSS规范处理CSS,让其更有效;目前最常做的
是给CSS属性添加浏览器私有前缀,实现跨浏览器兼容性的问题。

初始化CSS样式

因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。
当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。

最简单的初始化方法: * {padding: 0; margin: 0;} (强烈不建议)

淘宝的样式初始化代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin:0; padding:0; }
body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; }
h1, h2, h3, h4, h5, h6{ font-size:100%; }
address, cite, dfn, em, var { font-style:normal; }
code, kbd, pre, samp { font-family:couriernew, courier, monospace; }
small{ font-size:12px; }
ul, ol { list-style:none; }
a { text-decoration:none; }
a:hover { text-decoration:underline; }
sup { vertical-align:text-top; }
sub{ vertical-align:text-bottom; }
legend { color:#000; }
fieldset, img { border:0; }
button, input, select, textarea { font-size:100%; }
table { border-collapse:collapse; border-spacing:0; }

css优化

如果静态文件都放在主域名下,那静态文件请求的时候都带有的cookie的数据提交给server的,非常浪费流量,
所以不如隔离开。
cookie隔离技术则是通过使用多个非主要域名来请求静态文件
因为cookie有域的限制,因此不能跨域提交请求,故使用非主要域名的时候,请求头中就不会带有cookie数据,这样可以降低请求头的大小,降低请求时间,从而达到降低整体请求延时的目的。同时这种方式不会将cookie传入webserver,也减少了webserver对cookie的处理分析环节,提高了webserver的http请求的解析速度。


FOUC(无样式内容闪烁)

<style type="text/css">@import"../fouc.css";</style>而引用CSS文件的@import就是造成这个问题的罪魁祸首。IE会先加载整个HTML文档的DOM,然后再去导入外部的CSS文件,因此,在页面DOM加载完成到CSS导入完成中间会有一段时间页面上的内容是没有样式的,这段时间的长短跟网速,电脑速度都有关系。解决方法简单的出奇,只要在之间加入一个或者