CSS常见面试题

694 阅读10分钟

介绍一下标准的CSS的盒子模型

css盒子模型分为IE盒子模型和W3C标准盒子模型,它包括内容(content) 填充(padding) 边界(margin) 边框(border

他们两者的区别在于:

IE盒模型的宽高等于content+border+padding

W3C标准盒模型的宽高等于content

IE盒子模型是更贴合实际生活盒子的,所以W3C在CSS3中新增了box-sizing属性

box-sizing: content-box|border-box|inherit;

inherit:从父元素继承 box-sizing 属性的值,若未设置,默认为 content-box

content-box:元素的宽高 = 元素的宽高+padding+border

border-box:元素的宽高 = 元素的宽高(不包含border,padding

在这两种模式中,margin产生的效果是一样的,都会占用实际空间,但不改变盒子大小

垂直居中

参考 juejin.cn/post/684490…

flex:

.box{
    display:flex;
    justify-content:center;
    align-items:center
}

绝对定位 + transform:

.box { 
    width: 200px; 
    height: 200px; 
    border: 1px solid red; 
    position: relative; 
} 
.children-box { 
    position: absolute; 
    background: yellow; 
    left: 50%; 
    top: 50%; 
    transform: translate(-50%, -50%);
 }

table-cell:

.box { 
    width: 200px; 
    height: 200px; 
    border: 1px solid red; 
    display: table-cell; 
    text-align: center; 
    vertical-align: middle; 
} 
.children-box { 
    background: yellow; 
    display: inline-block; 
}

外边距重叠场景

  • 相邻的两个元素会出现外边距重叠
  • 父子元素出现外边距重叠
-   父元素完全没有设定边框border、内边距paddng、高度height、
最小高度min-height 、最大高度max-height

-   父级没有创建BFC或清除浮动
  • 空的块级元素

IE兼容问题

参考 juejin.cn/post/684490…

  • IE9 以下浏览器不能使用 opacity
opacity: 0.5; 

//IE6-IE8我们习惯使用filter滤镜属性来进行实现 filter: 
filter: alpha(opacity = 50); 

//IE4-IE9都支持滤镜写法progid:DXImageTransform.Microsoft.Alpha(Opacity=xx)
progid:DXImageTransform.Microsoft.Alpha(style = 0, opacity = 50); 
  • new Date('2019-4-18')IE不兼容
IE中会报NAN的错误 因为IE无法识别new Date('2019-4-18')

解决方法一:new Date('2019/4/18')
解决方法二: val 转换为 Thu Apr 18 2019 15:33:55 GMT+0800 (中国标准时间) 原始格式
  • IE事件绑定
W3C绑定事件用addEventListener,IE必须用attachEvent
兼容写法
var eventshiv = {
    // event兼容
    getEvent: function(event) {
        return event ? event : window.event;
    },

    // type兼容
    getType: function(event) {
        return event.type;
    },

    // target兼容
    getTarget: function(event) {
        return event.target ? event.target : event.srcelem;
    },

    // 添加事件句柄
    addHandler: function(elem, type, listener) {
        if (elem.addEventListener) {
            elem.addEventListener(type, listener, false);
        } else if (elem.attachEvent) {
            elem.attachEvent('on' + type, listener);
        } else {
            // 在这里由于.与'on'字符串不能链接,只能用 []
            elem['on' + type] = listener;
        }
    },

    // 移除事件句柄
    removeHandler: function(elem, type, listener) {
        if (elem.removeEventListener) {
            elem.removeEventListener(type, listener, false);
        } else if (elem.detachEvent) {
            elem.detachEvent('on' + type, listener);
        } else {
            elem['on' + type] = null;
        }
    },

    // 添加事件代理
    addAgent: function (elem, type, agent, listener) {
        elem.addEventListener(type, function (e) {
            if (e.target.matches(agent)) {
                listener.call(e.target, e); // this 指向 e.target
            }
        });
    },

    // 取消默认行为
    preventDefault: function(event) {
        if (event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },

    // 阻止事件冒泡
    stopPropagation: function(event) {
        if (event.stopPropagation) {
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
    }
};

  • 样式兼容
通配符选择器、Normalize.css、定制自己的 reset.css
  • IE9 以下浏览器对 html5 新增标签不识别
<!--[if lt IE 9]>
  <script type="text/javascript" src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<![endif]-->

  • 浏览器 CSS 兼容前缀
-o-transform:rotate(7deg); // Opera
-ms-transform:rotate(7deg); // IE
-moz-transform:rotate(7deg); // Firefox
-webkit-transform:rotate(7deg); // Chrome
transform:rotate(7deg); // 统一标识语句

BFC

BFC就是不影响外界、外界也不能影响它内部的绝缘盒子

触发BFC场景

  • 根元素<html>;
  • 元素的 float 不是 none;
  • 元素的 positionabsolutefixed;
  • 元素的 displayinline-blockflex、表格布局(table-cell、table)等;
  • overflow 不为 visible 的块元素;

BFC解决的最典型问题就是外边距重叠问题。

CSS相对定位绝对定位

  1. relative:生成相对定位的元素,相对于其正常位置进行定位
  2. absolute: 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。
  3. fixed: 生成绝对定位的元素,相对于浏览器窗口进行定位
  4. static: 默认值。没有定位,元素出现在正常的流中
  5. inherit: 继承父元素position属性的值。

flex布局

设置flex布局后,子元素的float/clear/vertical-align属性都会失效。

flex布局有6个容器属性

  1. flex-direction(决定主轴的方向,及项目的排列方向)
row:主轴为水平方向,起点在左端
row-reverse:主轴为水平方向,起点在右端
column:主轴在垂直方向,起点在上沿
column-reverse:主轴在垂直方向,起点在下沿
  1. flex-wrap(如果项目一条轴线上排不下,如何换行)
nowrap:不换行
wrap:换行,第一行在上方
wrap-reverse:换行,第一排在下方
  1. flex-flow(是flex-direction和flex-wrap的简写形式)
  2. justify-content(项目在主轴上对齐的方式)
flex-start:左对齐
flex-end:右对齐
center:居中
space-between:两端对齐,项目之间间隔相等
space-around:每个项目两侧的间隔相等
  1. align-items(在交叉轴如何对齐)
flex-start:交叉轴起点
flex-end:交叉轴终点
center:交叉轴中心点
baseline:项目第一行文字基线
stretch:默认值,如果项目未设置高度或auto,将占满整个屏幕

  1. align-content(多根轴线对齐方式,该属性取值与align-items一致)

flex布局有6个项目属性

  1. order(定义项目的排列顺序,数字越小越靠前)
  2. flex-grow(定义项目的放大比例,默认为0)
  3. flex-shrink(定义项目的缩小比例)
  4. flex-basis(在分配多余空间时,项目占据的主轴空间)
  5. flex(是 flex-grow, flex-shrink, flex-basis的简写)
  6. align-self(允许单个项目有跟其他项目不一样的对齐方式,默认值为auto,其他值与align-items完全一致)

内容宽度等分

display:flex
flex:1

左右布局 一侧定宽,一侧自适应撑满

.box{
    display:flex;
    height:100%
}
.left, .right{
    height:100%;
    box-sizing:border-box
}
.left:{
    width:100px
}
.right:{
    width:100%
}

元素隐藏的方法

  1. visibility: hidden
  2. display: none
标签设置display: none后,不会占据该标签原来所在的位置。
标签设置visibility: hidden后,仍占据原来的位置。
  1. v-if 和v-show
  2. 三元运算符
  3. opacity: 0

如何实现一个圆形可点击的区域

  1. map+area或svg
  2. border-radius
  3. 纯js实现,需要求一个点在不在圆上的简单算法、获取鼠标坐标等

css单位

px绝对单位,按照页面精确像素展示。这种单位比较稳定准确,但当我们缩放浏览器等操作,就会打破页面布局

em相对单位,基准点为父元素的字体大小。这有个缺点是进行任何元素设置,都有可能得知道他父元素的大小

rem相对单位,基准点为html的字体大小。只需要在根元素确定一个参考值便可以使用。 rem不适用于大屏幕。随着屏幕的变大或缩小不会展现更多内容,适用于app类。它在不同设备下看起来比较协调,会随着设备屏幕的大小等比缩放

css画三角形

.box{
    width:0;
    height:0;
    border-right:50px solid transparent;
    border-left:50px solid transparent;
    border-bottom: 100px solid red;
}

解决移动端1像素边框看起来比较粗的问题

用伪元素::after为div设置transform:{scale(0.5,0.5)}

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

css选择器有哪些

  1. id选择器
  2. 类选择器
  3. 标签选择器
  4. 相邻选择器
  5. 子选择器
  6. 后代选择器
  7. 属性选择器
  8. 伪类选择器
  9. 通配符选择器

清除浮动

参考 juejin.cn/post/684490…

clearfix:afer{
   content:'';
   height:0;
   line-height:0;
   display:block;
   visibility:hidden;
   clear:both
}
.clearfix{
    zoom:1
}

层叠上下文

  1. html中的根元素本身就具有层叠上下文,称为根层叠上下文
  2. 普通元素设置position为非static的值并设置z-index属性。产生层叠上下文
  3. css3中的新属性也可以产生层叠上下文

常见页面布局

  1. 静态布局

网页外层有固定大小,所有内容以该容器为标准,超出用滚动条

  1. 流式布局

左侧固定,右侧自适应。如果屏幕跨度太大,就会造成页面无法正常显示

  1. 弹性布局

是CSS3的布局方式,使用flex

  1. 响应式布局

为不同屏幕分辨率创建流式布局。我在做响应式布局时,习惯先写非响应式布局,如果完成了非非响应式我再去添加媒体查询和响应式代码。在完成非响应式布局之后,第一件事是在html页面加一句头部代码<meta name="viewport" content="width=device-width", initial-scale=1.0,minimun-scale=1.0,maximum-scale=1.0,user-scalable=no">获取手机屏幕宽度、初始作坊比例、允许用户缩放的最小比例、允许用户缩放的最大比例、用户是否可以手动缩放。在响应式布局中,可以使用rem来设置响应式字体,rem相对于html根元素字体大小的,最好要重置html根元素字体大小

css预处理器

less和sass都是css预处理器,用一种专门的编程语言进行网页样式设计,然后再编译成正常的css文件

sass是一个css预处理器,有助于减少css的重复,节省时间。

less扩展了css语言,增加了变量、mixin、函数等特性。使css更易维护和扩展

两者区别是实现方式不同,less是基于javascript运行的,所以在客户端处理。而sass是基于ruby的,是在服务端处理。less由于依赖javascript引擎,而javascript引擎需要额外的时间处理代码。所以一般都选择sass

less和sass在语法上有一些共性

  1. 混入(mixins)--class中的class
  2. 参数混入 -- 可以传递参数的class就像函数一样
  3. 嵌套规则 -- class中嵌套class,从而减少重复代码
  4. 运算 -- css中用上数学
  5. 颜色功能 -- 可以编辑颜色
  6. 名字空间 -- 分组样式,从而可以被调用
  7. 作用域 -- 局部修改样式
  8. javascript赋值 -- 在css中使用javascript表达式赋值

css后处理器

css后处理器是对css进行处理,并最终生成css的预处理器。比较火的后处理器是autoprefixer。比如将标准css编译为处理了兼容性的css

CSS3新特性

新增各种css选择器
圆角
多列布局
阴影反射
文字特效和渲染
线性渐变
旋转
缩放、定位、倾斜、动画

css3动画相关的几个属性是transition、transform、animation。我分别理解为过渡、变换、动画。transition指过渡,就像从a点到b点、是有时间的,是连续的。transform指变化,就那几个固定属性旋转、缩放、偏移等。如果单独使用就很干涩机械,配合transition就会更加平滑。anmiation可以通过设置多个节点来精确控制一个或一组动画。比transition更强大。

display有哪些属性值

  1. none:元素隐藏
  2. block:会计元素
  3. inline-block:内联块级元素
  4. list-item:列表项目
  5. tabel
  6. tabel-row
  7. flex

相邻的两个inline-block节点出现间隔的原因以及解决办法

当元素被当成内元素排版时,原来HTML代码中的回车换行被转成一个空白符,在字体不为的情况下,占据一定宽度。所以出现空隙

解决办法:

  1. 给父元素设置font-size:0;子元素设置相应的font-size
  2. 改变div书写方式,元素间空白格就是标签段之间的空格。因此去掉HTML的空格,自然消失
  3. 设置父元素display:table 和word-spacing:0
display:table会作为块级表格来显示,表格前后带有换行符。
word-spacing 属性增加或减少单词间的空白(即字间隔)

opacity和rgba的区别

  1. rgba是属性值,而opacity是属性
  2. rgba后代元素不继承透明度。而opacity后代元素会继承