category: interviewer
date: 2023-5-9
CSS
1. 说一下 css 盒模型
- box-sizing:border-box/padding-box/content-box.
- 标准盒模型(content-box):width =content
- IE盒模型(border-box):width =content+padding+border
2. 画一条 0.5px 的线
- 采用 border-image 的方式
- 采用 transform: scale()的方式
3. link 标签和 import 标签的区别
- link 属于 html 标签,而@import 是 css 提供的
- 页面被加载时,link 会同时被加载,而@import 引用的 css 会等到页面加载结束后加载。
- link 是 html 标签,因此没有兼容性,而@import 只有 IE5 以上才能识别。
- link 方式样式的权重高于@import 的。
4. transition 和 animation 的区别
Animation 和 transition 大部分属性是相同的,他们都是随时间改变元素的属性值,
- 主要区别是 transition 需要触发一个事件才能改变属性,animation 不需要触发任何事件的
- 并且 transition 为 2 帧,从 from … to,而 animation 可以一帧一帧的。
5. Flex 布局有哪些属性
父容器:
- 子元素排列方向
flex-direction: row | row-reverse | column | column-reverse;
- 换行方式:
flex-wrap: nowrap | wrap | wrap-reverse;
- 方向|换行方式;
flex-flow: <flex-direction> || <flex-wrap>;
- 水平主轴对齐方式:
justify-content:flex-start | flex-end | center | space-between | space-around
- 竖直轴线方向:
align-items:flex-start | flex-end | center | baseline | stretch
- 修改 flex-wrap 属性的行为, 设置各行对齐方式:
align-content: flex-start | flex-end | center | space-between | space-around | stretch
子元素:
- 排列顺序,顺序越小,排列越靠前:
order:num
默认为 0 - “margin"值为"auto”,自动获取容器剩余空间
- 自身在纵轴方向上的对齐方式:
align-self: auto(默认,继承父亲) | flex-start | flex-end | center | baseline | stretch
- 分配空间,占总量的比值:
flex: auto | initial | none | inherit | [ flex-grow ] || [ flex-shrink ] || [ flex-basis ]
- auto: 计算值为 1 1 auto
- initial: 默认值为 0 1 auto
- none:计算值为 0 0 auto
- inherit:从父元素继承
- [ flex-grow ]:元素的扩展比率。
- [ flex-shrink ]:当空间不足时的收缩比率。 0,则为不缩小
- [ flex-basis ]:分配多余空间。
6. BFC
块级格式化上下文,是一个独立的渲染区域,BFC是一个完全独立的空间(布局环境),让空间里的子元素不会影响到外面的布局
BFC触发条件:
- float 不为 none 的元素
- position 为 fixed 和 absolute 的元素
- display 为 inline-block、table-cell、table-caption,flex,inline-flex 的元素
- overflow 不为 visible 的元素
BFC规则:
- 内部的Box会在垂直方向,一个接一个地放置。
- 计算 BFC 的高度时,浮动元素也会参与计算
- Box垂直方向的距离由margin决定,属于同一个BFC的两个相邻的标签外边距会发生重叠
- 如果想要避免外边距的重叠,可以将其放在不同的 BFC 容器中。
- BFC的区域不会与float box重叠,可以避免被隔壁浮动元素覆盖
应用场景
- 避免margin重叠
- 两栏布局自适应
- 清除浮动,解决高度塌陷
7.垂直居中的方法
margin:auto
flex,水平垂直:center margin: auto
absolute + 四边位置都为0
absolute + top/left:50%. + margin-top/left:-height/width
table-cell + verticel-align: middle + text-align: center
8. JS 动画和 css3 动画的差异性
- CSS 动画得以在 compositor trhead 完成
- CSS 动画则会在 main thread 执行
- CSS3 比 JS 更加简单,性能跳优方向固定对帧速表现不好的低版本浏览器,css3 可以做到自然降级
- css 动画有天然事件支持
- css3 有兼容性问题
9. 块元素和行元素
块元素: width / height /margin/padding ,自动填充父元素
行内元素:width / height /margin/padding ,内容撑开
行内元素:没有width / height /margin/padding
10.visibility=hidden, opacity=0,display:none 区别
opacity=0
:不改变布局,相当于元素透明了,但元素绑定的事件还能触发visibility=hidden
不改变布局,但元素绑定的事件不会触发display:none
: 改变布局,元素从页面中删除
11. 双边距重叠问题
多个相邻(兄弟或者父子关系)普通流的块元素垂直
方向 marigin 会重叠
计算规则为:
- 两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值。
- 都是负数时,折叠结果是两者绝对值的较大值。
- 一正一负时,折叠结果是两者的相加的和。
12. position 属性
- 固定定位 fixed: 相对窗口定位,脱离文档流不占空间
- 相对定位 relative:相对自身所在位置,移动后原本占的空间不改变
- 绝对定位 absolute:相对最近的已定位祖先元素定位,如果没有,就相对html,脱离文档流,不占空间
- 粘性定位 sticky: 先根据正常文档流定位,滚动后,基于 top、right、bottom 和 left 的值进行偏移,“固定”在离它最近的一个拥有“滚动机制”的祖先上(当该祖先的 overflow 是 hidden、scroll、auto 或 overlay 时)
- 默认定位 Static:没有定位,忽略top, bottom, left, right 或者 z-index
- 继承定位 inherit: 继承父元素定位
13.浮动清除
- 浮动元素后面添加一个空的的元素,清除浮动
.clear{clear:both;}
- 给容器添加浮动
- 容器触发BFC
- 容器添加:after 伪元素,
display: block; height: 0; clear: both; visibility: hidden;
14. css3 新特性
- border-radius,
- box-shadow
- flex
- background-size,background-origin,background-clip
- background-image渐变背景
- text-shadow
- word-wrap:break-word;换行
- 2D:transform:translate()/rotate()/scale()/skew()/matrix(n,n,n,n,n,n)(旋转,缩放,平移,倾斜)
- 3D: translate3d(x,y,z)/scale3d(x,y,z)/rotate3d(x,y,z,angle)/matrix3d(n,n,n,n,n,n,
n,n,n,n,n,n,n,n,n,n) - transition
- animation
15.CSS 选择器有哪些,优先级呢
!important > 内联 > id > class/属性选择器/伪类选择器 > tagName / 伪装元素
16.css 动画如何实现
- animation:定义动画名字,时间,方向,次数,延时,
- @keyframes 定义动画具体实现
- transition 事件触发,强调过度效果
17. CSS3 中对溢出的处理
text-overflow: clip 【剪裁】|ellipsis 【省略号】|string【使用给定字符串表示】|initial【正常显示】|inherit;【继承父】
18.三栏布局
- 左右浮动,中间用margin打开左右两边位置
- 左右absolute,中间用margin
- table和table-cell, border-space
- flex比例自适应
- 使用grid
19. calc 属性
动态计算长度值, width: calc(100% - 10px);
20. display:table 和本身的 table 有什么区别
- Display:table,写出来的文件比较小,加载速度快,可以轻松单元格的边界和样式
- div的table时逐行显示,table标签完全加载完才显示
- table 的嵌套性太多,没有 div 简洁
21. line-height 和 height 的区别
- line-height是指行高
- height 是指容器高度
22.背景颜色会填充哪些区域
- content、padding、border 区域
23.选择器有多少种
*
- id
- class
- 标签
- 组合:
- 多元素选择器:E,F
- 后代元素选择器:E F
- 子元素选择器:E>F
- 毗邻兄弟元素选择器:E+F
- 属性选择器
- *[att],选择所有具有att属性的元素
- E[att] ,选择所有具有att属性的E元素
- E[att=“value”],选择所有具有att属性,且att属性的值为value的E元素
- E[att~=“value”],选择所有具有att属性,且att属性的其中一个值为value的E元素
- a[href][title] 所用具有href 和title的a标签
- 伪类选择器
link、visited、hover、active
p:first-child
:p元素且是父元素的第一个子元素::first-line
:只作用于块级元素::first-letter
只作用于块级元素::before
:元素内容之前插入一些内容::after
:元素内容之后插入一些内容::selection
:用户所选定的元素部分
24.伪类和伪元素的区别
-
伪类:是有元素,处于某个状态,单冒号
-
伪元素: 附加在选择器上关键字,不属于DOM树上真正的元素,只是元素特定部分的内容,双冒号开始
::before/::after/::first-letter/::first-line/::marker /::selection/::placeholder
25. inline-block、inline 和 block 的区别;为什么 img 是 inline 还可以设置宽高
- block 默认占满父元素一整行(前后有换行符),有宽高margin/padding
- inline-block 内容撑开宽度,有宽高margin/padding, (前后无换行符)
- inline:padding四面都有效,margin上下无效左右有效,宽高无效,(前后无换行符)
- img 是 inline 还可以设置宽高,因为img是可替换元素,拥有内置宽高
26. vertical-align
vertical-align
只对行内元素、表格单元格元素生效。
vertical-align: baseline | sub | super | text-top | text-bottom | middle | top | bottom | <percentage> | <length>;
27. 重绘和重排
- 重绘(repaint)和重排(reflow)是指浏览器对网页进行重新渲染的过程
- 重排会导致元素的尺寸、位置、内容等属性的变化,因此需要重新计算布局信息
- 重绘则是在元素的位置和尺寸等属性不变的情况下,重新绘制元素的样式
导致重排因素:
- 添加、删除或更改DOM元素。
- 修改元素的尺寸、位置、边距、填充、边框等样式属性。
- 修改页面的字体大小、样式等。
- 用户交互事件,如窗口大小改变、滚动等。
导致重绘因素:
- 修改元素的背景色、边框颜色等样式属性。
- 添加或删除元素的伪类,如:hover等。
- 操作canvas、SVG等图形元素。
重排和重绘都会对网页性能产生影响,但重排的影响更为严重,因为它需要重新计算布局信息。因此,我们需要尽可能减少重排的次数,从而提高网页性能。
- 重排的影响:重排是比较消耗性能的操作,因为它需要重新计算元素的布局信息。频繁的重排会导致网页的响应速度变慢,页面卡顿,用户体验不佳。
- 重绘的影响:相对于重排,重绘的影响较小,因为它只需要重新绘制元素的样式,不需要重新计算布局信息。但是,如果重绘操作频繁,也会对网页性能产生一定的影响。
如何减少重排和重绘
- 避免频繁的DOM操作,减少DOM操作的次数,一次性添加/删除多个DoM,而不是一个一个地修改
- 使用CSS3动画:CSS3动画可以使用GPU加速,减少重排和重绘的次数,JavaScript实现的动画是通过操作DOM实现,则会导致频繁的重排和重绘。
- 避免使用table布局:table布局比较复杂,会导致频繁的重排和重绘
- 使用CSS Sprite:CSS Sprite可以减少图片的请求次数,从而减少重排和重绘的次数。
- 减少重复的样式代码,避免频繁的样式更改,减少重排和重绘的次数。
- 用position:absolute或fixed定位:使用position:absolute或fixed定位可以脱离文档流,减少重排的次数。
- 将样式表放在头部:将样式表放在头部可以避免样式表的延迟加载,减少重排和重绘的次数。
29.两个嵌套的div,position都是absolute,子div设置top属性,那么这个top 是相对于父元素的哪个位置定位的。
margin 的外边缘
30. css 预处理器有什么
CSS不像其它编程语言能够定义变量、常量、条件语句等,只是单纯地进行属性描述,写起来很费事,而且代码难以组织和维护。
css 预处理器是用一种专门的编程语言,为CSS增加一些编程特性,将CSS作为目标生成文件,
但核心功能:嵌套/变量/mixin/继承/运算/模块化
常见的css 预处理器:Sass(Scss), Less, Stylus
PostCSS被成为CSS后处理器,提供了一种方式可以用JavaScript代码来处理CSS,
- 可以支持变量和混入
- 增加浏览器相关的声明前缀
- 把使用将来的CSS规范的样式规则转译成当前的CSS规范支持的格式