CSS 知识总结

65 阅读5分钟

css是做什么的?

给指定标签或者指定类型标签加样式的。
查找资料
1 MDN
2 css tricks
查看浏览器对CSS属性的支持
caniuse.com

元素摆放的规则?文档流指定。

display: line | block | inline-block
流动方向

  1. inline 元素从左到右,到达最右边才会换行
  2. block 元素从上到下,每一个都另起一行
  3. inline-block 也是从左到右,但是元素不会分成两行 宽度
  4. inline 宽度为内部 inline 元素的和,不能用 width 指定
  5. block 默认自动计算宽度,可用 width 指定
  6. inline-block 结合前两者特点,可用 width 高度
  7. inline 高度由 line-height 间接确定,跟 height 无关,跟文档流也无关
  8. block 高度由内部文档流元素决定,可以设 height
  9. inline-block 跟 block 类似,可以设置 heigh,设置的高度小于内容高度后,内容会溢出,溢出的显示由overflow指定,overflow: visible | hidden | auto

内部元素脱离文档流?

float: left
position: absolute

元素摆放的模型,合模型

box-sizing: boder-box | content-box (默认值content-box,但基本上是用boder-box)

  • 指定盒模型类型为边框盒时, box-sizing: border-box; 设置的宽度是指,内容宽度+padding宽度 + border宽度
  • 指定盒模型类型为内容盒时, box-sizing: content-box; 设置的宽度是指,内容宽度 一般来说,在css文件前指定默认为boder-box
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

另外,合模型的外边距margin上下会合并,分为父子margin合并和兄弟margin合并,兄弟合并一般是符合预期的
如何阻止父子合并?

  • 父子合并用 padding / border 挡住,设置
  • 父子合并用 overflow: hidden 挡住
  • 父子合并用 display: flex

float布局,某些版本ie上必须用的布局

父元素加 clearfix ,否则就不能包裹子节点
子元素加上float: left

.clearfix::after {
  content: "";
  clear: both;
  display: block;
}

flex布局,最重要,应用最为广泛的布局方式

参考资料
www.runoob.com/w3cnote/fle…
通关游戏
flexboxfroggy.com/#zh-cn
flex布局父元素的属性:

  • display: flex;
  • flex-direction // 主轴方向 row | row-reverse | column | column-reverse;
  • flex-wrap // 换行方式 nowrap | wrap | wrap-reverse;
  • flex-flow // flex-direction 与 flex-wrap 的间写形式
  • justify-content // 主轴排列方式 flex-start | flex-end | center | space-between | space-around;
  • align-items // 交叉轴对齐方式 flex-start | flex-end | center | baseline | stretch;
  • align-content // 轴线的对齐方式 flex-start | flex-end | center | space-between | space-around | stretch; flex布局子元素的属性:
  • order // 顺序,默认是0
  • flex-grow // 布局放大占比,默认是0
  • flex-shrink // 布局缩小占比,默认是1,值为0代表不缩小
  • flex-basis // 不清楚
  • flex // flex-grow, flex-shrink 和 flex-basis的简写
  • align-self // 子布局在交叉轴上的摆放方式,auto | flex-start | flex-end | center | baseline | stretch;

grid布局,最新最灵活的布局方式,但是浏览器支持度不如flex

参考资料
www.runoob.com/css3/css-gr…
通关游戏
cssgridgarden.com/
grid布局父元素常用属性,注意,这些属性值设置非常灵活

display: grid;
grid-template-columns: 50px auto 60px;
grid-template-rows: 60px auto 60px;
grid-gap: 10px;
grid-template-areas:
    "header header header"
    "aside main ads"
    "footer footer footer";

grid布局子元素常用属性

grid-row-start: 1;
grid-row-end: 3;
grid-area: ads;

css定位,position属性指定

position: static | relative | absolute | fixed | sticky

  • 1 position: static, 默认值,非定位元素
  • 2 position: relative , 布局不脱离文档流,只是看起来偏离了一点而已,在定位上基本不用,但是,配合 z-index 属性,比如设置z-index=1,相对默认的z-index=0,会让布局出现在上面
  • 3 position: absolute , 脱离文档流,脱离原来的位置,甚至脱离父布局的控制,脱离文档流,另起一层相对于祖先中第一个定位元素(也就是position!=static的元素),进行定位
  • 4 position: fixed , 相对于浏览器视口定位,视觉窗口,比如浏览器广告,回到首页按钮等

css定位,z-index属性指定

指定了堆叠顺序,堆叠属性在上面的会覆盖下面的但是比较两个元素的z-index时,不能直接比较数值的大小,要注意这两个z-index要在同一个层叠上下文。

浏览器的渲染过程

  • 1,根据html构建html树(DOM)
  • 2,根据css构建css树(CSSOM)
  • 3,将两棵树合成一棵渲染书
  • 4,Layout布局
  • 5,Paint绘制
  • 6,Compose合成

css动画就是浏览器动态渲染的过程,动态进行layout/panint/compose 一个或者几个步骤

css动画之transform

  • 1,父元素上,transition: all 1s linear; /all表示所有属性都过渡,1s表示动画时间,linear表示匀速/
  • 2,子元素上,也就是动画元素上,transform: translateX | translateY | rotate() | scale() 等
  • 3,动画触发,子元素被鼠标悬停
/*hover 鼠标悬停的意思*/
#demo:hover{
  transform: translateX(50px); /*X轴方向的位移动画*/
  transform: translateZ(0px); /*Z轴方向的位移动画*/
}

动画触发,还可以用js指定子元素增加一种class选择器(颜色变化动画)

#demo{
  width:100px;
  height:100px;
  border: 1px solid red;
  transition:all 4s;
  background: green;
}
#demo.end{
  width: 200px;
  height: 200px;
  background:blue;
}
button.onclick = ()=>{
  demo.classList.add("end");
}

css动画之animation

1,指定关键帧

@keyframes dxxx
{
 0%{
   transform: none;
 }
  66%{
    transform: translateX(200px);
  }
  100%{
    transform: translateX(200px) translateY(100px);
  }
}

2,指定动画

#demo.start{
  animation: dxxx 2s infinite alternate forwards;
}

3,触发动画

button.onclick = ()=>{
  demo.classList.add("start");
}