学习css总结

180 阅读9分钟

一、文档流(normal flaw)

正常文档流流动方向:从上到下从左到右

1、inline元素

流动方向:从左到右,最右边自动会换行(遇到行尾看一个元素可以占两行,会自动把一行补齐以后换行)
宽度:内联元素的总宽度决定,设置宽度没有用(尽量窄)
高度:由line-height间接决定,与height无关(字体也会影响高度)

2、block元素

流动方向:从上到下,每个都是单独的一行
宽度:默认自动计算宽度,可用width指定
高度:由内部文档流元素决定可以height设定;注:有些文档流元素可以脱离文档流

3、inline-block元素

流动方向:从左到右可自动换行,遇到换行不会把自己分成两行
宽度:结合inline和block,默认宽度由内联元素的总和决定但可设置宽度
高度:和block类似可设置高度

以上三种元素可互相转换

display:inline/block/inline-block

overflow溢出

当内容的宽度或高度大于容器的时候会溢出,可以用overflow设置滚动条:auto自动,scroll永远显示,hidden隐藏,visible直接显示溢出部分

 overflow:scroll; 永远显示(可滑动滚动条查看所有内容,即使内容没有溢出也有滚动条)
 overflow:visible; 是直接显示溢出部分
 overflow:auto; 可灵活设置(内容溢出时可滑动滚动条查看所有内容(内容无溢出时不显示滚动条),若文档流内的某个人元素过于宽了,会显示x轴的滚动条,但是文档流内的内容显示不会发生改变,它只会显示第一屏的内容。(overflow可以分为overflow-x和overflow-y))

脱离文档流

绝对定位:position:absolute/fixed
浮动:float

二、盒模型

content-box内容盒 border-box边框盒

公式:content-box的宽度 = 内容宽度
border-box的宽度 = 内容宽度 + padding + border 1.png

图片来源:饥人谷

margin合并

1、哪些情况可以合并:父子合并、兄弟合并
2、如何阻止合并:
取消父子合并:第一个元素和最后一个元素会跟他们的父元素外边距合并,以值大的为准

  • 用padding/border挡住
  • 用overflow:hidden挡住
  • 用display:flex

取消兄弟合并

  • 可用:display:inline-block

颜色

  1. 十六进制#FF6600或者#F60
  2. RGBA 颜色 rgb(红,绿,蓝) ,rgba(红,绿,蓝,透明度)
  3. hsl颜色(色相,饱和度,亮度), hsla颜色(色相,饱和度,亮度,透明度)

三、css三种布局

2.png

选择哪种布局

float布局

  1. 在子元素上加float:left和width
  2. 在父元素上加:.clearfix

.clearfix:after{content:' ';display : block; clear: both;}
3. 经验:

  • 会留空间或最右边不设置width
  • 无需做响应式,因为手机没有IE,这个布局是给IE准备的
  • IE6/7存在双倍margin的问题解决办法: ① 将错就错,把margin减半 ② 加display:inline-block
  • border有时候会干扰布局改成outline

flex布局

flex小游戏:flexboxfroggy.com/#zh-cn

container容器:display:flex|inline-flex

1. 改变item的流动方向(主轴)

.container{
flex-direction:row | row-reverse | column | column-reverse;
} 
  • row 横向,从左至右,顺序
  • row-reverse 横向,从右至左,倒序
  • column 纵向,从上至下,顺序
  • column-reverse 纵向,从下至上,倒序

direction.png

2. 改变折行

定义是否换行

.container{
flex-wrap:nowarp | wrap | wrap-reverse;
}

3. 主轴内容对齐方式
默认主轴是横轴,除非改变flex-direction

.container{
justify-content:flex-start | flex-end | center | space-between | space-around  space-evenly | stretch;
}
  • flex-start 从行首起始位置开始排列
  • flex-end 从行尾开始排列
  • center 居中
  • space-around 均匀排列每个元素(首个元素放置于起点,末尾元素放置于终点)
  • space-between 余下空间在元素之间平均分布,靠边
  • space-evenly 余下空间平均分布
  • stretch 均匀排列每个元素

3.png

4. 次轴对齐(默认主轴是纵轴)

.container{
align-items: stretch | flex-start | flex--end | center | baseline;
}
  • stretch 均匀排列每个元素的高度
  • flex-start 从起始位置开始排列
  • flex-end 从行尾开始排列
  • center 居中

4.png

5. 多行内容

.container{
align-content: flex-start | flex-end | center | stretch | space-between | space-around;
}
  • flex-start 从起始位置开始排列
  • flex-end 从行尾开始排列
  • center 排列元素都在中间
  • stretch 把空间撑满
  • space-between 均匀排列每行(首行元素放置于起点,末尾元素放置于终点)
  • space-around 余下空间在每行之间平均分布

5.png

flex的item属性

1. item上面加order
改变下显示顺序,默认的order都是0,如果改变数字则从小到大排列,负数最小

1.png

2. 加flex-grow,控制自己如何长胖
默认的flex-grow是0,把剩余空间分成n份,可指定每个item占几份,数值越大占比越多

1.png

3. flex-shrink(如何变瘦) 0防止变瘦,默认值是1;数值越大数值贡献越多

4. flex-basis,控制基准宽度
默认为auto 5. align-self定制align-items

align-self: auto | flex-start | flex-end | center | baseline | stretch;

grid布局

二维布局用grid,一维布局用flex
grid小游戏:cssgridgarden.com/

1. 成为container

.container{
display: grid  | inline-grid ;
}

2. 设置行列
grid-templete-column:设置列宽(也能以fr为单位,这样写它会以平均分布,相当于格子一样;可用多种单位:(grid-template-columns:100px 3em 40%))
grid-templete-row:设置行高

.comtainer{
grid-templete-columns:40px 50px auto 30px;
grid-templete-rows: 30px 20px 10px auto;
}

3. grid-templete-areas 分区

     "header heaer header"

      "asaide main ad"

      "footer footer footer"

4. grid-gap空隙
可控制两个元素之间的间隙(grid-column-gap/grid-row-gap)

grid-gap:12px; 

5. 用order改变顺序
规定了弹性容器中的可伸缩项目在布局时的顺序。元素按照 order 属性的值的增序进行布局。拥有相同 order 属性值的元素按照它们在源代码中出现的顺序进行布局

6. grid-column-start/grid-column-end:定义元素在行上开始和结尾的位置

grid-column-start:2; 从第二列开始  
grid-column-end:3;到第三列结束  
grid-row-start:2;从第二行开始  
grid-row-start:3;到第三行结束

四、css定位

div的分层

1.png

来源:饥人谷

  • 浮动元素脱离文档流,div的文字内容不分内外,后出现的遮挡先出现的,只有浮动元素会被遮住

position属性

1. static(默认值) 当前元素还在文档流中,一般不写默认值
2. relative:
作用 ① 相对定位:升起来但是不脱离文档流

position:relative;
top:10px;

作用 ② 配合z-index使用
默认每个元素的z-index是auto,auto的计算值为0但是不能写z-index:0;
每个层叠上下文都是一个新的作用域,只有处在同一个作用域中的z-index才能进行比较
注意:relative在文档流中占位不变,只是显示看起来变了

3. absolute绝对定位

使用场景:①脱离原来的位置另起一层,比如关闭对话框按钮;② 鼠标提示
注意:①以祖先元素中最近的非static元素为基准定位
②某些浏览器不写left/top会错乱
③善用left:100%;负margin;
④子元素写absolute,父元素需要补relative

5. fixed固定定位
相对视口定位;
使用场景:①广告②回到顶部按钮
注意:手机上不可以使用这个,非常非常容易报错 ②父元素使用transform,fixed定位会失效

6. sticky粘滞定位
使用方法:sticky+mdn

层叠上下文

1.png

图片:饥人谷

  • 每个层叠上下文都是一个小世界(作用域)
  • 每个作用域的z-index与外界无关,处在同一个小世界z-index才能比较

注意:哪些不正交的属性可以创建层叠上下文

  • z-index=0(前提:有写position:reltive | absolute | fixed)
  • 搜索mdn文档
  • 需要记忆:z-index | flex | opacity | transform
  • 如果忘记:【层叠上下文MDN】
  • 其他:opacity与background区别:opacity影响整个元素的透明度包括border背景等等,background只影响背景

五、css动画

浏览器的渲染原理

浏览器渲染过程
  1. 根据HTML构建HTML树(DOM)
  2. 根据CSS构建CSS树(CSSDOM)
  3. 将两棵树合并成一颗渲染树(render tree)
  4. layout布局(文档流,盒模型,计算大小和位置)
  5. paint绘制(把边框颜色,文字颜色,阴影等画出来)
  6. component合成(根据层叠关系展示画面)

1.png

transform

transform四个常用功能:位移translate | 缩放scale | 旋转rotate | 倾斜skew
经验:①一般需要配合transition过渡使用;②inline元素不支持transform,需要先变成block
缩写:

transform:rotate(45deg) translateX(20px);

transition过渡方式

作用:补充中间帧
语法:

  1. transition: 属性名 时长 过渡方式 延迟;
  2. 可以用逗号隔开两个不同属性(transition:left 200ms, top 1s)
  3. 可以用all代表所有属性(transition:all .8s;)
  4. 过渡方式有:linear匀速 | ease-in加速 | ease-out减速 | ease逐渐变慢 | cubic-bezier自定义速度模式 | 等等其他
  5. 如何让动画停在最后一帧:加forwards

注意

  1. 不是所有属性都能过渡,比如display:none-->block不能过渡
  2. 可以改成:visibility:hidden-->visible
  3. opacity也可以过渡
  4. display和visibility的区别: display: none;是彻底消失,不在文档流中占位,浏览器也不会解析该元素;不会被子元素继承。visibility:hidden;是视觉上消失了,在文档流中占位,浏览器会解析该元素;会被子元素继承。

animation动画

keyframes语法
  1. form to写法
@keyframes slidein{
    from { transform: translateX(0%);  }
    to { transform: translateX(100%);  }
}

  1. 百分数写法
@keyframes identifier {
    0% { top: 0; left: 0; }
    30% { top: 50px; }
    68%, 72% { left: 50px; }
    100% { top: 100px; left: 100px; }
}
animation语法
  1. animation:时长|过渡方式|延迟|次数|方向|填充模式|是否暂停|动画名; 时长:1s或者1000ms
  2. 过渡方式:跟transition取值一样,如linear
  3. 次数:3或者2.4或者infinite
  4. 方向:reverse | alternate| alternate-reverse
  5. 填充模式:none | forwards | backwards | both
  6. 是否暂停:paused | running
  7. 注:以上所有属性都有对应的单独属性