CSS面试题整理

CSS面试题整理

带✅的为常见面试题(可能不准确)带❌的表示不常用 📢
css面试题

文章目录

一、基础知识

1.✅常见的选择器及其优先级?

选择器格式优先级权重
id选择器#id100
类选择器#classname10
属性选择器a[ref=“eee”]10
伪类选择器li:last-child10
伪类选择器div1
伪类选择器li:after1
相邻兄弟选择器h1+p0
子选择器ul>li0
后代选择器li a0
通配符选择器*0
  • !important声明的样式的优先级最高;
  • 优先级顺序为:内联样式 > 内部样式 > 外部样式 > 浏览器用户自定义样式 > 浏览器默认样式。

2.✅伪元素和伪类的区别和使用?

  • 伪元素:在内容元素的前后插入额外的元素或样式,但是这些元素实际上并不在文档中生成::
  • 伪类将特殊的效果添加到特定选择器上。它是已有元素上添加类别的,不会产生新的元素:
  • 总结: 伪类是通过在元素选择器上加⼊伪类改变元素状态,⽽伪元素通过对元素的操作进⾏对元素的改变

3.✅flex包括哪几个属性?

  • flex-grow,flex-shrink,flex-basics

4.✅link 和 @import 的区别?

  • link 无兼容问题,在页面载入时同时加载;
  • link引用CSS时,在页面载入时同时加载@import 需要页面完全载入后加载
  • link 支持使用Javascript控制DOM去改变样式;而**@import不支持**。

5.✅CSS3 的新特性?

  • 新增各种CSS选择器 (:not(.input):所有 class 不是“input”的节点)
  • 圆角 (border-radius:8px)
  • 多列布局 (multi-column layout)
  • 阴影和反射 (Shadoweflect)
  • 文字特效 (text-shadow)
  • 文字渲染 (Text-decoration)
  • 线性渐变 (gradient)
  • 旋转 (transform)
  • 增加了旋转,缩放,定位,倾斜,动画,多背景

6.✅CSS预处理器/后处理器是什么?为什么使用/优点?

  • 预处理器:增加复用性、mixin/变量/函数等利于开发简便、易于扩展
  • 后处理器:给浏览器添加私有前缀,解决浏览器兼容性问题
  • PostCss 的 Autoprefixer 插件可以帮助我们自动增加浏览器前缀
  • 结构清晰, 便于扩展;屏蔽浏览器私有语法的差异;实现多重继承;完美的兼容了CSS代码

7.✅单行、多行文本溢出如何隐藏?

  • 单行文本溢出
overflow: hidden;            // 溢出隐藏
text-overflow: ellipsis;      // 溢出用省略号显示
white-space: nowrap;         // 规定段落中的文本不进行换行
  • 多行文本溢出
overflow: hidden;            // 溢出隐藏
text-overflow: ellipsis;     // 溢出用省略号显示
display:-webkit-box;         // 作为弹性伸缩盒子模型显示。
-webkit-box-orient:vertical; // 设置伸缩盒子的子元素排列方式:从上到下垂直排列
-webkit-line-clamp:3;        // 显示的行数

8.✅什么是盒子模型?

  • box-sizeing: content-box标准盒模型的 width 和 height 属性的范围只包含了 content。
  • box-sizeing: border-boxIE 盒模型的 width 和 height 属性的范围包含了 border、padding 和 content。

9.✅CSS 优化和提高性能的方法有哪些?

  • 加载性能: css 压缩;css单一样式;减少使用@import,建议使用link
  • 选择器性能:
    • 关键选择器:选择器的最后面的部分为关键选择器(即用来匹配目标元素的部分)。
    • 避免使用通配规则;尽量少的去对标签进行选择,而是用class;尽量少的去使用后代选择器,降低选择器的权重值。
  • 渲染性能:
    • 慎重使用高性能属性:浮动、定位;尽量减少页面重排、重绘;去除空规则:{} ;标准化各种浏览器前缀
    • 不使用@import前缀;选择器优化嵌套;css雪碧图;正确使用display的属性;不滥用web字体
  • 可维护性、健壮性:
    • 将具有相同属性的样式抽离出来;样式与内容分离

10.✅z-index 属性在什么情况下会失效?

  • 父元素 position 为 relative 时,子元素的 z-index 失效。解决:父元素 position 改为 absolute 或 static;
  • 元素没有设置 position 属性为非 static 属性。解决:设置该元素的 position 属性为 relative,absolute 或是 fixed 中的一种;
  • 元素在设置 z-index 的同时还设置了 float 浮动。解决:float 去除,改为 display:inline-block;

11.✅说一下对 requestAnimationframe 的理解?

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。

用cancelAnimationFrame()来取消执行动画

优势

  • CPU 节能、函数节流、减少DOM操作

12.说一下媒体查询/栅格布局?

  • 使用 @media 查询,可以针对不同的媒体类型定义不同的样式

  • <!-- link元素中的CSS媒体查询 --> 
    <link rel="stylesheet" media="(max-width: 800px)" href="example.css" /> 
    <!-- 样式表中的CSS媒体查询 --> 
    <style> 
    @media (max-width: 600px) { 
      .facet_sidebar { 
        display: none; 
      } 
    }
    </style>
    
    

13.说一下隐藏元素的方法有哪些?

  • display: none:渲染树不会包含该渲染对象,因此该元素不会在页面中占据位置,也不会响应绑定的监听事件。

  • visibility: hidden:元素在页面中仍占据空间,但是不会响应绑定的监听事件

  • opacity: 0:将元素的透明度设置为 0,以此来实现元素的隐藏。元素在页面中仍然占据空间,并且能够响应元素绑定的监听事件。

  • position: absolute:通过使用绝对定位将元素移除可视区域内,以此来实现元素的隐藏。

  • z-index: 负值:来使其他元素遮盖住该元素,以此来实现隐藏。

  • clip/clip-path :使用元素裁剪的方法来实现元素的隐藏,这种方法下,元素仍在页面中占据位置,但是不会响应绑定的监听事件。

  • transform: scale(0,0):将元素缩放为 0,来实现元素的隐藏。这种方法下,元素仍在页面中占据位置,但是不会响应绑定的监听事件。

14.CSS3 中的 transform 有哪些属性?

  • translate 位移
  • rotate 旋转
  • scale 缩放
  • skew 斜切

15.说一下display:none 与 visibility:hidden 的区别?

(1)在渲染树中

  • display:none会让元素完全从渲染树中消失,渲染时不会占据任何空间;
  • visibility:hidden不会让元素从渲染树中消失,渲染的元素还会占据相应的空间,只是内容不可见

(2)是否是继承属性

  • display:none非继承属性,子孙节点会随着父节点从渲染树消失,通过修改子孙节点的属性也无法显示;
  • visibility:hidden继承属性,子孙节点消失是由于继承了hidden,通过设置visibility:visible可以让子孙节点显示;

(3)修改常规文档流中元素的 display 通常会造成文档的重排,但是修改visibility属性只会造成本元素的重绘

(4)如果使用读屏器,设置为display:none的内容不会被读取,设置为visibility:hidden的内容会被读取

16.为什么有时候⽤translate来改变位置⽽不是定位?

translatetransform属性的⼀个值。改变transform或opacity不会触发浏览器重新布局(reflow)或重绘(repaint),只会触发复合(compositions)。⽽改变绝对定位会触发重新布局,进⽽触发重绘和复合。transform使浏览器为元素创建⼀个 GPU 图层,但改变绝对定位会使⽤到 CPU。 因此translate()更⾼效,可以缩短平滑动画的绘制时间,可以减少回流。 ⽽translate改变位置时,元素依然会占据其原始空间,绝对定位就不会发⽣这种情况。

17.对 CSS Sprites 的理解?

  • 精灵图减少http请求 ,提高了页面的性能,能减少图片的字节
  • 使用background-image,background-repeat,background-position 属性的组合进行背景定位

18.什么是物理像素,逻辑像素和像素密度,为什么在移动端开发时需要用到@3x, @2x 这种图片?

  • 使用 CSS 媒体查询来判断不同的像素密度,从而选择不同的图片
@media only screen and (min-device-pixel-ratio: 1.5) {
  #my-image { background: (high.png); }
}

19.dispaly:inline-block什么时候会产生间隙?

  • 有空格时会有间隙,可以删除空格解决;
  • margin正值时,可以让margin使用负值解决;
  • 使用font-size时,可通过设置font-size:0、letter-spacing、word-spacing解决;

20.对 CSS 工程化的理解?

  • 使用less/sass/stylus/postcss/css in js 实现复用,简便开发,便于扩展

21. li 与 li 之间有看不见的空白间隔是什么原因引起的?如何解决?

浏览器会把inline内联元素间的空白字符(空格、换行、Tab等)渲染成一个空格。为了美观,通常是一个<li>放在一行,这导致<li>换行后产生换行字符,它变成一个空格,占用了一个字符的宽度。

因此需要将<li>内的字符间隔设为默认letter-spacing:normal

22. 常见的图片格式及使用场景

(1)BMP,是无损的、既支持索引色也支持直接色的点阵图。

(2)GIF是无损的、采用索引色的点阵图。采用LZW压缩算法进行编码。

(3)JPEG是有损的、采用直接色的点阵图。

(4)PNG-8是无损的、使用索引色的点阵图。

(5)PNG-24是无损的、使用直接色的点阵图。

(6)SVG是无损的矢量图。

(7)WebP是谷歌开发的一种新图片格式,WebP是同时支持有损和无损压缩的、使用直接色的点阵图。

  • 在无损压缩的情况下,相同质量的WebP图片,文件大小要比PNG小26%;
  • 在有损压缩的情况下,具有相同图片精度的WebP图片,文件大小要比JPEG小25%~34%;
  • WebP图片格式支持图片透明度,一个无损压缩的WebP图片,如果要支持透明度只需要22%的格外文件大小。

23. 对line-height 的理解及其赋值方式

(1)line-height的概念:

  • line-height 指一行文本的高度,包含了字间距,实际上是下一行基线到上一行基线距离;
  • 如果一个标签没有定义 height 属性,那么其最终表现的高度由 line-height 决定;一个容器没有设置高度,那么撑开容器高度的是 line-height,而不是容器内的文本内容;
  • 把 line-height 值设置为 height 一样大小的值可以实现单行文字的垂直居中;line-height 和 height 都能撑开一个高度;

(2)line-height 的赋值方式:

  • 带单位:px 是固定值,而 em 会参考父元素 font-size 值计算自身的行高
  • 纯数字:会把比例传递给后代。例如,父级行高为 1.5,子元素字体为 18px,则子元素行高为 1.5 * 18 = 27px
  • 百分比:将计算后的值传递给后代

二、定位与浮动

1.✅清除浮动有哪些方式?

浮动的定义: 非IE浏览器下,容器不设高度且子元素浮动时,容器高度不能被内容撑开。 此时,内容会溢出到容器外面而影响布局。这种现象被称为浮动(溢出)。

浮动的工作原理:

  • 浮动元素脱离文档流,不占据空间(引起“高度塌陷”现象)
  • 浮动元素碰到包含它的边框或者其他浮动元素的边框停留

清除浮动的方式如下:

  • 给父级 div 定义height属性
  • 最后一个浮动元素之后添加一个空的 div 标签,并添加clear:both样式
  • 包含浮动元素的父级标签添加overflow:hidden或者overflow:auto
  • 使用 :after 伪元素。由于 IE6-7 不支持 :after,使用 zoom:1
.clearfix:after{
    content: "\200B";
    display: table; 
    height: 0;
    clear: both;
  }
  .clearfix{
    *zoom: 1;  /*ie6清除浮动的方式 *号只有IE6-IE7执行,其他浏览器不执行*/
  }

2.✅clear 属性清除浮动的原理?

  • 官方对 clear 属性解释:“元素盒子的边不能和前面的浮动元素相邻”,对元素设置 clear 属性是为了避免浮动元素对该元素的影响,而不是清除掉浮动。
  • clear 属性只有块级元素才有效的,而::after 等伪元素默认都是内联水平,这就是借助伪元素清除浮动影响时需要设置 display 属性值的原因。

3.✅margin 重叠问题?如何解决?

  • 两个块级元素外边距可能重叠为一个外边距,只会出现在垂直方向
  • 解决:
    • 父子之间重叠
      • 父元素加入:overflow: hidden;父元素添加透明边框:border:1px solid transparent;子元素变为行内盒子:display: inline-block;子元素加入浮动属性或定位;兄弟之间重叠可以底部元素display:inline-block
    • 兄弟之间重叠
      • 底部元素变为行内盒子:display: inline-block;底部元素设置浮动:float;底部元素的position的值为absolute/fixed

4.✅BFC 是什么?怎么创建BFC?

创建BFC的条件:

  • 根元素:body;
  • 元素设置浮动:float 除 none 以外的值;
  • 元素设置绝对定位:position (absolute、fixed);
  • display 值为:inline-block、table-cell、table-caption、flex 等;
  • overflow 值为:hidden、auto、scroll;

BFC的特点:

  • 垂直方向上,自上而下排列,和文档流的排列方式一致。
  • 在BFC中上下相邻的两个容器的margin会重叠
  • 计算BFC的高度时,需要计算浮动元素的高度
  • BFC区域不会与浮动的容器发生重叠
  • BFC是独立的容器,容器内部元素不会影响外部元素
  • 每个元素的左margin值和容器的左border相接触

BFC的作用:

  • 解决margin的重叠问题:由于BFC是一个独立的区域,内部的元素和外部的元素互不影响,将两个元素变为两个BFC,就解决了margin重叠的问题。
  • 解决高度塌陷的问题:在对子元素设置浮动后,父元素会发生高度塌陷,也就是父元素的高度变为0。解决这个问题,只需要把父元素变成一个BFC。常用的办法是给父元素设置overflow:hidden
  • 创建自适应两栏布局:可以用来创建自适应两栏布局:左边的宽度固定,右边的宽度自适应。

5.✅position 的属性/作用有哪些?

  • absolute\relative\fixed\static\inherit
属性值概述
relative生成相对定位的元素,相对于其原来的位置进行定位。元素的位置通过left、top、right、bottom属性进行规定。
absolute生成绝对定位的元素,相对于static定位以外的一个父元素进行定位。元素的位置通过left、top、right、bottom属性进行规定。
fixed生成绝对定位的元素,指定元素相对于屏幕视⼝(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变,⽐如回到顶部的按钮⼀般都是⽤此定位⽅式。
static默认值,没有定位,元素出现在正常的文档流中,会忽略 top, bottom, left, right 或者 z-index 声明,块级元素从上往下纵向排布,⾏级元素从左向右排列。
inherit规定从父元素继承position属性的值

6.✅sticky 定位怎么使用?是在哪两个定位间切换?

  • 如设置top:0可以粘滞效果,在fixed和relative直接切换
  • 语法:position: sticky; 基于用户的滚动位置来定位。
  • 粘性定位的元素是依赖于用户的滚动,在 position:relativeposition:fixed 定位之间切换。

7.absolute 与 fixed 共同点与不同点?

共同点:

  • 改变行内元素的呈现方式,将 display 置为 inline-block
  • 使元素脱离普通文档流,不再占据文档物理空间
  • 覆盖非定位文档元素

不同点:

  • abuselute与fixed的根元素不同,abuselute的根元素可以设置,fixed根元素是浏览器。
  • 在有滚动条的页面中,absolute会跟着父元素进行移动,fixed固定在页面的具体位置。

8.display、float、position 的关系?

总的来说,可以把它看作是一个类似优先级的机制,"position:absolute"和"position:fixed"优先级最高,有它存在的时候,浮动不起作用,'display’的值也需要调整;其次,元素的’float’特性的值不是"none"的时候或者它是根元素的时候,调整’display’的值;最后,非根元素,并且非浮动元素,并且非绝对定位的元素,'display’特性值同设置值。

9.说一下元素的层叠顺序?

(1)背景和边框:建立当前层叠上下文元素的背景和边框。

(2)负的 z-index:当前层叠上下文中,z-index 属性值为负的元素。

(3)块级盒:文档流内非行内级非定位后代元素。

(4)浮动盒:非定位浮动元素。

(5)行内盒:文档流内行内级非定位后代元素。

(6)z-index:0:层叠级数为 0 的定位元素。

(7)正 z-index:z-index 属性值为正的定位元素。

三、布局问题

1.✅常见的 CSS 布局单位px、em、rem、vw/vh 的区别及使用场景?

常用的布局单位包括像素(px),百分比(%),emremvw/vh

  • em和rem相对于px更具灵活性,它们都是相对长度单位,它们之间的区别:em相对于父元素,rem相对于根元素。
  • vw/vh是与视图窗口有关的单位,vw表示相对于视图窗口的宽度vh表示相对于视图窗口高度,除了vw和vh外,还有vmin和vmax两个相关的单位。
    • vw:相对于视窗的宽度,视窗宽度是100vw;vh:相对于视窗的高度,视窗高度是100vh;
    • vmin:vw和vh中的较小值;vmax:vw和vh中的较大值;

2.✅Flex 布局/grid 布局的区别?

  • Flexbox 是一维布局系统,适合做局部布局,比如导航栏组件。
  • Grid 是二维布局系统,通常用于整个页面的规划
  • 二者从应用场景来说并不冲突。虽然 Flexbox 也可以用于大的页面布局,但是没有 Grid 强大和灵活。二者结合使用更加轻松

3.✅三栏布局怎么实现?

三栏布局一般指的是页面中一共有三栏,左右两栏宽度固定,中间自适应的布局,三栏布局的具体实现:

  • 绝对定位,中间绝对定位,两边margin值
  • 浮动,两边固定大小,对应方向浮动,中间设置margin值,且中间一栏放最后
  • 利用flex:1
  • 利用grid-template-rows
  • 圣杯布局:利用浮动和负边距来实现,margin 负值将其移动到上一行
  • 双飞翼布局:双飞翼布局相对于圣杯布局来说,左右位置的保留是通过中间列的 margin 值来实现的,而不是通过父元素的 padding 来实现的。本质上来说,也是通过浮动和外边距负值来实现的。

4.✅水平垂直居中有哪些方式?

  • 绝对定位:子绝父相 。 该方法需要考虑浏览器兼容问题。
.parent {    position: relative;} .child {    position: absolute;    left: 50%;    top: 50%;    transform: translate(-50%,-50%); }
  • 利用绝对定位,设置四个方向的值都为0,并将margin设置为auto,由于宽高固定,因此对应方向实现平分,可以实现水平和垂直方向上的居中。该方法适用于盒子有宽高的情况:
.parent {
    position: relative;
}
.child {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}
  • 利用绝对定位,先将元素的左上角通过top:50%和left:50%定位到页面的中心,然后再通过margin负值来调整元素的中心点到页面的中心。该方法适用于盒子宽高已知的情况
.parent {
    position: relative;
}
.child {
    position: absolute;
    top: 50%;
    left: 50%;
    margin-top: -50px;     /* 自身 height 的一半 */
    margin-left: -50px;    /* 自身 width 的一半 */
}
  • flex 布局:align-items:centerjustify-content:center
.parent {
    display: flex;
    justify-content:center;
    align-items:center;
}

5.说一下两栏布局如何实现?

一般两栏布局指的是左边一栏宽度固定,右边一栏宽度自适应

  • 利用浮动,将左边元素宽度设置为200px,并且设置向左浮动。将右边元素的margin-left设置为200px,宽度设置为auto(默认为auto,撑满整个父元素)。
  • 利用浮动,左侧元素设置固定大小,并左浮动,右侧元素设置overflow: hidden; 这样右边就触发了BFC,BFC的区域不会与浮动元素发生重叠,所以两侧就不会发生重叠。
  • 利用flex布局,将左边元素设置为固定宽度200px,将右边的元素设置为flex:1。
  • 利用绝对定位,将父级元素设置为相对定位。

6.怎么根据设计稿进行移动端适配?

  • 为了能让页面的尺寸自适应,可以使用 rem,em,vw,vh 等相对单位。
  • 适配不同像素密度
  • 适配不同屏幕大小

7.响应式设计的概念及基本原理?

  • 基本原理是通过媒体查询(@media)查询检测不同的设备屏幕尺寸做处理。

8.说一下grid布局?

四、场景应用/如何实现

1.✅怎么实现一个三角形/梯形?

  • 设置宽高为0,三边透明,一边带颜色

2.✅怎么实现一个扇形?

div{
    border: 100px solid transparent;
    width: 0;
    heigt: 0;
    border-radius: 100px;
    border-top-color: red;
}

3.✅怎么画一条0.5px的线?

  • 采用transform: scale()的方式,该方法用来定义元素的2D 缩放转换:
transform: scale(0.5,0.5);
复制代码
  • 采用meta viewport的方式
<meta name="viewport" content="width=device-width, initial-scale=0.5, minimum-scale=0.5, maximum-scale=0.5"/>
复制代码

这样就能缩放到原来的0.5倍,如果是1px那么就会变成0.5px。viewport只针对于移动端,只在移动端上才能看到效果

4.✅怎么设置小于12px的字体?

  • -webkit-transform:scale(0.5);
  • 使用图片

5.✅如何解决1px的问题?

window.devicePixelRatio = 设备的物理像素 / CSS像素。
  • JSX解决

    <div id="container" data-device={{window.devicePixelRatio}}></div>
    #container[data-device="2"] {  border:0.5px solid #333}
    
  • 利用tranform:scale(0.5)

6.✅如何判断元素是否到达可视区域?

  • window.innerHeight 是浏览器可视区的高度;
  • document.body.scrollTop || document.documentElement.scrollTop 是浏览器滚动的过的距离;
  • imgs.offsetTop 是元素顶部距离文档顶部的高度(包括滚动条的距离);
  • 内容达到显示区域的:img.offsetTop < window.innerHeight + document.body.scrollTop;

7.怎么实现一个宽高自适应的正方形?

.square {
    width: 10%;
    height: 10vw;
    background: tomato;
  }

8.响应式布局中margin和margin-top的百分比?

  • 是相对于父元素的width,跟height没关系

五、补充

✅1.CSS阻塞

  • CSS不会阻塞DOM解析,但是会阻塞DOM渲染,严谨一点则是CSS会阻塞render tree的生成,进而会阻塞DOM的渲染
  • JS会阻塞DOM解析
  • CSS会阻塞JS的执行

2.高斯模糊

  • filter:blur(5px)

filter CSS属性将模糊或颜色偏移等图形效果应用于元素。滤镜通常用于调整图像,背景和边框的渲染。

filter - CSS(层叠样式表) | MDN (mozilla.org)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MC猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值