前端面试题之css篇(附答案)

css经典面试题

  • 介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的?
  • box-sizing属性?
  • 请列举一下你所知道的css 隐藏元素的方法?
  • CSS 常见的伪类和伪元素有哪些,他们的区别?
  • CSS选择器有哪些?哪些属性可以继承?CSS优先级算法如何计算?
  • 如何居中div?如何居中一个浮动元素?如何让绝对定位的div居中?如何居中一个img(position定位)
  • display 有哪些值?说明他们的作用?
  • position 的值?
  • CSS3有哪些新特性?
  • 用纯CSS创建一个三角形的原理是什么?
  • 为什么要初始化 CSS 样式
  • position 跟 display、overflow、float 这些特性相互叠加后会怎么样?
  • 为什么会出现浮动? 什么时候需要清除浮动?清除浮动有哪些方式?
  • 设置元素浮动后,该元素的 display 值是多少?
  • 移动端的布局用过媒体查询吗?
  • 什么是CSS 预处理器 / 后处理器?大家为什么要使用他们?
  • CSS优化、提高性能的方法有哪些?
  • 在网页中的应该使用奇数还是偶数的字体?为什么呢?
  • margin 和 padding 分别适合什么场景使用?
  • 元素竖向的百分比设定是相对于容器的高度吗?
  • 什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的IE?
  • 怎么让Chrome支持小于12px 的文字?
  • 让页面里的字体变清晰,变细用CSS怎么做?
  • 有一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度
  • CSS属性overflow属性定义溢出元素内容区的内容会如何处理?
  • 有哪项方式可以对一个 DOM 设置它的CSS样式?
  • CSS 中可以通过哪些属性定义,使得一个 DOM 元素不显示在浏览器可视范围内?
  • 行内元素和块级元素的具体区别是什么?行内元素的 padding 和 margin 可设置吗?
  • px、em、rem的区别
  • 前端页面有哪三层构成,分别是什么?
  • CSS引入的方式有哪些?使用Link和@import有什么区别?
  • 介绍一下你对浏览器内核的理解
  • 如何水平并且垂直居中一张背景图
  • 强制换行的css是什么?

css面试题解析

介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的?

盒子模型就是 元素在网页中的实际占位,有两种:标准盒子模型和IE盒子模型

  • 标准(W3C)盒子模型:内容content+填充padding+边框border+边界margin
    宽高指的是 content 的宽高
  • 低版本IE盒子模型:内容(content+padding+border)+ 边界margin,
    宽高指的是 content+padding+border 部分的宽高

问题的拓展:
CSS 如何设置这两种模型?

box-sizing : content-box  box-sizing : border-box

JS 如何设置获取盒模型对应的宽和高?

dom.style.width/height;//设置获取的是内联样式dom.currentStyle.width/height;//只有IE支持window.getComputedStyle(dom).width/height;//兼容性好dom.getBoundingClientRect().width/height;//适用场所:计算一个元素的绝对位置

box-sizing属性?

用来控制元素的盒子模型的解析模式,默认为content-box

  • context-box:W3C的标准盒子模型,设置元素的 height/width 属性指的是 content 部分的高/宽
  • border-box:IE 传统盒子模型。设置元素的 height/width 属性指的是 content + border + padding 部分的高/宽

请列举一下你所知道的css 隐藏元素的方法?

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

CSS 常见的伪类和伪元素有哪些,他们的区别?

  • 伪元素主要是用来创建一些不存在原有dom结构树种的元素
  • 伪类表示已存在的某个元素处于某种状态,但是通过dom树又无法表示这种状态,就可以通过伪类来为其添加样式
  • 伪元素的操作对象是新生成的dom元素,而不是原来dom结构里就存在的;而伪类恰好相反,伪类的操作对象是原来的dom结构里就存在的元素。
    伪元素与伪类的根本区别在于:操作的对象元素是否存在于原来的dom结构里
  • 常见的伪类:
    :link 应用于未被访问过的链接
    :visited 应用于被访问过的链接
    :hover 应用于鼠标悬停到的元素
    :first-child 选择某元素第一个子元素
    :last-child 选择最后一个。。。。。
    :disabled 表单元素禁用
    :enabled 匹配没有被禁用的元素
  • 常见的伪元素:
    ::first-letter 选择元素文本的第一个字
    ::first-line 选择元素文本的第一行
    ::before 在元素内容的最前面添加新内容。
    ::after 在元素内容的最后面添加新内容。

CSS选择器有哪些?哪些属性可以继承?CSS优先级算法如何计算?

  • CSS选择符:
  1. id选择器( # myid)
  2. 类选择器(.myclassname)
  3. 标签(元素)选择器(div, h1, p)
  4. 相邻选择器(h1 + p)
  5. 子选择器(ul > li)
  6. 后代选择器(li a)
  7. 通配符选择器( * )
  8. 属性选择器(a[rel = "external"])
  9. 伪类选择器(a:hover, li:nth-child)
    伪元素选择器、分组选择器。
  • 继承性:
    可继承的样式:font-size, font-family, color,ul,li,dl,dt,dd;
    不可继承的样式:border, padding, margin, width, height
    优先级(就近原则):!important > [ id > class > tag ]
    !important 比内联优先级高
  • 优先级算法计算
    优先级就近原则,同权重情况下样式定义最近者为准
    !important>id >class>tag
    important比内联优先级高
    元素选择符的权值:元素标签(派生选择器):1,class选择符:10,id选择符:100,内联样式权值最大,为1000
    !important声明的样式优先级最高,如果冲突再进行计算。
    如果优先级相同,则选择最后出现的样式。
    继承得到的样式的优先级最低。

如何居中div?如何居中一个浮动元素?如何让绝对定位的div居中?如何居中一个img(position定位)

  • 水平居中div:
border: 1px solid red;
margin: 0 auto; 
height: 50px;
width: 80px;
  • 水平垂直居中一个浮动元素(position定位)
    第一种:未知元素宽高
我想居中显示

第二种:已知元素宽高的

我想居中显示
  • 绝对定位的div水平垂直居中:
border: 1px solid black;
position: absolute;
width: 200px;
height: 100px;
margin: auto;
left: 0;
right: 0; 
top:0;
bottom:0;
  • 如何垂直居中一个img(display : table-cell 或者 position定位)

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

  • inline 默认。此元素会被显示为内联元素,元素前后没有换行符。
  • block 此元素将显示为块级元素,此元素前后会带有换行符。
  • none 此元素不会被显示(隐藏)。
  • inline-block 行内块元素。(CSS2.1 新增的值)
  • list-item 此元素会作为列表显示。
  • table 此元素会作为块级表格来显示(类似table),表格前后带有换行符

position 的值?

  • absolute
    生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。
    元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。
  • fixed
    生成固定定位的元素,相对于浏览器窗口进行定位。(老IE不支持)
    元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。
  • relative
    生成相对定位的元素,相对于其正常位置进行定位,不脱离文档流。
    因此,"left:20" 会向元素的 LEFT 位置添加 20 像素。
  • static
    默认值。没有定位,元素出现在正常的文档流中(忽略 top, bottom, left, right 或者 z-index 声明)。
  • inherit: 规定应该从父元素继承 position 属性的值。

CSS3有哪些新特性?

  • 新增各种 CSS 选择器 :not(p) 选择每个非p的元素; p:empty 选择每个没有任何子级的p元素(包括文本节点)
  • border-radius //用于设置圆角
  • 背景 background-clip(规定背景图的绘制区域),background-origin,background-size
  • 线性渐变 (Linear Gradients) 向下/向上/向左/向右/对角方向
  • 文本效果 阴影text-shadow,textwrap,word-break,word-wrap;
  • 2D 转换 transform:scale(0.85,0.90) | translate(0px,-30px) | skew(-9deg,0deg) |rotate()
  • 3D转换 perspective();transform是向元素应用 2D 或者 3D 转换;
  • 过渡 transition
  • 动画
  • 多列布局 (multi-column layout)
  • 盒模型
  • flex 布局
  • 多媒体查询 定义两套css,当浏览器的尺寸变化时会采用不同的属性

用纯CSS创建一个三角形的原理是什么?

首先,需要把元素的宽度、高度设为0。然后设置边框样式。

width: 0;
height: 0;
border-top: 40px solid transparent;
border-left: 40px solid transparent;
border-right: 40px solid transparent;
border-bottom: 40px solid #ff0000;

为什么要初始化 CSS 样式

因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。

position 跟 display、overflow、float 这些特性相互叠加后会怎么样?

  • display 属性规定元素应该生成的框的类型;
  • position属性规定元素的定位类型;
  • float属性是一种布局方式,定义元素在哪个方向浮动。
    类似于优先级机制:position:absolute/fixed优先级最高,有他们在时,float不起作用,display值需要调整。float 或者absolute定位的元素,只能是块元素或表格。

为什么会出现浮动? 什么时候需要清除浮动?清除浮动有哪些方式?

  • 出现浮动的原因:
    浮动元素碰到包含它的边框或者浮动元素的边框停留。在CSS规范中,浮动定位不属于正常的页面流,而是独立定位的,所以文档流的块框表现得就像浮动框不存在一样。浮动元素会漂浮在文档流的块框上。
  • 关于css的定位机制:普通流,浮动,绝对定位(position:fixed是position:absolute的一个子类)。浮动的框可以左右移动,直到它的外边缘遇到包含框或者另一个浮动框的边缘,所以才说浮动定位不属于正常的页面流。文档中的普通流就会表现得和浮动框不存在一样,当浮动框高度超出包含框的时候,就会出现包含框不会自动伸缩高度类笔盒浮动元素。所以,只含有浮动元素的父容器在显示时不需要考虑子元素的位置,就造成显示父容器像空容器一样。
  • 浮动带来的问题:
    父元素的高度无法被撑开,影响与父元素同级的元素
    与浮动元素同级的非浮动元素(内联元素)会跟随其后
    若非第一个元素浮动,则该元素之前的元素也需要浮动,否则会影响页面显示的结构。
  • 清除浮动的方式:
    1.父级div定义height
    2.最后一个浮动元素后加空 div 标签 并添加样式 clear:both。(理论上能清除任何标签,增加无意义的标签)
    3.包含浮动元素的父标签添加样式 overflow 为 hidden 或 auto。

设置元素浮动后,该元素的 display 值是多少?

自动变成display:block

移动端的布局用过媒体查询吗?

通过媒体查询可以为不同大小和尺寸的媒体定义不同的css,适应相应的设备的显示。

  • 里边

  • CSS :
@media only screen and (max-device-width:480px) {
    /css样式/}

什么是CSS 预处理器 / 后处理器?大家为什么要使用他们?

预处理器例如:LESS、Sass、Stylus,用来预编译Sass或less,增强了css代码的复用性,还有层级、mixin、变量、循环、函数等,具有很方便的UI组件模块化开发能力,极大的提高工作效率。

后处理器例如:PostCSS,通常被视为在完成的样式表中根据CSS规范处理CSS,让其更有效;目前最常做的是给CSS属性添加浏览器私有前缀,实现跨浏览器兼容性的问题。

CSS 预处理器为 CSS 增加一些编程的特性,无需考虑浏览器的兼容性问题”,例如你可以在 CSS 中使用变量、简单的逻辑程序、函数(如右侧代码编辑器中就使用了变量$color)等等在编程语言中的一些基本特性,可以让你的 CSS 更加简洁、适应性更强、可读性更佳,更易于代码的维护等诸多好处。

其它 CSS 预处理器语言:

  • Sass(SCSS)
  • LESS
  • Stylus
  • Turbine
  • Swithch CSS
  • CSS Cacheer
  • DT CSS

为什么要使用它们?

  • 结构清晰,便于扩展。
  • 可以方便地屏蔽浏览器私有语法差异。这个不用多说,封装对浏览器语法差异的重复处理,减少无意义的机械劳动。
  • 可以轻松实现多重继承。
  • 完全兼容 CSS 代码,可以方便地应用到老项目中。LESS 只是在 CSS 语法上做了扩展,所以老的 CSS 代码也可以与 LESS 代码一同编译。

CSS优化、提高性能的方法有哪些?

  • 避免过度约束

  • 避免后代选择符

  • 避免链式选择符

  • 使用紧凑的语法

  • 避免不必要的命名空间

  • 避免不必要的重复

  • 最好使用表示语义的名字。一个好的类名应该是描述他是什么而不是像什么

  • 避免!important,可以选择其他选择器

  • 尽可能的精简规则,你可以合并不同类里的重复规则

  • 修复解析错误

  • 避免使用多类选择符

  • 移除空的css规则

  • 正确使用display的属性:由于display的作用,某些样式组合会无效,徒增样式体积的同时也影响解析性能。
    display:inline后不应该再使用width、height、margin、padding以及float。
    display:inline-block后不应该再使用float。
    display:block后不应该再使用vertical-align。
    display:table-*后不应该再使用margin或者float。

  • 不滥用浮动:虽然浮动不可避免,但不可否认很多css bug是由于浮动而引起。

  • 不滥用web字体
    对于中文网站来说Web Fonts可能很陌生,国外却很流行。web fonts通常体积庞大,而且一些浏览器在下载web fonts时会阻塞页面渲染损伤性能。

  • 不声明过多的font-size:这是设计层面的问题,设计精良的页面不会有过多的font-size声明。

  • 不在选择符中使用ID标识符,主要考虑到样式重用性以及与页面的耦合性。

  • 不给h1~h6元素定义过多的样式

  • 全站统一定义一遍heading元素即可,若需额外定制样式,可使用其他选择符作为代替。

  • 不重复定义h1~h6元素

  • 值为0时不需要任何单位

  • 标准化各种浏览器前缀:通常将浏览器前缀置于前面,将标准样式属性置于最后,类似:

.foo{
    -moz-border-radius: 5px;
    border-radius: 5px; 
}
  • 使用CSS渐变等高级特性,需指定所有浏览器的前缀
  • 避免让选择符看起来像正则表达式
  • CSS3添加了一些类似~=等复杂属性,也不是所有浏览器都支持,需谨慎使用。
  • 遵守盒模型规则(Beware of broken box models)

在网页中的应该使用奇数还是偶数的字体?为什么呢?

使用偶数字体。偶数字号相对更容易和 web 设计的其他部分构成比例关系。Windows 自带的点阵宋体(中易宋体)从 Vista 开始只提供 12、14、16 px 这三个大小的点阵,而 13、15、17 px时用的是小一号的点。(即每个字占的空间大了 1 px,但点阵没变),于是略显稀疏。

margin 和 padding 分别适合什么场景使用?

◆何时应当使用margin
需要在border外侧添加空白时。
空白处不需要背景(色)时。
上下相连的两个盒子之间的空白,需要相互抵消时。如15px+20px的margin,将得到20px的空白。

◆何时应当时用padding
需要在border内测添加空白时。
空白处需要背景(色)时。
上下相连的两个盒子之间的空白,希望等于两者之和时。如15px+20px的padding,将得到35px的空白。

◆浏览器兼容性问题
在IE5.x、IE6中,为float的盒子指定margin时,左侧margin可能会变成两倍的宽度。通过改用padding或指定盒子为display:inline可以解决。

元素竖向的百分比设定是相对于容器的高度吗?

当按百分比设定一个元素的宽度时,它是相对于父容器的宽度计算的,但是,对于一些表示竖向距离的属性,例如 padding-top , padding-bottom , margin-top , margin-bottom 等,当按百分比设定它们时,依据的也是父容器的宽度,而不是高度。

什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的IE?

  • 响应式网站设计(Responsive Web design)是一个网站能够兼容多个终端,而不是为每一个终端做一个特定的版本。
  • 基本原理是通过媒体查询检测不同的设备屏幕尺寸做处理。
  • 页面头部必须有meta声明的viewport。


怎么让Chrome支持小于12px 的文字?

p{
    font-size:10px;
    -webkit-transform:scale(0.8);//0.8是缩放比例
} 

让页面里的字体变清晰,变细用CSS怎么做?

-webkit-font-smoothing 在 window 系统下没有起作用,但是在 IOS 设备上起作用
-webkit-font-smoothing:antialiased 是最佳的,灰度平滑。

有一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度

外层div使用position:relative;高度要求自适应的div使用position: absolute; top: 100px; bottom: 0; left: 0

CSS属性overflow属性定义溢出元素内容区的内容会如何处理?

  • 参数是 scroll 时候,必会出现滚动条。
  • 参数是 auto 时候,子元素内容大于父元素时出现滚动条。
  • 参数是 visible 时候,溢出的内容出现在父元素之外。
  • 参数是 hidden 时候,溢出隐藏。

有哪项方式可以对一个 DOM 设置它的CSS样式?

外部样式表,引入一个外部css文件
内部样式表,将css代码放在 标签内部
内联样式,将css样式直接定义在 HTML 元素内部

CSS 中可以通过哪些属性定义,使得一个 DOM 元素不显示在浏览器可视范围内?

最基本的:设置 display 属性为 none,或者设置 visibility 属性为 hidden
技巧性:设置宽高为 0,设置透明度为 0,设置 z-index 位置在 -1000

行内元素和块级元素的具体区别是什么?行内元素的 padding 和 margin 可设置吗?

块级元素( block )特性:
总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显示;
宽度(width)、高度(height)、内边距(padding)和外边距(margin)都可控制;

内联元素(inline)特性:
和相邻的内联元素在同一行;
宽度(width)、高度(height)、内边距的top/bottom(padding-top/padding-bottom)和外边距的top/bottom(margin-top/margin-bottom)都不可改变(也就是padding和margin的left和right是可以设置的)。

px、em、rem的区别

px 像素 固定单位 它的大小是固定的
em 相对单位 em的值并不是固定的 em会继承父元素的字体大小 会根据父
元素字体大小的变化而变化 一般1em等于16px
rem 他的值也是不固定的 他会根据根元素的大小而变化

前端页面有哪三层构成,分别是什么?

结构层 Html 表示层 CSS 行为层 js

CSS引入的方式有哪些?使用Link和@import有什么区别?

内联,内嵌,外链,导入

  • link 属于 XHTML 标签,除了加载 CSS 外,还能用于定义RSS,定义 rel 连接属性等作用,无兼容性,支持使用javascript改变样式;而@import是CSS提供的,只能用于加载CSS,不支持使用 javascript 改变样式;
  • 页面被加载的时,link 会被同时加载,而@import 引用的CSS会等到页面加载完再加载;
  • import是CSS2.1 提出的,CSS2.1以下浏览器不支持,只在IE5以上才能被识别,而link是XHTML标签,无兼容问题。

介绍一下你对浏览器内核的理解

主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和 JS 引擎。

  • 渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户以及其他它所需要编辑、显示网络的应用程序都需要内核。
  • JS引擎则:解析和执行JavaScript 来实现网页的动态效果;
    最开始渲染引擎和 JS 并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只渲染引擎。

如何水平并且垂直居中一张背景图

设置 background-position:center;

强制换行的css是什么?

Word-break:break-all;

持续更新中......

你可能感兴趣的:(前端面试题之css篇(附答案))