CSS 面试题
转载自帅地博客
1、css 优先级
- !important 会覆盖页面内任何位置的元素样式
- 内联样式,如 style=”color: green”,权值为 1000
- ID 选择器,如#app,权值为 0100
- 类、伪类、属性选择器,如.foo, :first-child, div[class=”foo”],权值为 0010
- 标签、伪元素选择器,如 div::first-line,权值为 0001
2、display的属性值及其作用
- 作用:
display 属性规定元素应该生成的框的类型,也就是说设置了display 属性的元素会根据 display 的取值在浏览器中进行不同的显示。
- 属性值:
none:元素不显示,并且会从文档流中移除
block:块类型,默认宽度为父元素宽度,可设置宽高,换行显示
inline:行内元素类型,默认宽度为内容宽度,不可设置宽高,同行显示
inline-block:默认宽度为内容宽度,可以设置宽高,同行显示
list-item:像块类型元素一样显示,并添加样式列表标记
table:此元素会作为块级表格来显示
inherit:规定应该从父元素继承 display 属性的值
3、display的block、inline和inline-block的区别
block: 会独占一行,多个元素会另起一行,可以设置 width、height、margin 和 padding 属性;
inline: 元素不会独占一行,设置 width、height 属性无效。但可以设置水平方向的 margin 和 padding 属性,不能设置垂直方向的 padding 和 margin;
inline-block:将对象设置为 inline 对象,但对象的内容作为 block 对象呈现,之后的内联对象会被排列在同一行内
4、行内元素和块级元素的特点
- 行内元素
设置宽高无效
可以设置水平方向的 margin 和 padding 属性,不能设置垂直方向的 padding 和 margin;
不会自动换行;
- 块级元素
可以设置宽高;
设置 margin 和 padding 都有效;
可以自动换行;
多个块状,默认排列从上到下。
5、隐藏元素的方法
display:none:渲染树不会包含该渲染对象,因此该元素不会在页面中占据位置,也不会响应绑定的监听事件
visibility:hidden:元素在页面中仍占据空间,但是不会响应绑定的监听事件
opacity: 0:将元素的透明度设置为 0,以此来实现元素的隐藏。元素在页面中仍然占据空间,并且能够响应元素绑定的监听事件
position: absolute:通过使用绝对定位将元素移除可视区域内,以此来实现元素的隐藏
z-index: 负值:来使其他元素遮盖住该元素,以此来实现隐藏
6、link和@import的区别
两者都是外部引用CSS的方式,它们的区别如下:
link引用CSS时,在页面载入时同时加载;@import需要页面网页完全载入以后加载
link是XHTML标签,无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不支持
link支持使用Javascript控制DOM去改变样式;而@import不支持
link是XHTML标签,除了加载CSS外,还可以定义RSS等其他事务;@import属于CSS范畴,只能加载CSS
7、transition 和 animation 的区别
- transition:
是过渡属性,强调过渡,它的实现需要触发一个事件(比如鼠标移动上去,焦点,点击等)才执行动画。它类似于flash的补间动画,设置一个开始关键帧,一个结束关键帧。
- animation:
是动画属性,它的实现不需要触发事件,设定好时间之后可以自己执行,且可以循环一个动画。它也类似于 flash 的补间动画,但是它可以设置多个关键帧(用@keyframe定义)完成动画
8、display:none 与 visibility:hidden 的区别
这两个属性都是让元素隐藏不可见,两者区别如下:
- 在渲染树中
display:none 会让元素完全从渲染树中消失,渲染时不会占据任何空间;
visibility:hidden 不会让元素从渲染树中消失,渲染的元素还会占据相应的空间,只是内容不可见
- 是否是继承属性
display:none 是非继承属性,子孙节点会随着父节点从渲染树消失,通过修改子孙节点的属性也无法显示;
visibility:hidden 是继承属性,子孙节点消失是由于继承了hidden,通过设置 visibility:visible 可以让子孙节点显示;
- 修改常规文档流中的元素
元素的 display 通常会造成文档的重排,但是修改visibility属性只会造成本元素的重绘
9、伪元素和伪类的区别和作用
伪元素与伪类的根本区别在于:
操作的对象元素是否存在于原来的dom结构里。
伪元素的操作对象是新生成的dom元素,而不是原来dom结构里就存在的;
而伪类恰好相反,伪类的操作对象是原来的dom结构里就存在的元素。
10、盒子模型
CSS3中的盒模型有以下两种:标准盒子模型、IE盒子模型
盒模型都是由四个部分组成的,分别是 margin、border、padding 和 content。
标准盒模型和IE盒模型的区别在于设置width和height时,所对应的范围不同
- 标准盒模型的 width 和 height 属性的范围只包含了 content,
- IE盒模型的 width 和 height 属性的范围包含了 border、padding 和 content
可以通过修改元素的 box-sizing 属性来改变元素的盒模型:
box-sizeing: content-box表示标准盒模型(默认值)box-sizeing: border-box表示 IE 盒模型(怪异盒模型)
11、li 与 li 之间有看不见的空白间隔是什么原因引起的 如何解决
- 原因:
浏览器会把 inline 内联元素间的空白字符(空格、换行、Tab等)渲染成一个空格。
为了美观,通常是一个 放在一行,这导致 换行后产生换行字符,它变成一个空格,占用了一个字符的宽度。
- 解决办法:
消除 的字符间隔 letter-spacing:-8px,不足:这也设置了
内的字符间隔,因此需要将 内的字符间隔设为默认 letter-spacing:normal
12、CSS3中有哪些新特性
- 新增各种CSS选择器 (: not(.input):所有 class 不是“input”的节点)
- 圆角 (border-radius:8px)
- 多列布局 (multi-column layout)
- 阴影和反射 (Shadoweflect)
- 文字特效 (text-shadow)
- 文字渲染 (Text-decoration)
- 线性渐变 (gradient)
- 旋转 (transform)
- 增加了旋转,缩放,定位,倾斜,动画,多背景
13、对line-height 的理解及其赋值方式
- line-height的概念
- line-height 的赋值方式
带单位:px 是固定值,而 em 会参考父元素 font-size 值计算自身的行高
纯数字:会把比例传递给后代。例如,父级行高为 1.5,子元素字体为 18px,则子元素行高为 1.5 * 18 = 27px
百分比:将计算后的值传递给后代
14、CSS 优化和提高性能的方法有哪些
15、单行、多行文本溢出隐藏
- 单行文本溢出
overflow: hidden; // 溢出隐藏
text-overflow: ellipsis; // 溢出用省略号显示
white-space: nowrap; // 规定段落中的文本不进行换行
- 多行文本溢出
overflow: hidden; // 溢出隐藏
text-overflow: ellipsis; // 溢出用省略号显示
display:-webkit-box; // 作为弹性伸缩盒子模型显示
-webkit-box-orient:vertical; // 设置伸缩盒子的子元素排列方式:从上到下垂直排列
-webkit-line-clamp:3; // 显示的行数
注意:由于上面的三个属性都是 CSS3 的属性,没有浏览器可以兼容,所以要在前面加一个-webkit- 来兼容一部分浏览器
16、对 CSS 工程化的理解
17、z-index属性作用,在什么情况下会失效
- 作用:
z-index元素的 position 属性需要是 relative,absolute 或是 fixed
- z-index属性在下列情况下会失效:
父元素 position 为 relative 时,子元素的 z-index 失效。解决:父元素 position 改为 absolute 或 static;
元素没有设置 position 属性为非 static 属性。解决:设置该元素的 position 属性为 relative,absolute 或是 fixed 中的一种;
元素在设置 z-index 的同时还设置了 float 浮动。解决:float 去除,改为 display:inline-block;
18、px、em、rem的区别及使用场景
- 三者的区别:
- px是固定的像素,一旦设置了就无法因为适应页面大小而改变
- em和rem相对于px更具有灵活性,他们是相对长度单位,其长度不是固定的,更适用于响应式布局
- em是相对于其父元素来设置字体大小,这样就会存在一个问题,进行任何元素设置,都有可能需要知道他父元素的大小。而rem是相对于根元素,这样就意味着,只需要在根元素确定一个参考值
- 使用场景:
- 对于只需要适配少部分移动设备,且分辨率对页面影响不大的,使用 px 即可
- 对于需要适配各种移动设备,使用 rem,例如需要适配 iPhone 和 iPad 等分辨率差别比较挺大的设备
19、两栏布局的实现
一般两栏布局指的是左边一栏宽度固定,右边一栏宽度自适应 两栏布局的具体实现:- 利用浮动,将左边元素宽度设置为200px,并且设置向左浮动。将右边元素的margin-left设置为200px,宽度设置为auto(默认为auto,撑满整个父元素
.outer {
height: 100px;
}
.left {
float: left;
width: 200px;
background: tomato;
}
.right {
margin-left: 200px;
width: auto;
background: gold;
}
- 利用浮动,左侧元素设置固定大小,并左浮动,右侧元素设置 overflow: hidden; 这样右边就触发了 BFC,BFC 的区域不会与浮动元素发生重叠,所以两侧就不会发生重叠
.left{
width: 100px;
height: 200px;
background: red;
float: left;
}
.right{
height: 300px;
background: blue;
overflow: hidden;
}
- 利用flex布局,将左边元素设置为固定宽度 200px,将右边的元素设置为 flex:1
.outer {
display: flex;
height: 100px;
}
.left {
width: 200px;
background: tomato;
}
.right {
flex: 1;
background: gold;
}
- 利用绝对定位,将父级元素设置为相对定位。左边元素设置为absolute定位,并且宽度设置为200px。将右边元素的margin-left的值设置为200px
.outer {
position: relative;
height: 100px;
}
.left {
position: absolute;
width: 200px;
height: 100px;
background: tomato;
}
.right {
margin-left: 200px;
background: gold;
}
- 利用绝对定位,将父级元素设置为相对定位。左边元素宽度设置为200px,右边元素设置为绝对定位,左边定位为200px,其余方向定位为0
.outer {
position: relative;
height: 100px;
}
.left {
width: 200px;
background: tomato;
}
.right {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 200px;
background: gold;
}
20、如何根据设计稿进行移动端适配
移动端适配主要有两个维度:
- 适配不同像素密度, 针对不同的像素密度,使用 CSS 媒体查询,选择不同精度的图片,以保证图片不会失真
- 适配不同屏幕大小, 由于不同的屏幕有着不同的逻辑像素大小,所以如果直接使用 px 作为开发单位,会使得开发的页面在某一款手机上可以准确显示,但是在另一款手机上就会失真。为了适配不同屏幕的大小,应按照比例来还原设计稿的内容
为了能让页面的尺寸自适应,可以使用 rem,em,vw,vh 等相对单位
21、对Flex布局的理解及其使用场景
22、响应式设计的概念及基本原理
- 概念:
响应式网站设计(Responsive Web design)是一个网站能够兼容多个终端,而不是为每一个终端做一个特定的版本
- 原理:
基本原理是通过媒体查询(@media)查询检测不同的设备屏幕尺寸做处理;关于兼容: 页面头部必须有mate声明的 viewport
23、为什么需要清除浮动 清除浮动的方式
- 浮动的定义:
非IE浏览器下,容器不设高度且子元素浮动时,容器高度不能被内容撑开。 此时,内容会溢出到容器外面而影响布局。这种现象被称为浮动(溢出)
- 浮动的工作原理:
浮动元素脱离文档流,不占据空间(引起“高度塌陷”现象)
浮动元素碰到包含它的边框或者其他浮动元素的边框停留
24、对BFC的理解,如何创建BFC
25、display、position、float 的关系
- 首先判断 display 属性是否为 none,如果为 none,则 position 和 float 属性的值不影响元素最后的表现
- 然后判断 position 的值是否为 absolute 或者 fixed,如果是,则 float 属性失效,并且 display 的值应该被设置为 table 或者 block,具体转换需要看初始转换值
- 如果 position 的值不为 absolute 或者 fixed,则判断 float 属性的值是否为 none,如果不是,则 display 的值则按上面的规则转换。注意,如果 position 的值为 relative 并且 float 属性的值存在,则 relative 相对于浮动后的最终位置定位
- 如果 float 的值为 none,则判断元素是否为根元素,如果是根元素则 display 属性按照上面的规则转换,如果不是,则保持指定的 display 属性值不变
总的来说,可以把它看作是一个类似优先级的机制,'position:absolute' 和 'position:fixed' 优先级最高,有它存在的时候,浮动不起作用,'display' 的值也需要调整
其次,元素的 'float' 特性的值不是 'none' 的时候或者它是根元素的时候,调整 'display' 的值;
最后,非根元素,并且非浮动元素,并且非绝对定位的元素,'display' 特性值同设置值
26、absolute 与 fixed 共同点与不同点
- 共同点:
改变行内元素的呈现方式,将 display 置为 inline-block
使元素脱离普通文档流,不再占据文档物理空间
覆盖非定位文档元素
- 不同点:
abuselute与fixed的根元素不同,abuselute的根元素可以设置,fixed根元素是浏览器。
在有滚动条的页面中,absolute会跟着父元素进行移动,fixed固定在页面的具体位置
27、margin和padding分别适合什么场景使用
- 何时使用margin:
需要在border外侧添加空白
空白处不需要背景色
上下相连的两个盒子之间的空白,需要相互抵消时
- 何时使用padding:
需要在border内侧添加空白
空白处需要背景颜色
上下相连的两个盒子的空白,希望为两者之和。
兼容性的问题:在IE5 IE6中,为float的盒子指定margin时,左侧的margin可能会变成两倍的宽度。通过改变padding或者指定盒子的display:inline解决
28、列举一些CSS框架
Bootstrap:基于HTML、CSS、JavaScript 开发,由动态 CSS 语言 Less写成
React 组件
Layui:遵循原生 HTML/CSS/JS 的书写与组织形式
ElementUI:基于 Vue 2.0的桌面端组件库
29、overflow属性在CSS中被用于什么
- 作用:
overflow 属性规定当内容溢出元素框时发生的事情
如果值为 scroll,不论是否需要,用户代理都会提供一种滚动机制。因此,有可能即使元素框中可以放下所有内容也会出现滚动条
- 可能的值:
overflow: auto:如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容
overflow: hidden:内容会被修剪,并且其余内容是不可见的
overflow: scroll:内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。
overflow: visible:默认值。内容不会被修剪,会呈现在元素框之外
30、重排与重绘
- 重排 reflow(回流):当浏览器发现某个部分发生了变化影响了布局,需要倒回去重新渲染
添加、删除可见的 DOM 元素
元素位置改变、尺寸改变、内容改变
页面初始化、resize 事件等
- 重绘 repaint:改变某个元素的背景色、文字颜色、边框颜色等影响周围或内部布局的属性时,屏幕的一部分要重画,但元素的几何尺寸不变
注意:
① 回流必定引起重绘,而重绘不一定会引起回流
② display: none;的节点不会被加入渲染树,而 visibility: hidden;会被加入渲染树
③ display:none;会触发回流;visibility: hidden;会触发重绘
31、position 中的 relative 和 absolute 的定位原点是什么
-
absolute:生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位 -
fixed (老IE不支持):生成绝对定位的元素,相对于浏览器窗口进行定位 -
relative:生成相对定位的元素,相对于其正常位置进行定位 -
static:默认值,没有定位,元素出现在正常的流中(忽略 top, bottom, left, right z-index 声明) -
inherit:规定从父元素继承 position 属性的值
32、float的使用
33、flex弹性布局
34、常见居中方案
35、制作一个访问量很高的大型网站,你会如何来管理所有 CSS 文件、js 与图片
36、IE6 BUG的解决方法