「just-fe」前端基础指南:03-CSS基础

「just-fe」前端基础指南,收集整理了前端开发需要掌握的基础知识,方便夯实基础,查漏补缺。

03-css基础

1.盒子模型

margin, border, padding, content

  • 标准盒子:width = content-width;box-sizing: content-box
  • 怪异盒子:width = border-width + padding + content-width;box-sizing: border-box

2.flex

指定 flex 容器:

display: flex | inline-flex

  • flex-direction: row | column | row-reverse | column-reverse(顺序反转)
  • flex-wrap: nowrap | wrap | wrap-reverse(行翻转);
  • justify-content: flex-start | flex-end | center | space-between | space-around;主轴上的对齐方式
  • align-items: flex-start | flex-end | center | baseline(基线,以文字底部为主) | stretch(默认,以flex-direction:row 为例,如果未设置高度或者 auto,撑满整个容器高度);交叉轴的对齐方式
  • align-content: flex-start | flex-end | center | space-between | space-around | stretch;(定义了多根轴线的对齐方式,如果项目只有一根轴线,那么该属性将不起作用,如果 flex-wrap: wrap,则起作用)

flex 子项:

  • order: ; 排序
  • flex-basis: | auto;(定义了在分配多余空间之前,项目占据的主轴空间,浏览器根据这个属性,计算主轴是否有多余空间)
  • flex-grow: ; (默认为 0,定义项目的放大比例)
  • flex-shrink: ; (定义了项目的缩小比例)
  • flex: ; (flex-grow, flex-shrink 和 flex-basis的简写)
  • align-self: auto | flex-start | flex-end | center | baseline | stretch;(允许单个项目有与其他项目不一样的对齐方式)

flex: 0 1 auto; 放大 0,缩小 1, 自动占用主轴空间。

3.css 优先级

important > 内联 > id选择器 > 类选择器 > 标签选择器

3.1 浏览器怎样解析 css 选择器的?

从右向左解析。

4.避免 css 全局污染

  • 使用 css module (生成唯一的类名)

5.动态设置样式

  • 前缀 or react-context

6.CSS3 有哪些新特性?

  • RGBA 和透明度
  • background-image、background-size、background-repeat
  • 文字阴影 text-shadow
  • 圆角 border-radius
  • 边框图片 border-image
  • 盒子阴影 box-shadow

7.display:none 和 visibility:hidden 区别?

  • display:none 不显示元素,不占空间,会导致重绘和回流
  • visibility: hidden 隐藏元素,占空间

8.对 BFC 的理解

BFC是指一个独立的渲染区域,只有Block-level Box参与。它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干.。

定义:浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为”visiable”的块级盒子,都会为他们的内容创建新的BFC(Block Fromatting Context, 即块级格式上下文)。

BFC的触发条件:

  • 根元素,即 html 元素
  • 浮动元素(float 不为 none)、绝对定位元素(position: fixed/absolute)
  • 行内块元素(display: inline-block)、表格单元格(display: table-cell)、表格标题(display: table-caption)
  • overflow不为visible的块元素
  • 网格元素(display: grid)

应用场景:

  • 防止浮动导致父元素高度塌陷;
  • 避免外边距折叠;(margin 重叠的原因就是这个)
  • 两栏布局,防止文字环绕等

9.line-height 的理解?

行高是指一行文字的高度,具体说是两行文字间基线的距离。
多行文本垂直居中:需要设置display属性为inline-block。

10.怎么让 chrome 支持小于 12px 的文字?

  • transform: scale(0.8);

11.浏览器刷新频率?

  • 60hz,一秒刷新60次,最小间隔为 16.7ms = 1000 / 60

12.position

  • absolute
  • relative
  • fixed
  • static
  • sticky
  • initial
  • unset

13.居中

  • margin: 0 auto;
  • display: flex; justify-content: center;
  • display: table; margin: 0 auto;

14.高清问题 1px

产生原因:DPR(devicePixelRatio) 设备像素比,window.devicePixelRatio=物理像素 /CSS像素

目前主流的屏幕DPR=2 (iPhone 8),或者3 (iPhone 8 Plus)。拿2倍屏来说,设备的物理像素要实现1像素,而DPR=2,所以css 像素只能是 0.5。一般设计稿是按照750来设计的,它上面的1px是以750来参照的,而我们写css样式是以设备375为参照的,所以我们应该写的0.5px就好了啊! 试过了就知道,iOS 8+系统支持,安卓系统不支持。

解决方案:

  • border: 0.5px; ios8+ 支持,安卓不支持。
  • 边框图片; 颜色不可控,圆角模糊;
  • 伪元素;
.setOnePx{
  position: relative;
  &::after{
    position: absolute;
    content: '';
    background-color: #e5e5e5;
    display: block;
    width: 100%;
    height: 1px; /*no*/
    transform: scale(1, 0.5);
    top: 0;
    left: 0;
  }
}
.setBorderAll{
  position: relative;
  &:after{
    content:" ";
    position:absolute;
    top: 0;
    left: 0;
    width: 200%;
    height: 200%;
    transform: scale(0.5);
    transform-origin: left top;
    box-sizing: border-box;
    border: 1px solid #E5E5E5;
    border-radius: 4px;
  }
}
复制代码
  • 设置 viewport 的 scale 值。
<html>
  <head>
    <title>1px question</title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <meta name="viewport" id="WebViewport" content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">        
    <style>
      html {
        font-size: 1px;
      }
      * {
        padding: 0;
        margin: 0;
      }
      .top_b {
        border-bottom: 1px solid #E5E5E5;
      }

      .a,.b {
        box-sizing: border-box;
        margin-top: 1rem;
        padding: 1rem;                
        font-size: 1.4rem;
      }

      .a {
        width: 100%;
      }

      .b {
        background: #f5f5f5;
        width: 100%;
      }
    </style>
    <script>
      var viewport = document.querySelector("meta[name=viewport]");
      //下面是根据设备像素设置viewport
      if (window.devicePixelRatio == 1) {
        viewport.setAttribute('content', 'width=device-width,initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no');
      }
      if (window.devicePixelRatio == 2) {
        viewport.setAttribute('content', 'width=device-width,initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no');
      }
      if (window.devicePixelRatio == 3) {
        viewport.setAttribute('content', 'width=device-width,initial-scale=0.3333333333333333, maximum-scale=0.3333333333333333, minimum-scale=0.3333333333333333, user-scalable=no');
      }
      var docEl = document.documentElement;
      var fontsize = 32* (docEl.clientWidth / 750) + 'px';
      docEl.style.fontSize = fontsize;
    </script>
  </head>
  <body>
    <div class="top_b a">下面的底边宽度是虚拟1像素的</div>
    <div class="b">上面的边框宽度是虚拟1像素的</div>
  </body>
</html>
复制代码

15.重绘与回流(重排)

回流必将引起重绘,重绘不一定会引起回流。

当 Render树 中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。

  • 改变窗口大小
  • 改变字体
  • 添加、修改样式
  • 内容变化
  • 伪类
  • 设置style 等

当页面中元素样式的改变并不影响它在文档流中的位置时(例如:color、background-color、visibility等),浏览器会将新样式赋予给元素并重新绘制它,这个过程称为重绘。

16.水平垂直布局

  • lineheight
  • flex
  • grid (和 flex 一样,但是兼容性不好)

17.层叠上下文

层叠上下文是HTML元素的三维概念,这些HTML元素在一条假想的相对于面向(电脑屏幕的)视窗或者网页的用户的z轴上延伸,HTML元素依据其自身属性按照优先级顺序占用层叠上下文的空间。

触发:

  • 根元素 (HTML)
  • opacity 属性值小于 1 的元素
  • transform 属性值不为 “none”的元素
  • z-index 值不为 “auto”的 绝对/相对定位,
  • position: fixed

18.transform

  • transform 不会触发重绘和回流,元素仍然占据原来的位置
  • transform 会创建一个 GPU图层,使用 GPU渲染。

微信公众号:「皮蛋菌丶」

github:传送门

欢迎来撩~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享