关于html5

  1. 如何理解HTML语义化

    • 让人更容易读懂(增加代码可读性)。
    • 让搜索引擎更容易读懂,有助于爬虫抓取更多的有效信息,爬虫依赖于标签来确定上下文和各个关键字的权重(SEO)
    • 在没有 CSS 样式下,页面也能呈现出很好地内容结构、代码结构。
  2. script 标签中 defer 和 async 的区别?

    • script: 会阻碍 HTML 解析,只有下载好并执行完脚本才会继续解析 HTML。
    • async script: 解析 HTML 过程中进行脚本的异步下载,下载成功立马执行,有可能会阻断 HTML 的解析。
    • defer script:完全不会阻碍 HTML 的解析,解析完成之后再按照顺序执行脚本。
  3. 暂定

关于css3

  1. 盒模型介绍

    css3主要有两种盒模型: 标准盒模型IE(替代)盒模型
    两种盒子模型都是由 content + padding + border + margin 构成,其大小都是由 content + padding + border 决定的,但是盒子内容宽/高度(即 width/height)的计算范围根据盒模型的不同会有所不同:

    • 标准盒模型:只包含 content 。
    • IE(替代)盒模型:content + padding + border 。

    可以通过 box-sizing 来改变元素的盒模型:

    • box-sizing: content-box :标准盒模型(默认值)。
    • box-sizing: border-box :IE(替代)盒模型。
  2. css选择器

    2.1 选择器有哪些?

    name type
    类型选择器 h1 { }
    通配选择器 * { }
    类选择器 .box { }
    ID 选择器 #unique { }
    标签属性选择器 a[title] { }
    伪类选择器 p:first-child { }
    伪元素选择器 p::first-line { }
    后代选择 article p
    子代选择器 article > p
    相邻兄弟选择器 h1 + p
    通用兄弟选择器 h1 ~ p

    2.2 选择器优先级的计算规则(内联 > ID选择器 > 类选择器 > 标签选择器)
    优先级是由 A 、B、C、D 的值来决定的,其中它们的值计算规则如下:

    • 如果存在内联样式,那么 A = 1, 否则 A = 0;
    • B 的值等于 ID选择器 出现的次数;
    • C 的值等于 类选择器 和 属性选择器 和 伪类 出现的总次数;
    • D 的值等于 标签选择器 和 伪元素 出现的总次数 。
      也可以看下这篇文章:深入理解css选择器优先级
  3. 重排(reflow)和重绘(repaint)

    • 重排:无论通过什么方式影响了元素的几何信息(元素在视口内的位置和尺寸大小),浏览器需要重新计算元素在视口内的几何属性,这个过程叫做重排。
    • 重绘:通过构造渲染树和重排(回流)阶段,我们知道了哪些节点是可见的,以及可见节点的样式和具体的几何信息(元素在视口内的位置和尺寸大小),接下来就可以将渲染树的每个节点都转换为屏幕上的实际像素,这个阶段就叫做重绘。

    如何减少重排和重绘?

    • 最小化重绘和重排,比如样式集中改变,使用添加新样式类名 (.class或cssText)
    • 批量操作DOM,比如读取某元素offsetWidth属性存到一个临时变量,再去使用,而不是频繁使用这个计算属性; 又比如利用document.createDocumentFragment()来添加要被添加的节点,处理完之后再插入到实际的DOM中。
    • 使用absolute或者fixed使元素脱离文档流,
    • 开启GPU加速,利用css属性transformwill-change等,比如改变元素的位置,我们使用translate会比使用绝对定位改变其left,top等来的高效,因为它不会触发重排和重绘,transform使浏览器为元素创建一个GPU图层,这使得动画元素在一个独立的层中进行渲染。当元素的内容没有发生改变,就没必要进行重绘。
  4. 对BFC的理解

    BFC即块级格式上下文,根据盒模型可知,每个元素都被定义为一个矩形盒子,然而盒子的布局会受到尺寸,定位,盒子的子元素或兄弟元素,视口的尺寸等因素决定,所以这里有一个浏览器计算的过程,计算的规则就是由一个叫做视觉格式化模型的东西所定义的,BFC 就是来自这个概念,它是 CSS 视觉渲染的一部分,用于决定块级盒的布局及浮动相互影响范围的一个区域。
    推荐一篇大佬关于BFC区域的详细解析:可能是最好的bfc解析了

    哪些方式可以构建出BFC区域

    • 绝对定位元素 (position为absolute或者fixed
    • 行内块元素(display:inlineblock
    • overFlow的值不为visible

    BFC具有的一些特性

    • 块级元素会在垂直方向一个接一个的排列,和文档流的排列方式一致。
    • 在BFC中上下相邻两个容器的margin会重叠,创建新的BFC可以避免外边距重叠。可避免margin重叠的问题
    • 计算BFC的高度的时候,需要计算浮动元素的高度(可避免高度塌陷),每个元素的左margin值和容器的左border相接触。(可以实现三栏(或两栏)的自适应布局
    • BFC区域不会与浮动的容器发生重叠。
    • BFC是独立的容器,容器内部元素不会影响外部元素。
  5. 实现两栏布局(左侧固定+右侧自适应布局)

    DOM结构:

    1
    2
    3
    4
    <div class="outer">
    <div class="left">左侧</div>
    <div class="right">右侧</div>
    </div>
    • 利用浮动,左边元素宽度固定 ,设置向左浮动。将右边元素的 margin-left 设为固定宽度 。注意,因为右边元素的 width 默认为 auto ,所以会自动撑满父元素。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      .outer {
      height: 100px;
      }
      .left {
      float: left;
      width: 200px;
      height: 100%;
      background: lightcoral;
      }
      .right {
      margin-left: 200px;
      height: 100%;
      background: lightseagreen;
      }
    • 同样利用浮动,左边元素宽度固定 ,设置向左浮动。右侧元素设置 overflow: hidden; 这样右边就触发了 BFC ,BFC 的区域不会与浮动元素发生重叠,所以两侧就不会发生重叠。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      .outer {
      height: 100px;
      }
      .left {
      float: left;
      width: 200px;
      height: 100%;
      background: lightcoral;
      }
      .right {
      overflow: auto;
      height: 100%;
      background: lightseagreen;
      }
    • 利用 flex 布局,左边元素固定宽度,右边的元素设置 flex: 1 。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      .outer {
      display: flex;
      height: 100px;
      }
      .left {
      width: 200px;
      height: 100%;
      background: lightcoral;
      }
      .right {
      flex: 1;
      height: 100%;
      background: lightseagreen;
      }
    • 利用绝对定位,父级元素设为相对定位。左边元素 absolute 定位,宽度固定。右边元素的 margin-left 的值设为左边元素的宽度值。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      .outer {
      position: relative;
      height: 100px;
      }
      .left {
      position: absolute;
      width: 200px;
      height: 100%;
      background: lightcoral;
      }
      .right {
      margin-left: 200px;
      height: 100%;
      background: lightseagreen;
      }
    • 利用绝对定位,父级元素设为相对定位。左边元素宽度固定,右边元素 absolute 定位, left 为宽度大小,其余方向定位为 0 。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      .outer {
      position: relative;
      height: 100px;
      }
      .left {
      width: 200px;
      height: 100%;
      background: lightcoral;
      }
      .right {
      position: absolute;
      left: 200px;
      top: 0;
      right: 0;
      bottom: 0;
      height: 100%;
      background: lightseagreen;
      }
  6. 实现圣杯布局和双飞翼布局(经典三分栏布局)

    • 圣杯布局:
      HTML:

      1
      2
      3
      4
      5
      <div id="container" class="clearfix">
      <p class="center">我是中间</p>
      <p class="left">我是左边</p>
      <p class="right">我是右边</p>
      </div>

      CSS:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      #container {
      padding-left: 200px;
      padding-right: 150px;
      overflow: auto;
      }
      #container p {
      float: left;
      }
      .center {
      width: 100%;
      background-color: lightcoral;
      }
      .left {
      width: 200px;
      position: relative;
      left: -200px;
      margin-left: -100%;
      background-color: blue;
      }
      .right {
      width: 150px;
      margin-right: -150px;
      background-color: lightgreen;
      }
      .clearfix:after {
      content: "";
      display: table;
      clear: both;
      }
    • 双飞翼布局:
      html:

      1
      2
      3
      4
      5
      <div id="main" class="float">
      <div id="main-wrap">main</div>
      </div>
      <div id="left" class="float">left</div>
      <div id="right" class="float">right</div>

      css:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      .float {
      float: left;
      }
      #main {
      width: 100%;
      height: 200px;
      background-color: lightpink;
      }
      #main-wrap {
      margin: 0 190px 0 190px;
      }
      #left {
      width: 190px;
      height: 200px;
      background-color: lightsalmon;
      margin-left: -100%;
      }
      #right {
      width: 190px;
      height: 200px;
      background-color: lightskyblue;
      margin-left: -190px;
      }

      tips: 上述代码中margin-left: -100% 相对的是父元素的 content 宽度,即不包含 paddig 、 border 的宽度。

      两种布局在使用的时候注意:
      - 使用 float 布局。
      - 两侧使用 margin 负值,以便和中间内容横向重叠。
      - 防止中间内容被两侧覆盖,圣杯布局用 padding ,双飞翼布局用 margin 。

  7. 多种实现方式实现水平居中

    • 利用绝对定位,设置 left: 50% 和 top: 50% 现将子元素左上角移到父元素中心位置,然后再通过 translate 来调整子元素的中心点到父元素的中心。该方法可以不定宽高。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      .father {
      position: relative;
      }
      .son {
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      }
    • 利用绝对定位,子元素所有方向都为 0 ,将 margin 设置为 auto ,由于宽高固定,对应方向实现平分,该方法必须盒子有宽高。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      .father {
      position: relative;
      }
      .son {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0px;
      margin: auto;
      height: 100px;
      width: 100px;
      }
    • 利用绝对定位,设置 left: 50% 和 top: 50% 现将子元素左上角移到父元素中心位置,然后再通过 margin-left 和 margin-top 以子元素自己的一半宽高进行负值赋值。该方法必须定宽高。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      .father {
      position: relative;
      }
      .son {
      position: absolute;
      left: 50%;
      top: 50%;
      width: 200px;
      height: 200px;
      margin-left: -100px;
      margin-top: -100px;
      }
    • 利用 flex ,最经典最方便的一种了,不用解释,定不定宽高无所谓的。
      1
      2
      3
      4
      5
      .father {
      display: flex;
      justify-content: center;
      align-items: center;
      }
      此外,也可以看看大佬这篇文章:多种方式实现水平垂直居中布局
  8. 关于flex布局的思考

    很多时候我们会用到 flex: 1 ,去查询了一下资料具体包含了以下的含义:

    • ***flex-grow: 1 ***:该属性默认为 0 ,如果存在剩余空间,元素也不放大。设置为 1 代表会放大。
    • flex-shrink: 1:该属性默认为 1 ,如果空间不足,元素缩小。
    • flex-basis: 0% : 1:该属性定义在分配多余空间之前,元素占据的主轴空间。浏览器就是根据这个属性来计算是否有多余空间的。默认值为 auto ,即项目本身大小。设置为 0%  之后,因为有 flex-grow  和 flex-shrink  的设置会自动放大或缩小。在做两栏布局时,如果右边的自适应元素 flex-basis  设为 auto  的话,其本身大小将会是 0 。​

    相关文章:flex布局教程

  9. line-height 继承性?

    • 父元素的 line-height 写了具体数值,比如 30px,则子元素 line-height 继承该值。
    • 父元素的 line-height 写了比例,比如 1.5 或 2,则子元素 line-height 也是继承该比例。
    • 父元素的 line-height 写了百分比,比如 200%,则子元素 line-height 继承的是父元素 font-size * 200% 计算出来的值。