itv_css

365 阅读11分钟

rem em vw 区别

css单位px,rem,em,vw,vh的区别

实现一个长宽比4:3的元素

  // w3c提案,尚在草案阶段
  .wrapper {
    width: 40vw;
    height: auto;
    aspect-ratio: 4 / 3;
    background: orange;
  }


 // 使用垂直方向上padding控制, padding相对父元素定位
 // 因为设置了height:0,  实际的内容需求需要做绝对定位处理
  .wrapper {
    width: 40vw;
  }

  .intrinsic-aspect-ratio-container {
    width:100%;
    height: 0;
    position: relative;
    padding-top: 75%;
    background-color: orange;
  }

  #content {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
  }
 
  <div class="wrapper">
    <div class="intrinsic-aspect-ratio-container">
        <div id="content">content</div>
    </div>
  </div>

flex

flex-basis

flex-basis: 项目占据主轴的宽度, 在分配多余空间之前会判断这个属性大小, 默认值auto

  • auto: 即项目本身的大小,取决于item自身的宽度或高度
  • 0%: 不暂居主轴宽度,item的宽度和高度无意义 当主轴为水平方向的时候,当设置了 flex-basis,项目的宽度设置值会失效,flex-basis 需要跟 flex-grow 和 flex-shrink 配合使用才能发挥效果。
flex-grow

flex-grow: 用于瓜分”父容器“剩余空间 。定义项目的放大比例, 默认值0,即存在剩余空间,也不会放大

  • 如果所有项目的 flex-grow 属性都为 1,则它们将等分剩余空间。(如果有的话)
  • 如果一个项目的 flex-grow 属性为 2,其他项目都为 1,则前者占据的剩余空间将比其他项多一倍。
flex-shrink

定义了项目的缩小比例, 默认值1。 即项目空间不足,item将弱小, 负值对该属性无效。
flex-shrink: 计算元素宽度(包含标准盒模型、怪异盒模型)总和超出父容器部分。
然后按照 盒宽度 - (目标元素width) * shrink / (目标元素width * shrink + 其他元素 * shrink + 其他元素二 * shrink + ....)) * 超出部分宽度 , 计算缩放后的实际宽度

flex: 1 代表什么含义
    p {
        flex: 1
    }
    
    // 等于下面
    p {
        flex-grow: 1;
        flex-shrink: 1;
        flex-basis: auto;
    }
示例

{ flex: flex-grow | flex-shrink | flex-basis }

   #container {
       display: flex;
       width: 1000px;
   }

   /* 瓜分父元素剩余空间 */
   /* 实际宽度  300 + (1000 - 500) * 2 / 3 = 633.33 */
   .left {
       width: 300px;
       height: 200px;
       flex-grow: 2;
   }

   /* 实际宽度  200 + (1000 - 500) * 1 / 3 = 366.66 */
   .right {
       width: 200px;
       height: 200px;
       flex-grow: 1;
   }


   /* flex-shrink 测评 */
   /* 
       分配比例为: 超出宽度 400 + 300 = 700 - 500 = 200
       left和right 分配比例为 400*2:300*1= 8/3
       left = 400 - 200*8/11 = 254.54 
       right = 300 - 200*3/11 = 245.45

       计算缩放比例:用width,要考虑到盒模型,标准和模型和怪异盒模型
       超出宽度 = 盒子宽度+padding+border - 外部容器宽度
   */
   #container {
       display: flex;
       width: 500px;
   }

   .left {
       width: 400px;
       height: 200px;
       flex-shrink: 2;
   }

   .right {
       width: 300px;
       height: 200px;
       flex-shrink: 1;
   }

css 百分比属性有哪些

line-height: 相对于自身fontSize
font-size width height 相对于父元素
padding margin 相对于父元素宽度
top/left/right/bottom 相对于父元素宽度/高度
transform:translate(百分比,百分比) 相对于自身宽度/高度

移动端的 1px 是基于什么计算的

重绘&&重排

页面在生成过程中至少会渲染一次,并且在用户访问过程中,可能还会不断渲染
重排一定会重绘,重绘不一定会重排

页面生成过程
  • 从服务器拉取html、css、js资源
  • html被html解析器解析成DOM树
  • css被css解析器解析cssom树
  • 结合DOM树和css树生成渲染树(render tree)
  • 生成布局flow,将渲染树的所有节点进行平面合成<耗时, 重绘少了这一步><Layout布局阶段>
  • 将平面合成后的节点,绘制在屏幕上<耗时>
重排:简称回流

当DOM变化,例如删除元素、添加元素, 影响了元素的几何位置、浏览器需要重新生成元素几何位置,将其放置在正确位置的过程叫做重排
触发条件: 重新生成布局、重新排列元素

  • 窗口大小改变
  • 添加、删除元素
  • 改变元素位置、改变元素尺寸
  • 内容变化(例如:用户在input中输入内容)
重绘

当元素外观发生改变,未改变布局(几何位置),重新把元素外观绘制的过程,叫做重绘
重绘后,dom树未改变,cssomtre改变,跳过布局阶段,直接绘制

  • 元素的某些外观改变,style_change

script的async、defer区别

正常情况下,script没有任何引入属性情况下,有以下特性, 立即加载,解析,执行脚本文件

  • js脚本分为加载(Fetch)、解析(Execution)、执行(Execution)
  • js脚本的加载。解析、执行会阻塞DOM树渲染,因此一般会放置在尾部

defer 和 async有下面异同

  • 都是属于异步加载脚本
  • defer加载完成后,到DOM解析完成后才会执行,但是会发生在documentContentLoaded之前
async

对脚本的请求是异步,不会阻塞html解析,一旦网络请求结果出来了,hmtl就会暂停解析,让js解析并执行相关代码

如果在async 请求发出来之后,html解析已经完成,那么对async不产生任何影响

defer

脚本异步加载,获取脚本的请求的异步的,不会阻塞浏览器解析hmtl,一旦请求返回结果后,如果html解析还未完成,浏览器并不会解析并执行该返回结果脚本js代码,而是等到浏览器完全把hmtl解析完成在执行js代码

如果存在多个多个defer标签,会按照引入顺序解析执行,这样并不会影响相互执行U依赖关系

使用场景
  • 如果脚本是模块化,不存在依赖关系,那么请使用async
  • 如果脚本依赖另一个脚本,那么请使用defer
  • 如果脚本是很小,并且异步脚本依赖他,那么请使用一个没有任何属性的内联脚本

什么是BFC

BFC: 块级格式化上下文,BFC决定了元素如何对其内容进行定位,以及与其他元素关系和相互作用,简单来说BFC就是一个密闭空间,空间内的元素的不会影响到空间外元素

前端精选文摘:BFC 神奇背后的原理

形成BFC条件
  • float 不为none
  • overflow 不为visible
  • position不为static 和 relative
  • display: 为flex, table-cell, inline-block等
使用BFC场景
  • 清除浮动
  • 防止margin塌陷
  • 自适应两栏布局
    • 扩展: 自适应三栏布局

          <style>
            /********* flex布局 *********/
            #root {
              height: 100%;
              display: flex;
            }
      
            #left {
              width: 200px;
              background: green;
            }
      
            #right {
              width: 300px;
              background: blue;
            }
      
            #main {
              background: red;
              flex-grow: 1;  // flex-grow 默认是0,不瓜分剩余空间
            }
            
          /****** 左右两边position: absolute, 内容区设置margin:left/right *******/
            body {
              padding: 0;
              margin: 0;
            }
            .left {
                background-color: gray;
                width: 100px;
                height: 200px;
                position: absolute;
                left: 0;
                top: 0;
            }
            .right {
                float: right;
                background-color: gray;
                width: 200px;
                height: 200px;
                position:  absolute;
                right: 0;
                top: 0;
            }
            .main {
                height: 200px;
                background-color: lightgray;
                margin-left: 100px;
                margin-right: 200px;
            }
        
            
          </style>
            <body>
              <div id="root">
                <div class="left">left</div>
                <div class="main">content</div>
                <div class="right">right</div>
              </div>
            </body>
      
      
      <head>
        <title>Document</title>
        <style>
          body {
              width: 100%;
              position: relative;
              overflow: hidden;
          }
      
          .left {
              width: 100px;
              height: 150px;
              float: left;
              background: green;
          }
      
          .main {
              height: 200px;
              background: black;
              margin-left: 100px;
              margin-right: 200px;
          }
          
          // 或者这样行为BFC
          .main {
              height: 200px;
              background: black;
              overflow: hidden;
          }
      
          .right {
              width: 200px;
              height: 150px;
              float: right;
              background: red;
          }
        </style>
      </head>
      <body>
          // 浮动前提都是元素靠前
          <div class="left">left</div>
          <div class="right"></div>
          <div class="main">zzz</div>
      </body>
      
BFC特性
  • BFC内部盒子垂直的从顶部一个一个的排序
  • BFC的区域不会与浮动的盒子产生交集,而是紧贴浮动边缘
  • BFC是一个独立容器,容器内部元素不会影响到容器外部元素
  • 计算BFC的高度时,也会检测浮动盒子的高度,它是一个独立的渲染区域
  • 盒子垂直方向的距离由margin决定,属于同一个BFC的两个盒子的margin会发生重叠

实现吸底效果,底部footer在内容没有铺满可视区,始终固定在顶部,当内容超出可视区高度,跟随内容后面展示

    html,
    body {
        height: 100%;
        position: relative;
    }

    .wrapper {
        position: relative;
        min-height: 100%;
    }

    .header {
        height: 100px;
        background-color: red;
    }

    .content {
        padding-bottom: 80px;
        background: blue;
        height: 400px;
    }

    .footer {
        width: 100%;
        height: 80px;
        left: 0;
        right: 0;
        bottom: 0;
        background: green;
        position: absolute;
    }


    /* 方法二, 利用css计算 calc  */
    html,
    body {
        height: 100%;
        position: relative;
    }

    .wrapper {
        position: relative;
        /* 这步骤关键 设置高度100%, 不能是min-height */
        height: 100%;
    }

    .header {
        height: 100px;
        background-color: red;
    }

    .content {
        background: blue;
        /* 计算父级高度, 减去header&&footer高度;注意加px */
        min-height: calc(100% - 180px);
    }

    .footer {
        height: 80px;
        background: green;
    }
    

解释一下CSS的盒子模型?

标准的盒模型:border--sizing: content-box
盒子总宽度/高度=width/height(内容区宽度/高度)+ 2 * padding + 2 * border
IE盒模型(怪异盒模型):border-sizing: border-box
盒子总宽度/高度 = width/height(内容区高度/宽度 + 2 * padding + 2 * border)

请你说说CSS选择器的类型有哪些,并举几个例子说明其用法?

首先说主要都有哪些选择器

  • 标签选择器(如:body,div,p,ul,li)
  • 类选择器(如:class="head",class="head_logo")
  • ID选择器(如:id="name",id="name_txt")
  • 组合选择器(如:.head .head_logo,注意两选择器用空格键分开)
  • 继承选择器(如:div p,注意两选择器用空格键分开)
  • 伪类选择器(如:就是链接样式,a元素的伪类,4种不同的状态:link、visited、active、hover。 :after,:before)

要动态改变层中内容可以使用的方法 && innerHtml/ innerText区别

  • innerHmtl: 当前标签内全部内容,包括html标签
  • innerText: 当前标签内除非html标签内容
    const wrapper = document.getElementById('wrapper');
    wrapper.innerHTML = `<p style="color:red">111111</p>`; // div内容  111 且颜色是红色
    wrapper.innerText = `<p style="color:red">111111</p>`; // div内容  <p style="color:red">111111</p>

请列举几种清除浮动的方法(至少两种)?

  • 父级div定义 height 
  • 结尾处加空div标签 clear:both 
  • 父级div定义 伪类:after {content:” ”,height:0; display:block; overflow:hidden; cleat:both;}
  • overflow:hidden;
你有哪些性能优化的方法?
  • 使用CDN CDN优缺点
  • 可缓存的AJAX 
  • 减少HTTP请求次数 
  • 把JS放到底部
  • 把CSS放到顶部
  • 为文件头指定Expires
  • 路由懒加载
  • 压缩相关图片等资源, esbuild,min-css-extract-plugins
  • 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
  • 优化首屏加载资源,骨架屏(从webpack分包)

如何解决多个元素重叠问题?

使用z-index属性可以设置元素的层叠顺序 

position的值relative和absolute的定位原点是?

  • relative(相对定位):定位原点是元素本身所在位置<left:0, right:0>; 
  • absolute(绝对定位):定位原点是离自己这一级元素最近的一级position设置为absolute或者relative的父元素的左上角为原点的

CSS3有哪些新特性

  • 阴影和反射 box-shadow
  • 文字特效text-shadow
  • 圆角 border-radius
  • 旋转transform
  • 过渡 transition
  • 动画 animation
  • 颜色 rgba
  • 栅格布局 gird
  • 弹性布局 flex

display:inline-block 什么时候不会显示间隙?(携程)

  • 元素使用margin负值
  • 父级使用 font-size:0

垂直居中的几种方式

  • flex 布局
    div {
        display: flex;
        align-items: center      
        justify-content: center;
    }
  • 百分比集合transform
    div {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }

  • margin移动: 必须确定了元素的宽高度(宽高度的一半)
    #t1 {
        position: absolute;
        top: 50%;
        left: 50%;
        width: 100px;
        height: 200px;
        margin-left: -50px;
        margin-top: -100px;
    }
  • 绝对定位和0
    #t1 {
        position: absolute;
        width: 20%;
        height: 32%;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        margin: auto;
    }

float 和position一起用是什么效果

float: 是元素脱离文档流,浮动在文档流上, 可以用padding和margin进行定位 postion: 元素相对自身或父元素定位,<relative: 相对自身左上角(0, 0), static: 默认属性, absolted: 相对父元素设置relative(0, 0)位置> 2者同时使用,并不冲突, 当设置 absolute和fixed 会是元素脱离文档流, 可以使用top,left定位

经实战发现,无论postion和float谁前谁后,都是postion在起到作用

  • 当postion设置absolute、fixed. 元素已脱离文档流,float不起到作用
  • 当position设置 relative/static, 元素扔处于文档流中, float将起到作用

实现一个垂直居中的div,左右边距10px,高度是宽度的一半,里面内容也是垂直居中

    .container {
        width: calc(100vw - 20px);
        height: calc(50vw - 10px);

        display: flex;
        align-items: center;
        justify-content: center;
        border: 1px solid red;

        position: absolute;
        top: 50%;
        transform: translateY(-50%);
        
        /* 或者
        left: 50%;
        transform: translate(-50%, -50%); */
    }

scrollWidth/scrollHeight/offsetWidth/offsetHeight/clientWidht/clientHeight

clientWidth / clientHeight

该属性指的是元素可视区内宽度和高度,即padding+width,如果元素没有滚动条,那么就是元素设置的宽度和高度,如果出来滚动条 那么滚动条会遮盖元素宽高,该属性就是元素宽高减去滚动条的宽高

offsetWidth / offsetHeigt

该属性和其内部的内容是否超出元素大小无关,只和本来设定的border+padding、width有关,包含滚动条的宽/高度

scrollWidth / scrollHeight

这两个属性指的是当元素内容超出其宽度和高度的时候,元素内部内容的实际宽度和高度,包含padding, 总宽度/高度 = width/height+padding
当元素内容没有超出设置的宽度和高度时候, clientWidth/clientHieght ==== scrollWidth/scrollHeight

scrollTop / scrollLeft

设置向上向下滚动距离

offsetTop / offsetLeft

距离上一层元素 postion设置不为static距离, 如果上一层没有,则向上上层获取,直接body元素