CSS

230 阅读6分钟

1. CSS选择器优先级

  • !important>内联>id选择器>类选择器>标签选择器>通用选择器(*)和继承

    当内联样式里有important 则其最强

css 权重计算:

> 内联:1 0 0 0  
> id选择器:0 1 0 0  
> 类选择器:0 0 1 0  
> 标签选择器: 0 0 0 1  
> 通用选择器和继承等:0 0 0 0  

> 样式层叠:先判断权重,权重大的生效;权重一样的话,比较位置,在css样式文件中靠后的生效。  

2. CSS布局

2.1 定位布局(position)

  • static:HTML 元素的默认值,即没有定位,遵循正常的文档流对象。静态定位的元素不会受到 top, bottom, left, right影响。
  • fixed:元素的位置相对于浏览器窗口是固定位置,即使窗口是滚动的它也不会移动。
  • relative:相对定位,相对其本来的位置定位
  • absolute:绝对定位,绝对定位的元素的位置相对于最近的已定位父元素(除了默认的static是非定位),如果元素没有已定位的父元素,那么它的位置相对于html。
  • sticky:粘性定位,在滚动时表现,页面滚动超出目标区域时,它的表现就像position:fixed;,它会固定在目标位置。

2.2 流式布局

以百分比为主要形式,让屏幕自适应,这种布局方式定义灵活,能够根据屏幕的情况变化,但是这种方式设计的效果不太容易控制,一般移动端结合rem用的比较多,pc端用的不是非常多。

2.3 浮动布局(float)

float: left; 浮动脱离文档流,需要清除浮动

清除浮动的方法

  • 在后面添加一个额外的标签然后 添加 clear属性;

  • 父元素加:overfloat: hidden / auto ;

  • 父元素设置高度;

  • 添加伪类:

      .clearfix:after{
          content:"";  /*设置内容为空*/
          height:0;  /*高度为0*/
          line-height:0;  /*行高为0*/
          display:block;  /*将文本转为块级元素*/
          visibility:hidden;  /*将元素隐藏*/
          clear:both;  /*清除浮动*/
      }
      .clearfix{
          zoom:1;  /*为了兼容IE*/
      }
    

2.4 弹性布局(flex)

flex-direction:row,row-reverse,column,column-reverse;  
flex-wrap: wrap,no-wrap,wrap-reverse;  
flex-flow: [direction][wrap];  
justify-content: flex-start,flex-end,center,space-between,space-around;  
align-items: flex-start,flex-end,center,baseline,streth;  
align-content: flex-start,flex-end,center,streth,space-between,space-around;  
  • 对于容器中的项目,我们可以使用order属性来指定项目的排列顺序
  • 还可以使用flex-grow来指定当排列空间有剩余的时候,项目的放大比例。
  • 还可以使用flex-shrink来指定当排列空间不足时,项目的缩小比例。
  • align-self属性实现容器中项目的垂直方向排列规则。

3. 实现水平垂直居中

对于宽高固定的元素
(1)我们可以利用margin:0 auto来实现元素的水平居中。
(2)利用绝对定位,设置四个方向的值都为0,并将margin设置为auto,由于宽高固定,因此对应方向实现平分,可以实现水平和垂直方向上的居中。
(3)利用绝对定位,先将元素的左上角通过top:50%和left:50%定位到页面的中心,然后再通过margin负值来调整元素的中心点到页面的中心。
(4)使用flex布局,通过align-items:center和justify-content:center设置容器的垂直和水平方向上为居中对齐,然后它的子元素也可以实现垂直和水平的居中。
不定宽高的元素
(1)绝对定位,先将元素的左上角通过top:50%和left:50%定位到页面的中心,然后再通过translate(-50%,-50%)来调整元素到页面中心。
(2)flex 布局
(3)表格布局:display:table-cell; text-align:center; vertical-align: middle;

4.移动端面适配

媒体查询设置viewport

<meta name='viewport'content='width=device-width,initial-scale=1,user-scale=no' />  
  • rem: root em 相对根元素HTML的font-size来计算
  • em:相对单位,基准点为父节点字体的大小,如果自身定义了font-size按自身来计算(浏览器默认字体是16px),整个页面内1em不是一个固定的值。
  • vh/vw: 1vh 为视口高度的 1%

5.盒子模型

盒模型都是由四个部分组成的,分别是margin、border、padding和content。标准盒模型和IE盒模型的区别在于设置width和height时,所对应的范围不同。

  • 标准盒模型:宽高 是由 content 组成
    IE盒模型: 宽高由 content + padding + border 组成
    可通过 box-sizing: border-box 转变为IE盒模型。

6.CSS动画

CSS3动画属性animation和CSS3的transition属性一样是一个复合属性,它包含了8个属性: animation-name,主要用来指定一个关键帧动画的名字,这个动画名必须对应一个@keyframes规则。CSS加载时会应用animation-name指定的动画, 从而执行动画。

animation-duration,主要用来设置动画播放所需时间,一般以秒为单位。  
animation-timing- function主要用来设置动画的播放方式,与transition-timing-function类似。  
animation-delay、主要用来指定动画开始时间,一般以秒为单位。  
animation-iteration- count、主要用来指定动画播放的循环次数。  
animation-direction、主要用来指定动画的播放方向。  
animation-play- state,主要用来控制动画的播放状态。  
animation-fill- mode,主要用来设置动画的时间外属性。  

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

两个都是使元素内容不显示
重绘和回流
重绘:相当于只改变样式,不改变dom节点
回流:dom节点发生改变,整个页面布局发生改变(尽量减少回流,优化浏览器性能)

display:none  隐藏元素,改变了html结构,该元素不再占用页面位置,会引起重绘和回流。  
visibility:hidden 隐藏内容,不改变html结构,元素还会占用位置,只会引起重绘。  

1.使用 transform 替代 top 2.使用 visibility 替换 display: none ,因为前者只会引起重绘,后者会引发回流(改变了布局)
3.避免使用table布局,可能很小的一个小改动会造成整个 table 的重新布局。
4.尽可能在DOM树的最末端改变class,回流是不可避免的,但可以减少其影响。尽可能在DOM树的最末端改变class,可以限制了回流的范围,使其影响尽可能少的节点。
5.避免设置多层内联样式,CSS 选择符从右往左匹配查找,避免节点层级过多。

8.BFC

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

创建BFC {

    添加float  
    overflow:hidden,scroll,auto;  
    display: inline-block,flex,table-cell等;  
    position: absolute,flexd;

}
blog.csdn.net/qq_43004614…

9.三栏布局

浮动布局

<div class="box">
    <div class="left">1</div>
    <div class="right">3</div>    
    <div class="content">2</div>
</div>
<style type="text/css">
    * {
        margin: 0px;
        padding: 0px;
        box-sizing: border-box;
    }
    .box > div {
        min-height: 100px;
    }
    .left {
        float: left;
        width: 100px;
        background: red;
    }
    .content {
        background: yellow;
    }
    .right {
        float: right;
        width: 100px;
        background: blue;
    }
</style>  

定位布局

<style>
 * {
   margin: 0;
   padding: 0;
 }

 .box {
   position: relative;
 }

 .left {
   position: absolute;
   min-width: 100px;
   min-height: 100px;
   left: 0;
   background-color: red;
 }

 .content {
   min-height: 100px;
   position: absolute;
   left: 100px;
   right: 100px;
   background-color: blue;
 }

 .right {
   min-width: 100px;
   min-height: 100px;
   position: absolute;
   right: 0;
   background-color: yellow;
 }
</style>

<body>
  <div class="box">
    <div class="left">1</div>
    <div class="content">2</div>
    <div class="right">3</div>    
</div>
</body>  

弹性布局

<style>
 * {
   margin: 0;
   padding: 0;
 }

 .box {
   display: flex;
 }

 .left {
   width: 100px;
   min-height: 100px;
   background-color: red;
 }

 .content {
   min-height: 100px;
   flex: 1;
   background-color: blue;
 }

 .right {
   width: 100px;
   min-height: 100px;
   background-color: yellow;
 }
</style>

<body>
  <div class="box">
    <div class="left">1</div>
    <div class="content">2</div>
    <div class="right">3</div>    
</div>
</body>  

圣杯布局

<style>
 body,html{
    height:100%;
    padding: 0;
    margin: 0;
    text-align: center;
}
body {
    padding-left: 100px;
    padding-right: 200px;
}
.left {
    background: red;
    width: 100px;
    float: left;
    margin-left: -100%;
    position: relative;
    left: -100px;
}
.main {
    background: blue;
    float: left;
    width: 100%;
}
.right {
    background: yellow;
    width: 200px;
    float: left;
    margin-left: -200px;
    position: relative;
    right: -200px;
}

</style>

<body>
  <div class="main">Main</div>
  <div class="left">Left</div>
  <div class="right">Right</div>
</body>  

双飞翼布局

<style>
  body,
  html {
    height: 100%;
    padding: 0;
    margin: 0;
  }

  .left {
    background: red;
    width: 100px;
    float: left;
    margin-left: -100%;
  }
  .main-content {
    float: left;
    width: 100%;
  }
  .main {
    background: blue;
    margin-left: 100px;
    margin-right: 200px;
  }

  .right {
    background: yellow;
    width: 200px;
    float: left;
    margin-left: -200px;
  }
</style>

<body>
  <div class="main-content">
    <div class="main">Main</div>
  </div>

  <div class="left">Left</div>
  <div class="right">Right</div>
</body>

10.PNG,GIF,JPG, WEBP的区别及如何选?

  • gif:色彩不丰富,文件小,透明,兼容性好,支持动画,适合做动图
  • jpg:色彩丰富,有损压缩,多次保存图图片质量下降,适合色彩丰富的图片
  • png:无损压缩,支持透明,色彩丰富的图片文件大,适合icon或logo图
  • webp:色彩丰富,透明,支持有损和无损压缩,支持动画,兼容性不好