笔记

177 阅读15分钟

CSS基础

CSS 基础盒模型 以及后续引申问题

  1. 基本概念:content、padding、margin
  2. 标准盒模型、IE盒模型的区别。不要漏说了IE盒模型,通过这个问题,可以筛选一部分人
  3. CSS如何设置这两种模型(即:如何设置某个盒子为其中一个模型)?如果回答了上面的第二条,还会继续追问这一条。
  4. JS如何设置、获取盒模型对应的宽和高?这一步,已经有很多人答不上来了。
  5. 实例题:根据盒模型解释边距重叠。
  6. BFC(边距重叠解决方案)或IFC。
  • 每个盒子有四个边界:内容边界 Content edge、内边距边界 Padding Edge、边框边界 Border Edge、外边框边界 Margin Edge。
  • box-sizing:content-box; 标准盒模型
  • box-sizing:border-box; 怪异盒模型
  • 标准模式下总宽度=width+margin(左右)+padding(左右)border(左右);怪异模式下总宽度=width+margin(左右)

CSS如何设置

/* 设置当前盒子为 标准盒模型(默认) */
box-sizing: content-box;

/* 设置当前盒子为 IE盒模型 */
box-sizing: border-box;

标准文档流中,竖直方向的margin不叠加,只取较大的值作为margin(水平方向的margin是可以叠加的,即水平方向没有塌陷现象)。

PS:如果不在标准流,比如盒子都浮动了,那么两个盒子之间是没有margin重叠的现象的。

margin这个属性,本质上描述的是兄弟和兄弟之间的距离; 最好不要用这个marign表达父子之间的距离。

所以,如果要表达父子之间的距离,我们一定要善于使用父亲的padding,而不是儿子的`margin。

BFC 块级格式化上下文

块级格式化上下文 浮动定位(float) 清除浮动(clear)

块级格式化上下文,是一个独立的渲染区域,让处于 BFC 内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响。

触发条件

  • 根元素
  • position: absolute/fixed
  • display: inline-block / table / table
  • float 元素 float属性值不为none
  • overflow: 不为visible,可以让属性是 hidden、auto。
  • ovevflow !== visible

规则 属于同一个 BFC 的两个相邻 Box 垂直排列 属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠 BFC 中子元素的 margin box 的左边, 与包含块 (BFC) border box的左边相接触 (子元素 absolute 除外) BFC 的区域不会与 float 的元素区域重叠 计算 BFC 的高度时,浮动子元素也参与计算 文字层不会被浮动层覆盖,环绕于周围

应用

  • 阻止margin重叠
  • 可以包含浮动元素 —— 清除内部浮动(清除浮动的原理是两个div都位于同一个 BFC 区域之中)
  • 自适应两栏布局
  • 可以阻止元素被浮动元素覆盖

BFC的应用

举例1:解决 margin 重叠 比如:针对下面这样的一个结构

<div class="father">
    <p class="son">
    </p>
</div>

上面的div结构中,如果父元素和子元素发生margin重叠,我们可以给子元素创建一个 BFC,就解决了:

<div class="father">
    <p class="son" style="overflow: hidden">
    </p>
</div>

第二条:BFC区域是一个独立的区域,不会影响外面的元素。

举例二: BFC区域不与float区域重叠

代码见github仓库

举例三: 清除浮动

有高度的盒子,才能关住浮动

如果想要清除浮动带来的影响,方法一是给父亲设置高度,然后采用隔墙法。方法二是 BFC:给父亲增加 overflow=hidden属性即可, 增加之后,效果如下:

层叠式上下文

层叠式上下文的触发条件 根层叠上下文(html)

position css3属性 flex transform opacity filter will-change webkit-overflow-scrolling

层叠等级:层叠上下文在z轴上的排序

左右居中方案

  • 行内元素: text-align: center
  • 定宽块状元素: 左右 margin 值为 auto
  • 不定宽块状元素: table布局,position + transform
.wrap {
  text-align: center
}
.center {
  display: inline;
  /* or */
  /* display: inline-block; */
}
/* 方案2 */
.center {
  width: 100px;
  margin: 0 auto;
}
/* 方案2 */
.wrap {
  position: relative;
}
.center {
  position: absulote;
  left: 50%;
  transform: translateX(-50%);
}

上下垂直居中方案

  • 定高:margin,position + margin(负值)
  • 不定高:position + transform,flex,IFC + vertical-align:middle
/* 定高方案1 */
.center {
  height: 100px;
  margin: 50px 0;   
}
/* 定高方案2 */
.center {
  height: 100px;
  position: absolute;
  top: 50%;
  margin-top: -25px;
}
/* 不定高方案1 */
.center {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}
/* 不定高方案2 */
.wrap {
  display: flex;
  align-items: center;
}
.center {
  width: 100%;
}
/* 不定高方案3 */
/* 设置 inline-block 则会在外层产生 IFC,高度设为 100% 撑开 wrap 的高度 */
.wrap::before {
  content: '';
  height: 100%;
  display: inline-block;
  vertical-align: middle;
}
.wrap {
  text-align: center;
}
.center {
  display: inline-block;  
  vertical-align: middle;
}

选择器权重计算方式

!important > 内联样式 = 外联样式 > ID选择器 > 类选择器 = 伪类选择器 = 属性选择器 > 元素选择器 = 伪元素选择器 > 通配选择器 = 后代选择器 = 兄弟选择器

清除浮动

  1. 给父元素添加 overflow:hidden 或者 auto 样式,触发BFC
  2. 使用伪元素,也是在元素末尾添加一个点并带有 clear: both 属性的元素实现的。
<div class="container clearfix">
    <div class="left"></div>
    <div class="right"></div>
</div>
.clearfix{
    zoom: 1; /*IE6*/
}
.clearfix:after{
    content: ".";
    height: 0;
    clear: both;
    display: block;
    visibility: hidden;
}

左边定宽右边自适应方案

有四种布局方法 DOM树的解构

<div class="box">
  <div class="box-left"></div>
  <div class="box-right"></div>
</div>
  1. 使用float+margin 来实现
.box {
 height: 200px;
}

.box > div {1.
  height: 100%;
}

.box-left {
  width: 200px;
  float: left;
  background-color: blue;
}

.box-right {
  margin-left: 200px;
  background-color: red;
}
  1. 利用calc计算宽度
.box {
 height: 200px;
}

.box > div {
  height: 100%;
}

.box-left {
  width: 200px;
  float: left;
  background-color: blue;
}

.box-right {
  width: calc(100% - 200px);
  float: right;
  background-color: red;
}
  1. 利用float+overflow实现
.box {
 height: 200px;
}

.box > div {
  height: 100%;
}

.box-left {
  width: 200px;
  float: left;
  background-color: blue;
}

.box-right {
  overflow: hidden;
  background-color: red;
}
  1. 使用flex实现
.box {
  height: 200px;
  display: flex;
}

.box > div {
  height: 100%;
}

.box-left {
  width: 200px;
  background-color: blue;
}

.box-right {
  flex: 1; // 设置flex-grow属性为1,默认为0
  overflow: hidden;
  background-color: red;
}

两边定宽,中间自适应

方法: 浮动,绝对定位 flexbox. grid

同时也需要注意HTML5的语义化表达 方法1 方法2源码

  1. 方法一 浮动方式

左侧设置左浮动,右侧设置右浮动即可,中间会自动地自适应。中间不用设置宽度

  1. 方法二 绝对定位

左侧设置为绝对定位, left:0px。右侧设置为绝对定位, right:0px。中间设置为绝对定位,left和right 都为300px,即可。中间的宽度会自适应。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        html * {
            padding: 0px;
            margin: 0px;
        }

        .layout {
            margin-bottom: 150px;
        }


        .layout article div { /*注意,这里是设置每个小块儿的高度为100px,而不是设置大容器的高度。大容器的高度要符合响应式*/
            height: 100px;
        }

        /* 方法一 start */

        .layout.float .left {
            float: left;
            width: 300px;
            background: red;
        }

        .layout.float .right {
            float: right;
            width: 300px;
            background: blue;
        }

        .layout.float .center {
            background: green;

        }

        /* 方法一 end */


        /* 方法二 start */
        .layout.absolute .left-center-right {
            position: relative;
        }

        .layout.absolute .left {
            position: absolute;
            left: 0;
            width: 300px;
            background: red;
        }

        /* 【重要】中间的区域,左侧定位300px,右侧定位为300px,即可完成。宽度会自使用 */
        .layout.absolute .center {
            position: absolute;
            left: 300px;
            right: 300px;
            background: green;
        }

        .layout.absolute .right {
            position: absolute;
            right: 0;
            width: 300px;
            background: blue;
        }


        /* 方法二 end */
    </style>
</head>

<body>

    <!-- 方法一:浮动 start -->
    <!-- 输入 section.layout.float,即可生成  -->
    <section class="layout float">
        <!-- 用  article 标签包裹左、中、右三个部分 -->
        <article class="left-right-center">
            <!-- 输入 div.left+div.right+div.center,即可生成 -->
            <div class="left">
                我是 left
            </div>
            <div class="right">
                我是 right
            </div>
            <div class="center">
                浮动解决方案
                我是 center
            </div>

        </article>

    </section>
    <!-- 方法一:浮动 end -->

    <section class="layout absolute">
        <article class="left-center-right">
            <div class="left">
                我是 left
            </div>
            <div class="right">
                我是 right
            </div>
            <div class="center">
                <h1>绝对定位解决方案</h1>
                我是 center
            </div>
        </article>
    </section>
</body>
</html>

  1. 使用flexBox 布局

将左中右所在的容器设置为display: flex,设置两侧的宽度后,然后让中间的flex = 1,即可。

  1. 使用网格布局
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        html * {
            padding: 0;
            margin: 0;
        }

        /* 重要:设置容器为网格布局,宽度为100% */
        .layout.grid .left-center-right {
            display: grid;
            width: 100%;
            grid-template-rows: 100px;
            grid-template-columns: 300px auto 300px;  /* 重要:设置网格为三列,并设置每列的宽度。即可。*/

        }

        .layout.grid .left {
            background: red;
        }

        .layout.grid .center {
            background: green;
        }

        .layout.grid .right {
            background: blue;
        }
    </style>

</head>

总结:

  • 语义化掌握到位:每个区域用section、article代表容器、div代表块儿。如果通篇都用。div,那就是语义化没掌握好。
  • 思维灵活且积极上进。题目中可以通过网格布局来体现。 代码书写规范。注意命名。上面的代码中,没有一行代码是多的。

CSS页面布局方式

aa

Position

关键字: static , absolute , relative , fixed ,sticky

auto自适应。受父级css影响,并自适应。全部占满可用区域

static

  • top , bottom , left, right, z-index 无效 正常的布局方式 (上下文默认的方式)

relative

  • 首先元素停留在原始的默认位置,而后在不改变原始布局的情况下调整位置(top,right.....),同时保留原始位置,(所以可能会在原始的样式上留白) 对于table-row table-group 等无效

absolute

  • 会被移出正常的文档流,相对于最近的非static的祖先元素进行偏移(没有的话就是body,则相当于初始的ICB(inital container block, 初始包含块)),不会保留原始位置 可以设置外边距同时不会与其他位置合并

fixed

  • 移出正常的文档流,不保留位置。相对于页面的视口(viewport)为固定定位.滚动时不变,会创建新的层叠式上下文。
  • 当元素祖先的 transform, perspective 或 filter 属性非 none 时,容器由视口改为该祖先。

sticky

  • 正常的文档流 , 相对于最近的可滚动的祖先(nearing-scrolling-ancestor)以及contain-block(块级作用域).偏移值不影响其他元素的位置。
  • 创建新的层叠式上下文,依附于最近的拥有滚动机制的祖先身上。(overflow:hidden,auto,scroll,overlay).即使该祖先不是真实可滚动的
  • 跨越相对的阈值前为相对定位,跨越后为绝对定位

层叠式上下文 z-index 的计算方法

HTML 像是在z轴排列的样式,而层叠式上下文就像是对于HTML的一种三维构想

  • 核心意思就是 index 为同一级别的比较。子元素就像版本号一样向后面叠加

子元素的 z-index都是相当于兄弟元素来说的。不影响父元素

  • 层叠上下文可以包含层叠上下文,,从而共同构成层级
  • 独立于兄弟元素,只考虑子元素
  • 每个层叠上下文都是自包含的:当一个元素的内容发生层叠后,该元素将被作为整体在父级层叠上下文中按顺序进行层叠。
Root
 z-index2
 z-index4
    z-index1,在一个 z-index4 的元素内层叠,所以渲染次序为 4.1
    z-index3,在一个 z-index4 的元素内层叠,所以渲染次序为 4.3
    z-index6,在一个 z-index4 的元素内层叠,所以渲染次序为 4.6
 z-index5

外边距折叠

margin-top 和 margin-bottom 折叠为单边距,其大小为单个边距的最大值,称为边距折叠

有设定float以及position: absolute 的不会产生折叠行为 也就是BFC

产生的条件

  • 同一相邻元素之间 就是兄弟元素之间
  • 没有内容将父元素与后代元素分隔开 也称之为margin击穿
    • 所有毗邻的两个或更多盒元素的margin将会合并为一个margin共享之。毗邻的定义为:同级或者嵌套的盒元素,并且它们之间没有非空内容、Padding或Border分隔。
  • 空的块级元素

相关解决办法 解决办法:

  1. 父级或子元素使用浮动或者绝对定位absolute

浮动或绝对定位不参与margin的折叠

  1. 父级overflow:hidden;

  2. 父级设置padding(破坏非空白的折叠条件)

  3. 父级设置border

Why is float

一开始我并不了解浮动的意义,我不明白很多语句的作用是为了清除浮动。直接不写不就行了。 float的用处

  • 例如头像问题,左边图片,右边文字。
  • 如果对图片进行绝对定位的话。在改变图像的大小之后。可能会覆盖掉文字 清除float
  • clear both left right none inherit

float所引申出来的问题 --- 塌陷 float 是如何影响他们的父元素的

  • 父元素只包含浮动元素,那么它的高度会塌缩为0 清楚浮动的技术
  • 空div
  • overflow

省略写法 四个值 上右下左 三个值上.左右.下 两个值上下.左右

网页中,元素有三种布局类型

  1. 流动模型 (Flow)
  2. 浮动模型 (Float)
  3. 层模型 (Layer)

流动(Flow)是默认的网页布局模式。也就是说网页在默认状态下的 HTML 网页元素都是根据流动模型来分布网页内容的。 流动模型

  • 块状元素都会在所处的包含元素内自上而下按顺序垂直延伸分布,因为在默认状态下,块状元素的宽度都为100%。实际上,块状元素都会以行的形式占据位置。
  • 在流动模型下,内联元素都会在所处的包含元素内从左到右水平分布显示。(内联元素可不像块状元素这么霸道独占一行)
  • 右侧代码编辑器中内联元素标签a、span、em、strong都是内联元素。

浮动模型

  • 任何元素在默认的情况下都不是浮动的。float我们可以由此定义

层模型

position: static relative absolute fixed

relative 和 absolute的联合使用

弹性盒模型flex

布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性

三、容器的属性

flex-direction flex-wrap flex-flow justify-content align-items align-content

flex-direction

  • 决定主轴的方向,也就是项目排列的方向
  • 默认为row 横向排列

flex-wrap属性

  • 怎么换行
  • nowrap 默认不换行

justify-content属性

  • 决定了项目在主轴上的对齐方式
  • flex-start 默认 左对齐

align-items属性

  • 决定了项目在交叉轴上的对齐方式
  • 默认值为stretch

image

align-content属性

  • 决定了项目在多跟轴线上的对齐方式

image

stretch 默认值

四、项目的属性

order flex-grow flex-shrink flex-basis flex align-self

order 属性定义的是项目的排列顺序

flex-grow

  • flex-grow 定义的是项目放大的比例
  • 默认为0

image

flex-shrink属性

  • flex-shrink属性 定义的是项目的缩小比例 默认为1 空间不足的话。项目将缩小
  • 如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。

flex-basis属性

  • flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小

flex属性

  • flex-grow flex-shrink flex-basis的简写 默认值为0 1 auto

flex: 1 不是 1,1,auto 如果是auto的话,那么盒子会按照内容进行放大缩小 flex: 1 === flex: 1 1 + 0% 而设计成具体数字的时候,则会按照设计的长度等比例的放大缩小

align-self

align-items 的对项目的单独设置

grid 布局

是将网页划分成网格

grid-template-columns 属性,
grid-template-rows 属性

可以使用repeat 属性 repeat(3, 100px 50px 200px)

auto-fill 关键字 每行自动填充关键字

fr 按照比例进行划分

grid-row-gap 属性,grid-column-gap 属性,grid-gap 属性

设置行间距与设置列间距

grid-template-areas
justify-items 属性,

align-items 属性, place-items

设置单元格内容的水平位置

参数设置 : start,end,center,stretch

justify-content 属性,align-content 属性,place-content 属性

start | end | center | stretch | space-around | space-between | space-evenly

grid-column-start 属性,grid-column-end 属性,grid-row-start 属性,grid-row-end 属性

设置项目在整个容器的位置

grid-row grid-colume

  • &-start &-end
grid-area
  • 设置元素位于容器的位置
  • 还可以当作grid-row-start、grid-column-start、grid-row-end、grid-column-end的合并简写形式
  • grid-area: 1 / 1 / 3 / 3

display

可以设置的是元素的内部和外部显示类型

水平居中的方法

脱离文档流元素的居中

  1. magin: auto
  2. margin: 为负值 另外设置top left为宽高的一半 已知宽高
  3. 宽高不定实现盒子的水平垂直居中

未脱离文档流元素的居中

  1. text-align: center vertical-align: center

弹性盒子方法

flex align-items: center justify-content: center

文档流

我经常可以看到什么脱离文档流。一直不太懂

Q: 脱离文档流就不占据空间了吗? A: 可以这么说。更准确地一点说,是一个元素脱离文档流(out of normal flow)之后,其他的元素在定位的时候会当做没看见它,两者位置重叠都是可以的。

Q: 脱离文档流是不是指该元素从dom树中脱离? A: 不是,用浏览器的审查元素就可以看到脱离文档流的元素(例如被float了)依然会出现在dom树里,下面的截图里也可以看到。

另外需要注意的是

脱离文档流,也就是将元素从普通的布局排版中拿走,其他盒子在定位的时候,会当做脱离文档流的元素不存在而进行定位。需要注意的是,使用float脱离文档流时,其他盒子会无视这个元素,但其他盒子内的文本依然会为这个元素让出位置,环绕在周围。而对于使用absolute positioning脱离文档流的元素,其他盒子与其他盒子内的文本都会无视它。

CSS动画和过渡

自己到面试指南的进阶里面看吧

关键词:animation / keyframes

自己到面试指南的进阶里面看吧

CSS3新特性

自己到面试指南的进阶里面看吧

列举一些CSS中可继承和不可继承的元素

绝大多数都是不可继承的