(超详细版)2020前端面试题————CSS

一、盒模型

标准盒模型:box-sizing:content-box; 总宽度:内容 ( content ) + border + padding  注意这里不算margin 计算页面的总宽度 加margincss

IE盒模型(怪异盒模型): box-sizing:border-box; 宽度 = 内容宽度 ( content + border + padding )  html

二、弹性盒模型

flex-direction:row   //(默认)主轴为水平方向,起点在左端。
flex-direction:row-reverse   //主轴为水平方向,起点在右端
flex-direction:column   //使用后会使主轴变为y轴
flex-firection:column-reverse   //主轴为垂直方向,起点在下沿。

flex-wrap:nowrap //(默认)不换行
flex-wrap:wrap   //换行,第一行在上方
flex-wrap:wrap-reverse    //换行,第一行在下方

flex-flow:该属性是flex-direction属性和flex-wrap属性的简写形式。
flex-flow:值1(主轴方向) 值2(是否换行)
flex-flow:row nowrap   //(默认) 

justify-content:flex-start   //(默认)左对齐
justify-content:flex-end   //右对齐
justify-content:center   //居中(子元素紧凑居中)
justify-content:space-between;   //两端对齐,项目之间的间隔都相等
justify-content:space-around;   //每一个项目两侧的间隔相等 

align-items:flex-start    //与交叉轴的起点对其
align-items:flex-end    //与交叉轴的终点即末尾对其
align-items:center    //与交叉轴的中点对其
align-items:baseline    //项⽬的第⼀⾏⽂字的基线对齐
align-items:stretch    //若是项⽬未设置⾼度或设为auto,将占满整个容器的⾼度 

align-content属性,紧跟于flex-wrap属性后,该属性用于修饰flex-wrap属性
align-content:flex-start    //与交叉轴的起点对齐
align-content:flex-end    //与交叉轴的终点对其
align-content:center    //与交叉轴的中点对齐
align-content:space-between    //与交叉轴两端对齐,轴线之间的间隔平均分布
align-content:space-around    //每根轴线两侧的间隔都相等

align-self:center
//容许单个元素与其余元素有不同的对齐方式
//在弹性子元素上使用。覆盖容器的 align-items 属性。

order属性: (自定义子元素的显示顺序) 
//用整数值来定义排列顺序,数值小的排在前面。能够为负值。
//注: 默认值为0。父元素必须设置为弹性盒模型
align-self:flex-start    //默认
align-self:flex-end    //终点
flex-grow属性:(定义弹性盒子元素的扩展比率) //表示的是当容器有多余的空间时,这些空间在不一样条目之间的分配比例 //好比,一个容器中有 3 个条目,其"flex-grow"属性的值分别为 1,2 和 3 //那么当容器中有空白空间时,这 3 个条目所得到的额外空白空间分别占 //所有空间的 1/六、1/3 和 1/2
flex-shrink属性:(定义弹性盒子元素的收缩比率) //该属性的值也是无单位的,表示的是当容器的空间不足各个条目的尺寸缩小的比例。 //例如,在容器中有 3 个条目,其"flex-shrink"属性的值分别为 1,2 和 3。 //每一个条目的主轴尺寸均为 200px。当容器的主轴尺寸不足 600px 时, //好比变成了 540px 以后则须要缩小的尺寸 60px 由 3 个条目按照比例来分配。 //3 个条目分别要缩小 10px、20px 和 30px, //主轴尺寸分别变为 190px、180px 和 170px

  

 

三、CSS单位

⑴px:绝对单位。页面按精确像素展现。ios

⑵em:相对单位,基准点为父节点字体的大小,若是自定义了font-size按自身的来算,整个页面内1em不是一个固定的值。web

⑶rem:相对单位,相对于根节点html的font-size的大小来计算。chrome

⑷vw:视窗宽度,1vw等于视窗宽度的1%。编程

⑸vh:视窗高度:1vh等于视窗高度的1%。浏览器

⑹vmin:以宽和高之间最短的一端为基准,若是宽>高,那么1vmin至关于宽的1%;sass

⑺vmax:以宽和高之间最长的一端为基准,若是宽>高,那么1vmax至关于宽的1%;app

⑻%:百分比。框架

⑼pt:point,大约1/72寸,一寸=3.3333···厘米。

⑽pc:pica,大约6pt,1/6寸。

⑾ex:取当前做用效果的字体的x的高度,在没法肯定x高度的状况下以0.5em计算,IE11如下不支持。

⑿ch:以节点所使用字体中的“0”字符为基准,找不到时为0.5em。IE10以上支持。

四、CSS选择器

!important > 内联样式 > id选择器 > class选择器 > 属性选择器 > 伪类选择器(: hover) > 标签选择器 > 伪元素(: before) > 通配符选择器
可继承的属性:
      font-sizefont-familycolor
不可继承的属性:
      border、padding、margin、width、height
权重值:
     !important权重值:10000,
     内联样式:1000,
     id选择器:100
     class、伪类、属性、伪元素选择器:10
     标签选择器:1
     后代选择器的权重为包含的选择符权重值之和。
CSS3新增的伪类:
     p:first-of-type:选择属于其父元素的首个元素;
     p:last-of-type:选择属于其父元素的最后元素;
     p:only-of-type:选择属于其父元素的惟一元素;
     p:only-child:选择属于其父元素的惟一子元素;
     p:nth-child(1):选择属于其父元素的第一个子元素;
     :enabled:disabled:表单控件d的禁用状态;
     :checked:单选框h或复选框被选中;

五、BFC

         BFC是块级格式化上下文。BFC它是一个 独立的渲染区域,只有Block-level box(块元素)参与,它 规定了内部的Block-level box如何布局,而且与这个 区域外部绝不相关
         能够理解成:建立了 BFC的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素(里面怎么布局都不会影响外部),BFC仍属于文档中的普通流
  特性:
    ① 内部的块级元素会在垂直方向上一个接一个的放置;
    ② 位于同一BFC下的相邻块级子元素在垂直方向上会发生margin重叠;
    ③ 位于不一样BFC下的相邻元素之间不会发生margin重叠;
    ④ BFC能够包含浮动元素;
    ⑤ BFC是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素;
 ⑥计算BFC的高度时,浮动元素也会参与计算
触发条件:
    ① 根元素,即html;
    ② float的值不为none(默认);
    ③ overflow的值为auto、scroll或hidden, 不能为 visible(默认);
    ④ display的值为:
         table-cell:它会做为一个表格单元格显示(相似td和th)。
         table-caption:此元素会做为一个表格标题显示。
         inline-block:行内块元素。
    ⑤ position的值为fixed或absolute
用途:
    ① 闭合浮动;
    ② 阻止margin重叠
    ③ 自适应流体布局

六、清除浮动的方法 

清浮动是为了清除使用浮动元素产生的影响。浮动的元素,高度会塌陷,而高度的塌陷使页面后面的布局不能正常显示

浮动带来的问题:

  1. 父元素的高度没法被撑开,影响与父元素同级的元素
  2. 与浮动元素同级的非浮动元素(内联元素)会跟随其后
  3. 若非第一个元素浮动,则该元素以前的元素也须要浮动,不然会影响页面显示的结构

清除浮动的方法

①给设置了浮动的元素的父级加高。

②给设置了浮动的元素的父级设置overflow:hidden。若是须要兼容IE,在添加一个zoom:1

③给须要清除浮动的元素设置clear:both;

④在最后一个子元素的后面加一个空的div,给它样式属性 clear:both(不推荐)

⑤伪类清除:.clearfix:after{content:"";clear:both;display:block;}

                     .clearfix{zoom:1}

<div class="container clearfix">
	<div class="box"></div>
</div>	
<div class="main "></div>

.box{
	width:100px;
	height:100px;
	background:yellow;
	float: left;
}
.main{
	width:150px;
	height: 150px;
	background:red;
}
.clearfix:after{
	content: "";
	clear: both;
	display: block;
}
.clearfix{
	zoom:1;
}

  

 

七、层叠上下文

        层叠上下文(stacking context),是HTML中一个三维的概念。在CSS2.1规范中,每一个盒模型的位置是三维的,分别是平面画布上的 X轴Y轴以及表示层叠的 Z轴。通常状况下,元素在页面上沿 X轴Y轴平铺,咱们察觉不到它们在 Z轴上的层叠关系。而一旦元素发生堆叠,这时就能发现某个元素可能覆盖了另外一个元素或者被另外一个元素覆盖。

通元素设置position属性  为非static值    并设置z-index属性为具体数值产生层叠上下文。

八、常见页面布局

⑴静态布局:最传统、原始的Web布局设计。网页最外层容器(outer)有固定的大小,全部的内容以该容器为标准,超出宽高的部分用滚动条(overflow:scroll)来实现滚动查阅。

      优势:采用的是css2以前的写法,不存在浏览器兼容性。布局简单。

      缺点:可是移动端不可使用pc端的页面,两个页面的布局不一致,移动端须要本身另外设计一个布局并使用不一样域名呈现。

⑵流式布局:流式布局也叫百分比布局。随着屏幕的改变,页面的布局没有发生大的变化,能够进行适配调整,这个正好与自适应布局相补。

     优势:元素的宽高用百分比作单位,元素宽高按屏幕分辨率调整,布局不发生变化。

     缺点:屏幕尺度跨度过大的状况下,页面不能正常显示。

⑶弹性布局:弹性布局是CSS3引入的强大的布局方式,弹性盒模型:display:flex;

     优势:简单、方便、快速

     缺点:CSS3新特性,浏览器兼容性很是头疼。并且手机浏览器对flex的支持也不是很理想。

⑷响应式布局:采用自适应布局和流式布局的综合方式,为不一样屏幕分辨率范围建立流式布局。利用媒体查询能够检测到屏幕的尺寸(主要检测宽度),并设置不一样的CSS样式,就能够实现响应式的布局。

九、CSS预处理,后处理

CSS预处理器:用一种编程语言,为CSS增长了一些编程的特性,最终编译出css文件。好比sass、less、stylus。

     优势:语言级逻辑处理,动态特性,改善项目结构

     缺点:采用特殊语法,框架耦合度高,复杂度高

实现原理:

   ①取到 DSL 源代码 的 分析树
   ②将含有 动态生成 相关节点的 分析树 转换为 静态分析树
   ③将 静态分析树 转换为 CSS 的 静态分析树
   ④将 CSS 的 静态分析树 转换为 CSS 代码

CSS后处理器:堆css进行处理,并最终生成css的预处理器,属于广义上的css预处理器,最典型的就是css压缩工具(clean-css),流行的Autoprefixer,以Clean I Use上的浏览器支持数据为基础,自动处理兼容性问题

      优势:使用 CSS 语法,容易进行模块化,贴近 CSS 的将来标准

      缺点:逻辑处理能力有限

实现原理:

   ①将 源代码 作为 CSS 解析,得到 分析树
   ②对 CSS 的 分析树 进行 后处理
   ③将 CSS 的 分析树 转换为 CSS 代码

十、CSS3的新特性

新增一:rgba(简单不作解释);

新增二:弹性布局flex(上面第二题);

新增三:媒体查询;

新增四:渐变色;

新增五:动画animation,使用@keyframes定义,使用的元素animation:名字 时间;

@keyframes changeWidth{
    0%{width:100px}
    100%{width:800px}
}
div{
    width:100px;
    height:100px;
    background:red;
    animation:changeWidth 10s forwards;
} 

十一、display有哪些值

display:none 此元素不被显示。
display:block 此元素显示为块级元素,支持宽高,独占一行。
display:inline 此元素为内联元素,不支持宽高,不独占一行。
display:table 此元素做为块级表格来显示。
display:flex 此元素为弹性盒模型

display:list-item此元素会做为列表显示

十二、相邻的两个inline-block节点为何会出现间隔,该如何解决?

          元素被当成行内元素排版的时候,原来HTML代码中的回车换行被转成一个空白符,在字体不为0的状况下,空白符占据必定宽度,因此inline-block的元素之间就出现了空隙。这些元素之间的间距会随着字体的大小而变化,当行内元素font-size:16px时,间距为8px。(不懂不要紧,看下面解决方法就明白了)。

方法一:父级font-size:0;子级设置字体大小;

方法二:改变书写方式

//原来
<span>1</span>
<span>2</span>
<span>3</span>

//改变
<span>1</span><span>2</span><span>3</span>

 

方法三:margin负值

方法四:设置父元素display:table;word-spacing:0(两个记得都要加上);

1三、meta viewport移动端适配

<metaname="viewport" content="width=device-width,initial-scale=1.0">

1四、CSS实现宽度自适应100%,宽高16:9的比例的矩形

*{    
   margin:0;    
   padding:0;
}
.wrap{    
    width:20%;
}
.box{    
    kground:pink;
}
.box p{    
    width:100%;    
    height:100%;    
    position: absolute;    
    color:#666;
}

  

 <div class="wrap"> <div class="box"> <p>13</p> </div></div>

1五、画三角形

div{
    width:0;
    height:0;
    border-top:50px solid transparent;
    border-left:50px solid transparent;
    border-right:50px solid transparent;
    border-bottom:50px solid red;
}

  注:上述三角形为正三角形,若是想要倒三角形,那么将border-top的值设为50px solid red,其他的属性值相同。

1六、1像素边框问题

物理像素:移动设备出厂时,不一样设备自带的不一样像素,也称硬件像素。
逻辑像素:即css中记录的像素。

        为何会有1像素边框问题:在开发中,在移动端css里面写了1px,实际看起来比1px粗。这就关系到物理像素和逻辑像素的问题了,开发中UI设计师要求的1px是指设备的物理像素1px,而css里记录的像素是逻辑像素,它们之间存在一个比例关系,能够用window.devicePixelRadio来获取,也能够用媒体查询的-webkit-min-device-pixel-ratio来获取,比例的多少与设备相关。iphone的devicePixelRatio == 2,而咱们设置的border:1px 描述的是设备的独立像素,因此被放大到物理像素2px显示,在iphone上就显的比较粗。

解决方案:

媒体查询利用设备像素比缩放,设置小数像素

   优势:简单,好理解。
   缺点:兼容性差目前IOS8+才支持,IOS7如下、安卓系统都显示0px。
.box{border:1px solid #333}
@media screen and (-webkit-min-device-pixel-ratio:2){
    .box{border:1px solid #333}
}
@media screen and (-webkit-min-device-pixel-radio:3){
    .border{border:0.333333px solid #333}
} 

  

设置border-image方案

缺点:须要制做图片,圆角可能会出现模糊。

 
 
.border-image-1px{
    border-width:1px 0px;
    -webkit-border-image:url("border.png")2 0 strech;
    border-image:url("border.png")2 0 stretch;
}
      border-width:指定边框的宽度,能够设定四个值,分别为上右下左top  right  bottom  left。
      border-image:距离图片上方2px裁剪图片做为上边框,下方2px裁剪做为下边框。距离左右0像素裁剪图片即没有边框,以拉伸方式展现。
      总结:在边框图片中,裁剪图片上下方的2个像素宽度做为上下边框,并展现在宽度为1个像素的边框空间里。左右没有边框。

box-shadow方案

优势是没有圆角问题。缺点是颜色很差控制。

 

.box{
    -webkit-box-shadow:0 1px 1px -1px rgba(0,0,0,.5);
}

参数:水平阴影位置,垂直阴影位置,模糊距离,阴影尺寸,阴影颜色,将外部阴影改成内部阴影。

transform:scale(0.5)方案(推荐):

      以上的方案,思想其实都是将1px缩小为0.5px来展现,然而0.5px并非全部的设备或浏览器都支持。其实1像素问题的产生基本发生在设置边框或分割线的时候,场景并不覆盖全局样式,所以,直接缩放须要设置的元素,才是咱们真正需求的。transform就能够实现。

①设置height:1px,根据媒体查询结合transform缩放为相应的尺寸

.box{
    height:1px;
    background:#333;
    -webkit-transform:scaleY(0.5);
    -webkit-transform-origin:0 0;
    overflow:hidden;
}

  

②用: :after和: :before,设置border-bottom:1px solid #000;,而后缩放-webkit-transform:scaleY(0.5);能够实现两根边线的需求;

.box::after{
    content:"";
    width:100%;
    border-bottom:1px solid #000;
    transform:scaleY(0.5);
} 

③用: :after设置border:1px solid #000;width:200%;height:200%;而后缩放scaleY(0.5);优势能够实现圆角京东就是这么实现的,缺点是按钮添加active比较麻烦。

.div::after {
    content: '';
    width: 200%;
    height: 200%;
    position: absolute;
    top: 0;
    left: 0;
    border: 1px solid #bfbfbf;
    border-radius: 4px;
    -webkit-transform: scale(0.5,0.5);
    transform: scale(0.5,0.5);
    -webkit-transform-origin: top left;
} 

17.如何实现一个最大的正方形

用 padding-bottom 撑开边距

 section {
    width:100%;
    padding-bottom: 100%;
    background: #333;
}

18.一行水平居中,多行居左

<div><span>我是多行文字。我是多行文字。我是多行文字。我是多行文字。我是多行文字。我是多行文字。我是多行文字。我是多行文字。我是多行文字。我是多行文字。</span></div>
<div><span>我是一行文字</span></div>

<style>
div{text-align: center;}
div span{display: inline-block;text-align: left;}
</style>

19.水平垂直居中

大佬的文章: https://juejin.im/post/6844903474879004680

20.如何实现左右等高布局

table布局兼容性最好,固然flex布局的align-items: stretch;也行

<div class="layout">
  <div class="layout left">left</div>
  <div class="layout right">center</div>
</div>

<style>
.layout{
  display: table;
  width: 100%;
}
.layout div{
  display: table-cell;
}
.layout .left{
  width: 50%;
  height: 200px;
  background: red;
}
.layout .right{
  width: 50%;
  background: yellow;
}
</style>

 

21.link @import导入css

  1. link是XHTML标签,除了加载CSS外,还能够定义RSS等其余事务;@import属于CSS范畴,只能加载CSS
  2. link引用CSS时,在页面载入时同时加载;@import须要页面网页彻底载入之后加载
  3. link无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不支持
  4. link支持使用Javascript控制DOM去改变样式;而@import不支持

22. position的值releave和absolute定位远点是?

  • absolute 生成绝对定位元素,相对与值部位static的第一个父元素进行定位
  • fixed 生成绝对的元素,相对于浏览器窗口进行定位
  • relative 生成相对定位的元素,相对于其正常位置进行定位
  • static 默认值。没有定位,元素出如今正常出现的流中
  • inherit 规定从父元素继承position属性的值

23.常常遇到的浏览器的兼容性问题有哪些,缘由,解决方法是什么

 

  • png24位的图片在Ie6浏览器上出现背景。解决方案是作成png8
  • 浏览器默认的margin和padding不一样。解决方案是加一个全局的*{margin:0;padding:0}来统一
  • IE6双边距bug;矿属性变迁float后,又有横向的margin状况下,在Ie6显示margin比设置的大。解决方案是在float的标签控制中加入display:inline;将其妆花为行内渐进识别的方式,从整体中逐步排除局部。
  • 设置较小高度标签(通常小于10px),在IE6,IE7中高度超出本身设置高度。解决方法:给超出高度的标签设置overflow:hidden;或者设置行高line-hieght小于你设置的高度
  • chrome中文界面默认或将小于12px的文本强制按照12px的文本强制按照12px显示,可经过加入css属性 -webkit-text-size-adjust:none 解决

 

   移动端1px边框问题。解决方案采用伪元素模拟的方式

  • .scale{
      position: relative;
      border:none;
     }
    .scale:after{
      content: '';
      position: absolute;
      bottom: 0;
      background: #000;
      width: 100%;
      height: 1px;
      -webkit-transform: scaleY(0.5);
      transform: scaleY(0.5);
      -webkit-transform-origin: 0 0;
      transform-origin: 0 0;
    }
    
  • 点透问题,在安卓某些版本触发两次点击问题。解决方案:引入fastclick处理点透问题
  • 安卓部分版本input里的placeholder位置偏上。解决方案:把input的line-height设为normal
  • ios滚动卡顿。解决方案:在滚动的容器上加上webkit-over-flow-scrolling:touch;
  • ios的body位置overflow:hidden后仍然能够滚动。解决方案:通常在全部元素最外层再包一大盒子.wrapper
  •  .wrapper{
       position:relative;
       overflow:hidden;
     }
    

      

 

24. margin和padding分别适合什么场景使用?

margin是用来隔开元素与元素的间距;

  1. 须要在border外侧添加空白
  2. 空白处不须要背景色
  3. 上下相连的两个盒子之间的空白,须要相互抵消时。

padding是用来隔开元素与内容的间隔。

  1. 须要在border内侧添加空白
  2. 空白处须要背景颜色
  3. 上下相连的两个盒子的空白,但愿为二者之和。

margin是用来布局分开元素,使元素与元素互不相干;padding用于元素与内容之间的间隔,让内容与元素之间有一段间距

兼容性的问题:在IE5 IE6中,为float的盒子指定margin时,左侧的margin可能会变成两倍的宽度。经过改变padding或者指定盒子的display:inline解决。

 

25.什么是伪类,什么是伪元素,他们的区别?


 

  • 伪类的受体是文档树中已有的元素,而伪元素则建立了一个DOM外的元素
  • 伪类用于添加元素的特殊效果,而伪元素则是添加元素的内容
  • 伪类使用的一个冒号,伪元素使用两个冒号
  • 伪类更经常使用一些简单的动画或者交互的样式,例如滑入滑出,而为伪元素更经常使用语字体图标,清除浮动等

26. 什么是外边距合并


 

  外边距合并指的是,当两个垂直外边距相遇时,他们将造成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中较大者

27.为何要初始化CSS样式


 

  由于浏览器的兼容问题,不一样浏览器对有些标签的默认值是不一样的,若是没对CSS初始化每每会出现浏览器之间的页面显示差别。

 28.CSS里的visibility属性有个collapse属性值?在不一样浏览器下之后什么区别?


 

  当一个元素的visibility属性被设置成collapse值后,对于通常的元素,它的表现跟hidden是同样的。

  1. chrome中,使用collapse值和使用hidden没有区别。
  2. firefox,opera和IE,使用collapse值和使用display:none没有什么区别。

 29.display:none与visibility:hidden的区别?


 

  display:none 不显示对应的元素,在文档布局中再也不分配空间(回流+重绘)
  visibility:hidden 隐藏对应元素,在文档布局中仍保留原来的空间(重绘)

30.position跟display、overflow、float这些特性相互叠加后会怎么样?


 

  display属性规定元素应该生成的框的类型;position属性规定元素的定位类型;float属性是一种布局方式,定义元素在哪一个方向浮动。
  相似于优先级机制:position:absolute/fixed优先级最高,有他们在时,float不起做用,display值须要调整。float 或者absolute定位的元素,只能是块元素或表格。

31.设置元素浮动后,该元素的display值是多少?


 

      自动变成display:block

 

32.CSS优化、提升性能的方法有哪些?


 

  1. 避免过分约束
  2. 避免后代选择符
  3. 避免链式选择符
  4. 使用紧凑的语法
  5. 避免没必要要的命名空间
  6. 避免没必要要的重复
  7. 最好使用表示语义的名字。一个好的类名应该是描述他是什么而不是像什么
  8. 避免!important,能够选择其余选择器
  9. 尽量的精简规则,你能够合并不一样类里的重复规则

 32.在网页中的应该使用奇数仍是偶数的字体?为何呢?


 

       使用偶数字体。偶数字号相对更容易和 web 设计的其余部分构成比例关系。Windows 自带的点阵宋体(中易宋体)从 Vista 开始只提供 十二、1四、16 px 这三个大小的点阵,而 1三、1五、17 px时用的是小一号的点。(即每一个字占的空间大了 1 px,但点阵没变),因而略显稀疏。

相关文章
相关标签/搜索