CSS总结

79 阅读9分钟

CSS盒子模型

盒子模型是装载页面元素的矩阵区域,分为IE盒子模型和标准的W3C盒子模型。

W3C盒子模型

IE盒子模型

包括 margin(外边距)、border(边框)、padding(内边距)、content(内容区)。

区别

W3C盒子模型:width = content_width

IE盒子模型:width = border + padding + content_width

CSS3中引入box-sizing属性,box-sizing:content-box(默认);表示标准的盒子模型,box-sizing:border-box表示的是IE盒子模型

box-sizing:改变盒子模型

box-sizing:content-box/border-box/inherit

content-box:宽度和高度分别应用到元素的内容框,在宽度和高度之外绘制元素的内边距和边框

border-box:为元素设定的宽度和高度决定了元素的边框盒,

inherit:继承父元素的box-sizing

transition和animation的区别

transition 需要触发一个事件才能改变属性,animation不需要触发任何事件的情况下才会随着事件改变属性值。transition 触发一次播放一次;而 animation 则是可以设置很多的属性,比如循环次数,动画结束的状态等等

Flex布局

Flex布局又称弹性布局,用来为盒子模型提供最大的灵活性,解决传统布局方案中依赖display,position,float属性,这些不易于实现垂直居中。

容器属性

flex-direction:决定主轴的方向

flex-wrap:决定换行规则

justify-content:对其方式,水平主轴对齐方式

align-items:对齐方式,竖直轴线方向

元素属性

order:定义项目的排列顺序,顺序越小,排列越靠前,默认为0

flex-grow属性:定义项目的放大比例,即使存在空间,也不会放大

flex-shrink属性:定义了项目的缩小比例,当空间不足的情况下会等比例的缩小,如果定义个item的flow-shrink为0,则为不缩小

flex-basis属性:定义了在分配多余的空间,项目占据的空间。

flex: 1

flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为1 1 0%; 实现自适应。

flex实现水平垂直居中

1.给父元素设置

body{
  display: flex;
  align-items: center; //定义body的元素垂直居中(主轴居中-主轴默认是x轴)
  justify-content: center; //定义body的元素水平居中//侧轴居中-主轴默认是y轴)
}

BFC

BFC:块级格式化上下文,元素隐含的属性,默认是关闭的。当开启元素的BFC以后,元素会变成一个独立的布局区域,将会具有如下的特性:

1.父元素的垂直外边距不会和子元素重叠(给子元素设置margin,移动父元素)  

2.开启BFC的元素不会被浮动元素所覆盖

3.开启BFC的元素可以包含浮动的子元素

开启BFC:

1. 设置元素浮动 float:left (宽度缺失) 2. 设置元素为inline-block 3.元素的overflow设置为一个非visible的值 4.设置元素绝对定位 / 固定定位 5.display: flex / inline-block / table-cell

margin塌陷和margin合并

margin塌陷: 父子元素的margin-top取两者中最大值。 margin合并: 两个元素margin-bottom和margin-top合并了,并且显示的是较大值。 解决方法:开启BFC

高度坍塌:

在浮动布局中,父元素高度默认是被子元素撑开的,当子元素浮动后会脱离文档流,无法撑起父元素高度,导致父元素高度丢失。

解决方法:

  1. 固定父元素的高度
  2. 清除浮动:通过伪元素在父元素的底部增加一个块元素,清除浮动,撑起父元素的高度 原理:给父元素底部增加一个块元素,添加clear:both后,该块元素会生成margin-top属性,值为浮动元素的高度,从而撑开父元素。
.clearfix::before, /* 垂直外边距不重叠*/
.clearfix::after{ /* 解决高度塌陷*/  
        clear:both; /*清除两侧浮动*/
        content: '';
        display: table;
      }
  1. 开启BFC

垂直居中

  1. margin:auto 定位为上下左右为0,margin:0
div{
width: 400px;
height: 400px;
position: relative;
border: 1px solid #465468;
}
img{
position: absolute;
margin: auto;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
html:
<div>
<img src="mm.jpg">
</div>

2.margin-top,margin-left为height和width的一半

.container{
width: 500px;
height: 400px;
border: 2px solid #379;
position: relative;
}
.inner{
width: 480px;
height: 380px;
background-color: #746;
position: absolute;
top: 50%;
left: 50%;

3.table-cell 设置父元素的 display:table-cell,并且vertical-align:middle,

css:
.container{
width: 300px;
height: 200px;
border: 3px solid #546461;
display: -webkit-flex;
display: flex;
-webkit-align-items: center;
align-items: center;
-webkit-justify-content: center;
justify-content: center;
}
.inner{
border: 3px solid #458761;
padding: 20px;
}

JS动画和css3动画的差异

渲染线程分为main thread和compositor thread,如果css动画只改变transform和opacity,这时整个CSS动画得以在compositor trhead完成,js动画则会在main thread执行。

区别:

  1. js功能比css多
  2. css3比js更加简单,css动画有天然事件支持
  3. css3有兼容性问题

block, inline, inline-block 区别

block(块元素):独占一行,前后有换行符,并且有自动填满父元素,可以设置margin和pading以及高度和宽度

inline(行元素):不会独占一行,width和height会失效,margin/padding在竖直方向上无效。

inline-block(行内块元素):能设置宽度高度,margin/padding水平垂直方向 都有效,前后无换行符。

为什么img是inline还可以设置宽高

实际上img是可替换元素,展现效果不是由 CSS 来控制的。这些元素是一种外部对象,它们外观的渲染,是独立于 CSS 的。实际类似于inline-block。典型可替代元素(<iframe>、<video>、<embed>、<canvas>)

position属性

  1. fixed:固定定位。相对于浏览器窗口是固定位置,即使窗口是滚动的它也不会移动
  2. relative:相对定位。通过设置垂直或水平位置,让这个元素“相对于”它的起点进行移动。
  3. absolute:绝对定位。相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对于<Html>
  4. sticky:粘性定位。相对于该元素在流中的flow root(BFC)和 containing block(最近的块级祖先元素)定位。相当于fixed + relative
  5. static:默认定位
  6. inherit:继承

CSS3新特性

边框:border-radius,box-shadow

背景:background-size,background-origin

文本:text-overflow: ellipsis (溢出显示...)

动画:Transition,Transform,animation

属性选择器:[attribute^=value]: 选择某元素attribute属性是以value开头的。

伪类选择器:E:nth-child(n): 选择属于其父元素的第n个子元素的每个E元素。

CSS3选择器(常用)

  1. id选择器
  2. class选择器
  3. 标签选择器
  4. 伪元素选择器
  5. 伪类选择器
  6. 通配选择器
  7. 属性选择器

选择器优先级:id 选择器 > class 选择器 > 标签选择器

样式优先级:!important > 内联样式> 内部样式 > 外部样式 > 浏览器用户自定义样式 > 浏览器默认样式

伪类和伪元素

区别:伪类一般用 单冒号 (双冒号会失效),伪元素可以用单/双冒号。伪元素可以理解成加了一个在DOM种不可见的节点。

常用伪类: :hover :active :nth-child 常用伪元素: ::before ::after 5d0f5c03.png

b4365018.png

元素消失

  1. display:none (在页面中彻底消失,但还是可以通过DOM进行操作)改变页面布局, 回流和重绘
  2. visibility:hiddent (隐藏)不改变页面布局, 仅仅重绘
  3. opacity:0 不改变页面布局

图片在某个容器中居中

  1. 父元素固定宽高,利用定位及设置子元素margin值为自身的一半。
  2. 父元素固定宽高开启relative,子元素设置position: absolute,margin:auto平均分配margin
  3. css3属性transform。子元素设置position: absolute; left: 50%; top: 50%;transform: translate(-50%,-50%);即可。
  4. 父元素设置成display: table, 子元素设置为单元格 display: table-cell。
  5. 弹性布局display: flex。设置align-items: center; justify-content: center

三栏布局实现

三列布局又分为两种,两列定宽一列自适应,以及两侧定宽中间自适应

//两侧定宽中间自适应
  <style>
  .left {
      float: left;
      height: 200px;
      width: 100px;
      margin-right: 20px;
      background-color: red;
  }
  .right {
      width: 200px;
      height: 200px;
      float: right;
      margin-left: 20px;
      background-color: blue;
  }	
  .main {
      height: 200px;
      overflow: hidden;
      background-color: green;
  }
  </style>

圣杯布局和双飞翼布局

  1. 定义三个div:head, main, footer 并设置初始样式
  2. 定义main中三个div: center, left, right(center),设置样式
  3. center、left、right 向左浮动, 并给main清除浮动
  4. left设置margin-left: -100%; right设置margin-left: -300px;
  5. 圣杯布局 开启相对定位,给 left 和 right 设置相对定位,将它们移动到相应的位置。
  6. 双飞翼布局 给center 加一个子元素 inner。给inner设置左margin 和右margin,将inner挤到中间显示。

calc属性

Calc属性用于动态计算长度值,运算符前后都需要保留一个空格。

例如:width: calc(100% - 10px);

display: table 和 table区别

display:table的css声明能够让一个html元素和它的子节点像table元素一样,使用基于表格的css布局,是我们能够轻松定义一个单元格的边界,背景等样式,而不会产生因为使用了table那样的制表标签导致的语义化问题。

层叠上下文(z-index)

z-index只对开启定位的元素有效,设置一个定位元素沿z轴的位置,值越大,离我们越近

background-color

background-color设置的背景颜色会填充元素的content、padding、border区域

回流(重排)和重绘

回流(重排, Layout): DOM元素宽高发生变化时,浏览器重新计算元素的几何属性,其他元素的几何属性也会受到影响,浏览器需要重新构造渲染树,这个过程称之为重排。

  • 页面渲染初始化
  • 浏览器窗口改变尺寸
  • 元素位置 / 大小改变 (外边距,内边框,边框大小,高度/宽度)
  • 添加 / 删除DOM
  • 获取属性 (offset / scroll / client / width / height)

重绘(Painting):浏览器将受到影响的部分重新绘制在屏幕上的过程称为重绘。

减少重绘和重排

  1. 分离读写操作
  2. 样式集中改变
  3. 缓存布局信息
  4. DOM离线,使用DocumentFragment
  5. position属性设置为absolute或fixed,重排开销比较小
  6. 使用 visibility:hidden / opacity: 0 替代 display: none
  7. 使用resize事件时,做防抖和节流处理

overflow原理

BFC

CSS 画0.5px的线

transformer