CSS 面试题汇总

什么是盒子模型?

在网页中,一个元素占有空间的大小由元内容(content),内边距(padding),边框(border),外边距(margin)四个部分。有的部分可以显示相应的内容,而有的部分只用来分隔相邻的区域或区域。4个部分一起构成了css中元素的盒模型。
共有两种盒子模型:
W3C标准盒模型: 属性width,height包含content,不包含border和padding
IE盒模型: 属性width,height包含content,border,padding

box-sizing属性?

用来控制元素的盒子模型的解析模式,默认为content-box
context-box:设置元素的 height/width 属性指的是content部分的高/宽
border-box:设置元素的height/width属性指的是border + padding + content部分的高/宽

什么是css Hack?

就是针对不同的浏览器写不同css样式。css hack一般来说是为了兼容IE浏览器的。
IE浏览器Hack一般又分为三种: 条件Hack、属性Hack、选择器Hack。

为什么要初始化CSS样式?

因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。

CSS选择器有哪些?哪些属性可以继承?

id选择器(#myid)、类选择器(.myclassname)、标签选择器(div, h1, p)、相邻选择器(h1 + p)、子选择器(ul > li)、后代选择器(li a)、通配符选择器(*)、属性选择器(a[rel="external"])、伪类选择器(a:hover, li:nth-child)

可继承的属性:font-size, font-family, color
不可继承的样式:border, padding, margin, width, height

优先级(就近原则):!important > id > class > tag ( !important 比内联优先级高 )

元素选择符: 1
class选择符: 10
id选择符:100
内联样式:1000

!important声明的样式优先级最高,如果冲突再进行计算。
如果优先级相同,则选择最后出现的样式。
继承得到的样式的优先级最低。

CSS3新增伪类有那些?

p:first-of-type 选择属于其父元素的首个元素
p:last-of-type 选择属于其父元素的最后元素
p:only-of-type 选择属于其父元素唯一的元素
p:only-child 选择属于其父元素的唯一子元素
p:nth-child(2) 选择属于其父元素的第二个子元素
:enabled :disabled 表单控件的禁用状态。
:checked 单选框或复选框被选中。

伪类选择器和伪元素的区别

伪类用于向某些选择器添加特殊效果 (单冒号)
伪元素用于将某个特殊的东西添加到某些元素的前后 (双冒号)

display有哪些值?说明他们的作用?

bloc 块类型。默认宽度为父元素宽度,可设置宽高,换行显示
none 元素不显示,并从文档流中移除
inline 行内元素,默认宽度为内容宽度,不可设置宽高,同行显示
inline-block 默认宽度为内容宽度,可以设置宽高,同行显示
list-item 像块类型元素一样,可以设置宽高,同行显示
table 此元素会作为会计表格来显示
inherit 规定应该从父元素继承display属性的值

position的值?

static(默认):按照正常文档流进行排列;
relative(相对定位):不脱离文档流,参考自身静态位置通过 top, bottom, left, right 定位;
absolute (绝对定位):参考距其最近一个不为static的父级元素通过top, bottom, left, right 定位;
fixed (固定定位):所固定的参照对像是可视窗口。

CSS里的 visibility 属性有个 collapse 属性值?在不同浏览器下以后什么区别?

当一个元素的 visibility 属性被设置成 collapse 值后,对于一般的元素,它的表现跟 hidden 是一样的。
chrome 中,使用 collapse 值和使用 hidden 没有区别。
firefox,opera和IE,使用collapse值和使用display:none没有什么区别。

display:none 与 visibility:hidden的区别?

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

img、inline-block 的 3 像素问题如何解决?

父标签增加font-size:0
标签增加display:block
标签增加vertical-align: middle
标签增加float:left

flex布局中 flex 的默认值是多少

2009年,W3C提出了一种新的方案:Flex布局,可以简便、完整、响应式地实现各种页面布局。
Flex是Flexible Box的缩写,意为弹性布局,用来为盒状模型提供最大的灵活性。
任何一个容器都可以指定为Flex布局。

.box{
display: flex;
}
行内元素也可以使用Flex布局

box{
display: inline-flex;
}
采用Flex布局的元素,称为Flex容器(flex container),简称容器。
所有子元素自动成为容器成员,称为Flex项目(flex item),简称项目。

设置在容器上的属性有:

flex-direction: row | row-reverse | column | column-reverse;
决定主轴的方向,即项目的排列方向
flex-wrap: nowrap | wrap | wrap-reverse;
如果一条轴线排不下,如何换行
flex-flow: <flex-direction> <flex-wrap>;
flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap
justify-content: flex-start | flex-end | center | space-between | space-around;
定义了项目在主轴上的对齐方式
align-items: flex-start | flex-end | center | baseline | stretch;
定义项目在交叉轴上如何对齐
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用
设置在项目上的属性有:

order: <integer> /* default 0 /
定义项目的排列顺序,数值越小,排列越靠前
flex-grow: <number>; /
default 0 /
定义项目的放大比例, 即如果存在剩余空间,也不放大
flex-shrink: <number>; /
default 1/
flex-shrink属性定义了项目的缩小比例,默认为1即如空间不足时项目缩小
flex-basis: <length> | auto; /
default auto*/
flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)
默认为auto即项目的本来大小
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选
align-self: auto | flex-start | flex-end | center | baseline | stretch;
允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。
默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch
.CSS优化、提高性能的方法有哪些?
避免过度约束
避免后代选择符
避免链式选择符
使用紧凑的语法
避免不必要的命名空间
避免不必要的重复
最好使用表示语义的名字。一个好的类名应该是描述他是什么而不是像什么
避免!important,可以选择其他选择器
尽可能的精简规则,你可以合并不同类里的重复规则
.你对line-height是如何理解的?
行高是指一行文字的高度,具体说是两行文字间基线的距离。CSS中起高度作用的是height和line-height,没有定义height属性,最终其表现作用一定是line-height。
单行文本垂直居中:把line-height值设置为height一样大小的值可以实现单行文字的垂直居中,其实也可以把height删除。
多行文本垂直居中:需要设置display属性为inline-block。

.说一说BFC
块格式化上下文(Block Formatting Context,BFC)
用于对块级元素排版,默认情况下只有根元素(body)一个块级上下文。是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

触发条件,满足其一即可

body元素
float的值不为none;
overflow的值不为visible;
position的值为fixed / absolute;
display的值为table-cell / table-caption / inline-block / flex / inline-flex。
BFC作用

可以包含浮动元素——清除内部浮动
当给元素设置overflow: hidden时,实际上创建了一个超级属性BFC,此超级属性反过来决定了height:auto是如何计算的。在“BFC布局规则”中提到:计算BFC的高度时,浮动元素也参与计算。因此,父元素在计算其高度时,加入了浮动元素的高度,达成了清除浮动的目标,所以父元素就包裹住了子元素。
分属于不同的BFC时可以阻止margin重叠
兄弟、父子元素等之间之所以会发生margin合并,是因为它们属于同一个BFC。
所以只要让它们不属于同一个BFC就可以了,即加上overflow: hidden。
BFC布局规则

内部的块级元素会在垂直方向,一个接一个地放置;
块级元素垂直方向的距离由margin决定。
属于同一个BFC的两个相邻的块级元素会发生margin合并,不属于同一个BFC的两个相邻的块级元素不会发生margin合并;
每个元素的margin box的左边,与包含border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此;
BFC的区域不会与float box重叠;
BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素;外面的元素也不会影响到容器里面的子元素;
计算BFC的高度时,浮动元素也参与计算。
.说说回流和重绘
回流: 当Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程
如何引发回流? 页面首次渲染,浏览器窗口改变大小,元素尺寸或位置发生改变,元素内容变化(文字数量或图片大小等等),元素字体大小变化,DOM操作,激活CSS伪类(例如::hover)
查询某些属性或调用某些方法
scrollTo(),getComputedStyle(),scrollIntoView()、scrollIntoViewIfNeeded(),getBoundingClientRect()

重绘: 当页面中元素样式的改变并不影响它在文档流中的位置时(例如:color、background-color、visibility等),浏览器会将新样式赋予给元素并重新绘制它的过程。

浏览器使用流式布局模型。浏览器会把HTML解析成DOM,把CSS解析成CSSOM,DOM和CSSOM合并就产生了Render Tree。有了RenderTree,我们就知道了所有节点的样式,然后计算他们在页面上的大小和位置,最后把节点绘制到页面上。由于浏览器使用流式布局,对Render Tree的计算通常只需要遍历一次就可以完成,但table及其内部元素除外,他们可能需要多次计算,通常要花3倍于同等元素的时间,这也是为什么要避免使用table布局的原因之一。回流必将引起重绘,重绘不一定会引起回流

如何避免

1.避免使用table布局。
2.尽可能在DOM树的最末端改变class
3.避免设置多层内联样式
4.将动画效果应用到position属性为absolute或fixed的元素上。
5.避免使用CSS表达式(例如:calc())
6.避免频繁操作样式,最好一次性重写style属性,或将样式列表定义为class并一次性更改class属性
7.避免频繁操作DOM,创建一个documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中
8.先为元素设置display: none,操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘
9.避免频繁读取会引发回流/重绘的属性,如确实需要多次使用,就用一个变量缓存起来
10.对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流

.link 和 @import的区别
link是XHTML标签,除了加载CSS外,还可以定义RSS等其他事务;@import属于CSS范畴,只能加载CSS。
link引用CSS时,在页面载入时同时加载;@import需要页面网页完全载入以后加载。
link是XHTML标签,无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不支持。
link支持使用Javascript控制DOM去改变样式;而@import不支持。
.CSS单位都有哪些
%:
(1). margin,padding 是相对父元素的 宽度 计算的
(2). top,left,bottom,right 是相对于父元素的 高度 计算的
(3). translate 是相对自身元素来算的

px:像素
(1). em:1em 等于当前父元素的 font-size (浏览器默认16px,可继承,em 可以省略)
(2). rem:1rem 等于 html 根元素的 font-size
(3). vw,vh:视口宽度被均分成 100vw,视口高度被均分成 100vh。视口宽高是页面的可视区域,如键盘弹起安卓的视口宽高发生变化,但 iPhone 不会。(安卓4.4,iOS6以上支持)

vmax, vmin:
1.vmax = max(vw,vh)(vmax安卓4.4,iOS8以上支持)
2.vmin = min(vw,vh)(vmin安卓4.4,iOS6以上支持)

ex和ch:
1.ex以字符"x"的高度为基准;例如1ex表示和字符"x"一样长。
2.ch以数字"0"的宽度为基准;例如2ch表示和2个数字"0"一样长

.让页面里的字体变清晰,变细用CSS怎么做?
-webkit-font-smoothing在window系统下没有起作用,但是在IOS设备上起作用-webkit-font-smoothing:antialiased是最佳的,灰度平滑。

.li 与 li之间有看不见的空白间隔是什么原因引起的?有什么解决办法?
行框的排列会受到中间空白(回车空格)等的影响,因为空格也属于字符,这些空白也会被应用样式,占据空间,所以会有间隔,把字符大小设为0,就没有空格了。

解决方法:

可以将<li>代码全部写在一排
浮动li中float:left
在ul中用font-size:0(谷歌不支持);可以使用letter-space:-3px

CSS 写在 body前 和 body后 有什么区别

如果没有遇到jS阻塞,放哪里都一样,
如果遇到js阻塞,把CSS写在BODY上面,不会出现二次渲染,把CSS写在BODY下面,JS阻塞时,会出现一次渲染,等阻塞完毕会出现二次渲染(除非外链的CSS下载时间比阻塞时间长)。
.如何选择图片格式,例如 png, webp
图片格式 压缩方式 透明度 动画 浏览器兼容 适应场景
JPEG 有损压缩 不支持 不支持 所有 复杂颜色及形状、 尤其是照片
GIF 无损压缩 支持 支持 所有 简单颜色, 动画
PNG 无损压缩 支持 不支持 所有 需要透明时
APNG 无损压缩 支持 支持 FirefoxSafariiOS Safari 需要半透明效果的动画
WebP 有损压缩 支持 支持 ChromeOperaAndroid ChromeAndroid Browser 复杂颜色及形状浏览器平台可预知
SVG 无损压缩 支持 支持 所有(IE8以上) 简单图形,需要良好的放缩体验需要动态控制图片特效

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容