CSS八股笔记自用1

140 阅读8分钟

CSS基础

选择器权重

  • 继承样式:0
  • 标签选择器、伪元素选择器:1 (a{}, div::before)
  • 类选择器、伪类选择器、属性选择器:10 (class, a:first-child, a[title])
  • id 选择器:100(id="")
  • 内联样式:1000(style="")

可继承类属性

  1. 字体系列 font
  2. 文本系列
  • text-indent:文本缩进

  • text-align:文本水平对齐

  • line-height:行高

  • word-spacing:单词之间的间距

  • letter-spacing:中文或者字母之间的间距

  • text-transform:控制文本大小写(就是uppercase、lowercase、capitalize这三个)

  • color:文本颜色

  1. 光标形态 cursor
  2. visibility
  3. list-style

display

interhit:默认继承父元素的display table:块级元素表格 list-item:类似ul里面li

行内元素,行内块元素

行内元素不能设置水平方向的margin和padding,可以设置垂直方向的margin和padding,不会自动换行
行内块元素内联对象会排列在同一行

隐藏元素方法

display: none:渲染树不会包含这个对象,在页面不占据位置,无法响应事件,但是DOM树中仍然会存在。
visibilty:hidden: 在页面占据位置,但无法响应事件
opacity: 0:透明度为0,在页面占据位置,也能响应事件
transform: scale(0, 0): 缩放值为0,占据位置,不响应事件
z-index: 负值

link和@Import

  1. link是在页面载入时同时加载,@import是页面加载完后加载。
  2. link支持用js控制dom改变样式,import不支持
  3. import只能加载css,link可以加载其他如rss

伪元素 伪类

伪元素是在内容前后插入样式,但这些元素实际并不在文档中生成
伪类是把特殊效果添加到特定选择器上,不会产生新的元素,如hover

盒模型

content -> padding -> border -> margin
普通盒模型 width只包含content,IE(box-sizing: border-box)包含content padding border

translate改变位置而不是定位

translate不会触发重绘回流,定位用到cpu,效率低

CSS3新特性

  • 新增各种CSS选择器 (: not(.input):所有 class 不是“input”的节点)

  • 圆角 (border-radius:8px)

  • 多列布局 (multi-column layout)

  • 阴影和反射 (Shadoweflect)

  • 文字特效 (text-shadow)

  • 文字渲染 (Text-decoration)

  • 线性渐变 (gradient)

  • 旋转 (transform)

  • 增加了旋转,缩放,定位,倾斜,动画,多背景

雪碧图的理解

CSSSprites(精灵图),将一个页面涉及到的所有图片都包含到一张大图中去,然后利用CSS的 background-image,background-repeat,background-position属性的组合进行背景定位。

  • 优点:减少http请求,减少图片字节
  • 缺点:需要借助工具取得位置,维护困难

calc

首先使用上必须在+,-,*,/前后加空格,用一个简单的例子

.parent {
  /* 1. 使子元素相对于本元素定位 */
  position: relative;
}
.child {
  /* 2. 开启绝对定位 */
  position: absolute;
  /* 3. 设置该元素的偏移量,值为 50%减去宽度/高度的一半 */
  left: calc(50% - 150px);
  top: calc(50% - 150px);
}

line-height

  • line-height是指一行文本的高度,包含了字间距,实际上是指一条基线到另一条基线的距离
  • 如果没有指定height,高度由line-height指定。

CSS百分比参照问题

  • 参照父元素width的元素:padding, margin, width, text-indent
  • 参照父元素height的元素:height
  • 参照父元素属性的元素:font-size, line-height
  • 相对定位时,top参考父元素content的高度,left参考宽度
  • 绝对定位时,top参考最近定位元素包含padding的高度

css文件加载不受跨域限制

如何判断元素是否到达可视区域

  • window.innerHeight:浏览器可视区高度
  • document.body.scrollTop || document.documentElement.scrollTop 是浏览器滚动的过的距离
  • img.offsetTop 图片距离文档顶部的距离
  • img.offsetTop < window.innerHeight + document.body.scrollTop

css提高性能

  1. 加载性能
  • 打包压缩
  • 少使用@import,多使用link
  1. 渲染性能
  • 减少回流重绘,可以先让更改的元素脱离文档流(比如display:none),然后再更改,最后使其返回文档。
  • 少使用浮动定位

css预处理器和后处理器

预处理器:用来编译less,sass等
后处理器:后处理器,如postcss,通常用来给已经完成的样式表添加前缀,如浏览器前缀等等

display: inline-block间隙

  1. 有空格时有间隙,删除空格
  2. margin为正值时,设置为负
  3. 设置font-size时,可设置font-size和letterspace等

溢出省略号表示

  1. 单行
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
  1. 多行
overflow : hidden;
            text-overflow: ellipsis;
            display: -webkit-box;
            -webkit-line-clamp: 2;
            -webkit-box-orient: vertical; 

媒体查询

CSS3的新特性,@media标签,主要用来根据用户不同屏幕大小返回不同样式

回流与重绘

首先从输入url后页面渲染过程开始讲起

  1. HTML代码解析成DOM树
  2. CSS代码解析成CSSOM树
  3. 整合成render树
  4. 生成布局,将整合的DOM节点放到应该放的位置,但此时还未渲染到页面上
  5. 绘制页面,属于宏任务

回流

回流发生在JS动态控制DOM结构,且有DOM节点的几何元素发生改变时,即重新执行上面的第四步,例如:

  1. window大小被修改
  2. 增加删除DOM结构
  3. 元素的尺寸发生变化
  4. offsetWidth 和 offsetHeight ,offset... ,clientWidth,client...,scrollTop,scroll...

重绘

重新执行上面的第五步,简单来说,所有非几何元素信息改变都会发生重绘,比如说布局没发生改变,内容发生变化,像分页器那种页面,就是重绘。

回流一定重绘,重绘不一定回流

例题

<body>
    <div id="app">   
    </div>
    
    <script>
        let el = document.getElementById('app')
        el.style.width = (el.offsetWidth+1)+'px'
        el.style.width = 1+'px'
    </script>
</body>

知识点:

  1. 浏览器会生成一个回流队列,将触发回流的几何信息改变存储起来,直到没有样式修改,浏览器按照这个队列进行批量回流(一个队列一次回流)
  2. offsetLeft,offset....会刷新回流队列,即强制执行回流队列后清空,并将offset..推入回流队列。 所以看上面那道题,清空原本就是空的回流队列后,只有一条回流队列,里面存储三份导致回流产生的几何信息改变结果,所以只进行一次回流,也就进行一次重绘

布局

两栏布局

多指左侧宽度固定,右侧宽度自适应

左侧浮动,右侧设置margin值,width自适应(撑满父盒子)

<div class="outer">
        <div class="left"></div>
        <div class="right"></div>
</div>
.outer {
            height: 100px;
        }
        .left {
            float: left;
            width: 200px;
            height: 100px;
            background-color: green;
        }
        .right {
            margin-left: 200px;
            height: 100px;
            background-color: yellow;
        }

右侧创建BFC使其不会与左侧浮动重叠

.right {
     overflow: hidden;
     height: 100px;
     background-color: yellow;
}

利用flex布局

        .outer {
            display: flex;
            height: 100px;
        }
        .left {
            width: 200px;
            height: 100px;
            background-color: green;
        }
        .right {
            flex: auto;
            height: 100px;
            background-color: yellow;
        }

flex: flex-grow flex-shrink flex-basis

三栏布局

通常指两侧宽度固定,中间宽度自适应

定位实现

        .outer {
           position: relative;
           height: 100px;
       }
       .left {
           position: absolute;
           top: 0;
           left: 0;
           width: 200px;
           height: 100px;
           background-color: yellow;
       }
       .right {
           position: absolute;
           top:0;
           right: 0;
           width: 100px;
           height: 100px;
           background-color: green;
       }
       .center {
           width: auto;
           height: 100px;
           margin-left: 200px;
           margin-right: 100px;
           background-color: black;
       }

浮动 + BFC/margin

       .outer {
         height: 100px;
     }
     .left {
         float: left;
         width: 200px;
         height: 100px;
         background-color: yellow;
     }
     .right {
         float: right;
         width: 100px;
         height: 100px;
         background-color: green;
     }
     .center {
         width: auto;
         height: 100px;
         overflow: hidden;
         background-color: black;
     }
 ```
 ### flex
 ```css
         .outer {
         height: 100px;
         display: flex;
     }
     .left {
         width: 200px;
         height: 100px;
         background-color: yellow;
     }
     .right {
         width: 100px;
         height: 100px;
         background-color: green;
     }
     .center {

         height: 100px;
         flex:1;
         background-color: black;
     }

圣杯布局

圣杯布局实现思路如下:

  1. 首先html结构里,center放在最前
  2. 给center, left, right添加浮动,其中center的宽度为100%,由于宽度所以left,right被挤下去
  3. 给center父元素outer添加padding,限制center的宽度
  4. 给left和right添加margin,使其回到outer上,此时left,right覆盖在center上
  5. 给left和right添加相对定位,使其回到两边,不覆盖center

双飞翼布局

与圣杯布局的不同在于其先让left,right覆盖center,然后在center内添加盒子inner-center放置内容,并给这个盒子添加margin,使其不会给left,right覆盖

  1. 首先html结构里,center放在最前
  2. 给center, left, right添加浮动,其中center的宽度为100%,由于宽度所以left,right被挤下去
  3. 给left,right添加margin,使其回到outer上,此时left,right覆盖在center上
  4. 给inner-center添加margin,使其不被覆盖

水平垂直居中

  1. 定位 + translate/ margin
  2. flex:justify-contentalign-items

flex布局

  • 首先是父元素的属性
  1. flex-direction: 主轴的排列方向(row, column, row-reverse, column-reverse)
  2. flex-wrap: 是否换行(no-wrap, wrap, wrap-reverse)
  3. flex-flow: flex-direction | flex-wrap
  4. justify-content: 主轴的排列方式(flex-start, flex-end, space-around, space-between, center)
  5. align-items: 交叉轴元素的排列方式(flex-start, flex-end, center, stretch(default):占满交叉轴,baseline:第一行文字基线
  6. align-content:多根轴线的排列方式(flex-start, flex-end, center, space-around, space-between)
  • 然后是子元素的属性
  1. order:数值越小,默认越靠前,默认为0

  2. flex-grow: 放大比例,默认为0,如果子元素都为1,则等分剩余空间,如果一个是2,其他是1,则2那个子元素占据两份

  3. flex-shrink: 缩小比例,默认为1,即空间不足时会缩小

  4. flex-basis:length | auto: 给元素在分配多余空间前占据一定的位置。

  5. flex: flex-grow, flex-shrink, flex-basis, 后面两个可选,flex-auto:1,1,auto; flex:none = 0,0,none

  6. align-self:设定单个元素在交叉轴的排列方式