css-学习梳理

373 阅读13分钟

★ CSS哪些属性可以被继承

inherit initial

css 的继承很简单,分为默认继承的和默认不继承的,

默认继承的属性:取父元素的同属性的计算值,可以通过设置 inherit 实现继承。

默认不继承的属性:取属性的初始值,可以通过设置 initial 实现继承。

默认继承的 ("Inherited: Yes") 的属性:

  • 所有元素默认继承:visibility、cursor
  • 文本属性默认继承:letter-spacing、word-spacing、white-space、line-height、color、font、 font-family、font-size、font-style、font-variant、font-weight、text-indent、text-align、text-shadow、text-transform、direction
  • 列表元素默认继承:list-style、list-style-type、list-style-position、list-style-image
  • 表格元素默认继承:border-collapse

默认不继承的("Inherited: No") 的属性:

  • 所有元素默认不继承:all、display、overflow、contain
  • 文本属性默认不继承:vertical-align、text-decoration、text-overflow
  • 盒子属性默认不继承:width、height、padding、margin、border、min-width、min-height、max-width、max-height
  • 背景属性默认不继承:background、background-color、background-image、background-repeat、background-position、background-attachment
  • 定位属性默认不继承:float、clear、position、top、right、bottom、left、z-index
  • 内容属性默认不继承:content、counter-reset、counter-increment
  • 轮廓属性默认不继承:outline-style、outline-width、outline-color、outline
  • 页面属性默认不继承:size、page-break-before、page-break-after
  • 声音属性默认不继承:pause-before、pause-after、pause、cue-before、cue-after、cue、play-during

可以看到涉及到文本相关的属性,绝大部分都是默认继承的,毕竟 css 设计之初就是为了更好的在网页上呈现文字。

四个通用属性值

  • inherit:会使子元素属性和父元素相同。“开启继承”。

  • initial:将属性的初始值,就是重置为css的默认值(不是浏览器定义的样式表中的样式)。

  • unset:将属性重置为自然值,也就是如果属性是自然继承的那么就是 inherit ,否则和 initial 一样。

  • revert:表示使用样式表中定义的元素属性的默认值。若用户定义样式表中显式设置,则按此设置;否则,按照浏览器定义样式表中的样式设置;否则,等价于 unset 。(属性值 revert 目前最新版的主流浏览器支持)

all

css3 增加了 all 属性,其值可以是上面四个之一,表示重置元素所有属性的值重置为其初始值,或继承值。

当笔者将 div元素设置了 all: unset 之后,奇怪的事情发生了,此时 divdisplay 计算值竟然变成了 inline~~ (demo)后来查询 MDN 才发现原来 display 的初始值竟然是 inline ,在 chrome 浏览器是可以看到,div/p/h2 等标签的初始值是被浏览器厂商的用户代理样式重置了的。

user agent stylesheet是浏览器默认样式表,是浏览器默认样式。

 let div = document.getElementsByTagName('div')[0]
 let display =  getComputedStyle(div).display;
 console.log('display=',display) // display=inline

image.png


★ 如何实现一个元素的水平垂直居中

1. 使用 position 与 transform 结合【css2】

position:relatvive 

position: absolute;
top:50%;
left: 50%;
transform: translate(-50%, -50%);

2. 使用 position 定位和 偏移 属性【css2】

position:relatvive 

position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
margin: auto; 

3. table-cell【css2】

display: table-cell; 
vertical-align: middle; // 垂直水平居中

margin: 0 auto; // 水平方向居中

4. flex布局【css3】

display: flex;
justify-content: center;
align-items: center;

5. grid布局【css3】

display: grid;
justify-content: center;
align-content: center;

★ grid

juejin.cn/post/704407…

1:概述

2:基本概念

3:容器属性

4:项目属性


★ flex

juejin.cn/post/704435…

1:概念

2:父元素容器属性

3:项目属性


★ grid和flex区别

1. flex 中align-content和align-items和align-self有什么区别

align-items【父元素属性】 交叉轴上如何对齐。 align排列 使....对齐,所以是交叉轴上对齐

align-content【父元素属性】 属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

align-self【子元素属性】 允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性的对齐方式。

2. flex 中justify-content和justify-items有什么区别

flex 只有justify-content 没有justify-items

3. grid 中align-items和align-content有什么区别

align-items 是单元格在垂直位置 align-content 是 内容在容器也是单元格的垂直位置

4. grid 中justify-items和justify-content有什么区别?

justify-items 是 单元格在水平位置【单元格水平方向的布局】

justify-content 是内容在容器里面的水平位置【内容在单元格里面的布局,内容跟单元格是有间隙的,这个里面的布局】

5. grid 中justify/align-items和justify/align-content的属性值分别是什么

justify/align-items 4个 start、 end、 center、 stretch拉伸

justify/align-content 7个 start、 end、 center、 stretch、 space-around、 space-between、 space-evenly间隔相等

★ css div 垂直水平居中,并完成 div 高度永远是宽度的一半(宽度可以不指定)

div 高度永远是宽度的一半的重要实现方式是: padding-bottom: 50%;


★  CSS 的权重和优先级

CSS 的权重和优先级.png

★ CSS 怎么画一个大小为父元素宽度一半的正方形?

.inner { 
    width: 50%; 
    padding-bottom: 50%; 
    background: blue; 
 }

padding-bottom: 50%; 就是宽度的一半,因为padding多少是 50%是按照宽度算的,因为没有高度,所以25%就是高度是宽度的25%,以此类对,一个小知识点;


★ CSS实现自适应正方形、等宽高比矩形

1. 双重嵌套,外层 relative,内层 absolute

  .outer {
    padding-top: 50%;// padding-botton: 50%; 效果一致,目的是让高度为宽度的50%
    height: 0;
    background: #ccc;
    width: 50%;  // 目的是让宽度缩小50%
    position: relative;
  }

  .inner {
   // 改变定位 到父元素位置
    position: absolute;  
    top: 0;
    left: 0;
    // 与父元素宽度高度一致
    width: 100%;
    height: 100%;
    background: blue;
  }
  
  <div class="outer"> 
      <div class="inner">hello</div> 
  </div>

2. padding 撑高画正方形

  .outer {
    width: 400px;
    height: 600px;
    background: blue;
  }

  .inner {
    width: 100%;  //宽度跟父元素保持一致
    height: 0;
    padding-bottom: 100%;  // 高度不固定,padding填充跟宽度一致
    background: red;
  }
  
  <div class="outer"> 
      <div class="inner">hello</div> 
  </div>
  

★ 实现两栏布局的方式:

1.float+margin/padding

2.flex

3.BFC: 左 float 右BFC 【参考下面BFC会与float元素...】


★ 实现三列布局的方式【圣杯布局和双飞翼布局】

1. 左右固定定位 absolute top right left 中间 margin-left: 200px; margin-right: 200px;

2. 左 左浮动 右 右浮动 中间 margin左右

3. 圣杯布局和双飞翼布局www.cnblogs.com/jiguiyan/p/…

3.1作用:

圣杯布局和双飞翼布局解决的问题是相同的,就是两边顶宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染。

3.2区别

圣杯布局:为了让中间div内容不被遮挡,将中间div设置了左右padding-left和padding-right后,将左右两个div用相对布局position: relative并分别配合right和left属性,以便左右两栏div移动后不遮挡中间div。

双飞翼布局:为了让中间div内容不被遮挡,直接在中间div内部创建子div用于放置内容,在该div里用margin-left和margin-right为左右两栏div留出位置。

3.3 圣杯布局

缺点:圣杯布局的缺点:正常情况下是没有问题的,但是特殊情况下就会暴露此方案的弊端,如果将浏览器无线放大时,「圣杯」将会「破碎」掉。如图:当middle部分的宽小于left部分时就会发生布局混乱。(middle<left即会变形)

  <!DOCTYPE html>
  <html>
      <head>
          <meta charset="utf-8" />
          <title>圣杯布局</title>
          <style>
              
              #bd{
                  padding: 0 200px 0 180px;
                  height: 100px;
              }
              #middle{
                  float: left;
                  width: 100%;
                  height: 500px;
                  background:blue;
              }
              #left{
                  float:left;
                  width:180px;
                  height:500px;
                  margin-left:-100%;
                  background: #0c9;
                  position: relative;
                  left: -180px;
              }
              #right{
                  float: left;
                  width: 200px;
                  height: 500px;
                  margin-left: -200px;
                  background: #0c9;
                  position: relative;
                  right: -200px;
              }
          </style>
      </head>
      <body>
      
          <div id="bd">
              <div id="middle">middle</div>
              <div id="left">left</div>
              <div id="right">right</div>
          </div>
      </body>
  </html>
3.4 双飞翼布局

优点:不会像圣杯布局那样变形

缺点是:多加了一层dom节点

 <!DOCTYPE html>
   <html>
       <head>
           <meta charset="UTF-8">
           <title>双飞翼布局</title>
           <style>
   
   #center{
       float:left;
       width:100%;/*左栏上去到第一行*/     
       height:100px;
       background:blue;
   }
   #left{
       float:left;
       width:180px;
       height:100px;
       margin-left:-100%;
       background:#0c9;
   }
   #right{
       float:left;
       width:200px;
       height:100px;
       margin-left:-200px;
        background:#0c9;
   }
  
   /*给内部div添加margin,把内容放到中间栏,其实整个背景还是100%*/ 
  #inside{
      margin:0 200px 0 180px;
      height:100px;
  }
  </style>
      </head>
      <body>
         <div id="center">
              <div id="inside">middle</div>
          </div>
          <div id="left">left</div>
          <div id="right">right</div>
      </body>
  </html>

4. flex 左右定宽 中间flex:1 撑开


★ CSS 动画有哪些?

animation、transition、transform、translate 这几个属性要搞清楚:

  • animation:用于设置动画属性,他是一个简写的属性,包含6个属性

  • transition:用于设置元素的样式过度,和animation有着类似的效果,但细节上有很大的不同

  • transform:用于元素进行旋转、缩放、移动或倾斜,和设置样式的动画并没有什么关系

  • translate:translate只是transform的一个属性值,即移动,除此之外还有 scale 等


★ visibility 和 display 的差别

  • visibility 设置 hidden 会隐藏元素,文档流,触发重绘

  • display 设置了 none 属性会隐藏元素,不在文档流,所以会触发回流和重绘

  • opacity 会将元素设置为透明,文档流中,不会被删除,所以会触发重绘


★ opacity 可以有过渡效果嘛?

可以设置过渡效果

常用来于:hover一起使用

 <style>
    .love{
        background: url(1.jpg) no-repeat;
        border: 300px;
        height: 300px;
        color: red;
        opacity: 1;
        position: relative;
    }
    .yes{
        opacity: 0;
        position: relative;
        top: 100px;
        left: 110px;
        width: 200px;
        height: 100px;
    }
    .love:hover .yes{
        opacity: 1;
        transition: 2s;
    }
</style>

<div class="love">
   <div class="yes">佐助和鸣人才是真爱!!</div>
</div>


★ 到底什么是 BFC、IFC、GFC 和 FFC

juejin.cn/post/684490…

BFC(Block Formatting Contexts)直译为"块级格式化上下文"

IFC(Inline Formatting Contexts)直译为"内联格式化上下文"

GFC(GridLayout Formatting Contexts)直译为"网格布局格式化上下文"

FFC(Flex Formatting Contexts)直译为"自适应格式化上下文"


★ BFC原理

常见的定位方案-3种?BFC的英文全称和中文全称?触发BFC的规则?BFC的应用?

bili-简单全面理解BFC-确实易懂

知乎-10 分钟理解 BFC 原理

1. 常见定位方案

  • 普通流 (normal flow)【行内、块级】BFC属于普通流
  • 浮动 (float)
  • 绝对定位 (absolute positioning)

2. BFC 概念

Block Formatting Contexts 块级格式化上下文;形成独立渲染区域;内部元素的渲染不会影响外界

Formatting context(格式化上下文) 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。

BFC 即 Block Formatting Contexts (块级格式化上下文),它属于上述定位方案的普通流。

具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器所没有的一些特性。

通俗一点来讲,可以把 BFC 理解为一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部。

3. 触发 BFC

只要元素满足下面任一条件即可触发 BFC 特性:

    1. body 根元素
    1. 浮动元素:float 除 none 以外的值
    1. 绝对定位元素:position (absolute、fixed)
    1. display 为 inline-block、table-cells、flex
    1. 块级元素 overflow 不是 visible (hidden、auto、scroll)

4. BFC 特性及应用【主要就是清除浮动

BFC形成一个独立的渲染区域,让BFC里面的元素,有高度了,清除浮动解决高度塌陷

    1. 避免外边距重叠,解决margin重叠的话也得再外层包裹一个BFC的父元素
    1. BFC 可以包含浮动的元素 [清除浮动],就是浮动外面的父元素就有高度了
    1. BFC 可以阻止元素被浮动元素覆盖,再不是浮动的元素,设置成BFC就不会被浮动元素干扰了
    1. 在BFC中,内部的box会在垂直方向,一个接一个地放置
    1. 计算BFC高度时,浮动元素也参与计算,原本浮动元素应该是脱离文档流的
    1. BFC 就是页面上的一个独立容器,容器里面的子元素不会影响外面元素

★ BFC会与float元素相互覆盖吗?为什么?举例说明

不会,因为 BFC 是页面中一个独立的隔离容器,其内部的元素不会与外部的元素相互影响,比如两个 div,上面的 div 设置了 float,那么如果下面的元素不是 BFC,也没有设置 float,会形成对上面的元素进行包裹内容的情况,如果设置了下面元素为 overflow:hidden;属性那么就能够实现经典的两列布局,左边内容固定宽度,右边因为是 BFC 所以会进行自适应。

【参考 BFC原理链接里面的第四点应用里面的BFC 可以阻止元素被浮动元素覆盖】

先来看一个文字环绕效果:这时候其实第二个元素有部分被浮动元素所覆盖,(但是文本信息不会被浮动元素所覆盖)

<div style="height: 100px;width: 100px;float: left;background: lightblue">
    我是一个左浮动的元素
</div>
<div style="width: 200px; height: 200px;background: #eee">
    我是一个没有设置浮动, 也没有触发 BFC 元素, width: 200px; height:200px; background: #eee;
</div>

image.png

如果想避免元素被覆盖,可触触发第二个元素的 BFC 特性,加入 overflow: hidden,就会变成如下样式:

这个方法可以用来实现两列自适应布局,左边的宽度固定,右边自适应宽度【去掉宽度】

<div style="height: 100px;width: 100px;float: left;background: lightblue">
    我是一个左浮动的元素
</div>
<div style="width: 200px; height: 200px;background: #eee; overflow: hidden">
    我是一个没有设置浮动, 也没有触发 BFC 元素, width: 200px; height:200px; background: #eee;
</div>

image.png


★ CSS盒模型

盒模型本质上是一个盒子

包括外边距(margin)边框(border)内边距(padding)实际内容(content)四个属性

标准盒子模型:宽度=内容的宽度(content)+ border + padding

低版本IE盒子模型:宽度=内容宽度(content+border+padding)【box-sizing: border-box;】

zhuanlan.zhihu.com/p/74817089


★ 说一下你知道的position属性,都有啥特点?

static:无特殊定位,对象遵循正常文档流。top,right,bottom,left等属性不会被应用。  

relative:对象遵循正常文档流,但将依据top,right,bottom,left等属性在正常文档流中偏移位置。而其层叠通过z-index属性定义。  

absolute:对象脱离正常文档流,使用top,right,bottom,left等属性进行绝对定位。而其层叠通过z-index属性定义。  

fixed:对象脱离正常文档流,使用top,right,bottom,left等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。而其层叠通过z-index属性定义。

sticky:具体是类似 relative 和 fixed,在 viewport 视口滚动到阈值之前应用 relative,滚动到阈值之后应用 fixed 布局,由 top 决定。


★ 两个div上下排列,都设margin,有什么现象?

  • 都正取大
  • 一正一负相加
  • 同负取绝对值最大的

问:为什么会有这种现象?你能解释一下吗

是由块级格式上下文BFC决定的,元素在 BFC 中会进行上下排列,然后垂直距离由 margin 决定,并且会发生重叠,具体表现为1.同正取最大的 2.同负取绝对值最大的 3.一正一负相加


★ 清除浮动有哪些方法?

不清除浮动会发生高度塌陷:(父元素不写高度时,子元素写了浮动后,父元素会发生高度塌陷)

  • clear清除浮动(添加空div法)在浮动元素下方添加空div,并给该元素写css样式:{clear:both;height:0;overflow:hidden;}
  • 给浮动元素父级设置高度
  • 父级同时浮动(需要给父级同级元素添加浮动)
  • 父级设置成inline-block,其margin: 0 auto居中方式失效
  • 给父级添加overflow:hidden 清除浮动方法
  • 万能清除法 after伪类 清浮动(现在主流方法,推荐使用)
.float_div:after{
  content:".";
  clear:both;
  display:block;
  height:0;
  overflow:hidden;
  visibility:hidden;
}
.float_div{
  zoom:1
}