本文系统梳理CSS基础知识及面试常见问题。详细介绍了样式继承、CSS单位、CSS行高、CSS选择器及优先级、脚本化CSS等。
开门见山,先说一说CSS基础相关面试题
position属性有哪些值,absoluted相对于谁定位?inhert 、initial、unset、revert 之间的区别rem、vwline-height 行高如何计算?link和@import都能导入一个样式文件,它们有什么区别吗?选择器 { 属性:属性值;//...}
/* ... */,不支持单行注释 //document.styleSheetsfont由font-family、font-size、font-weight组成-moz--webkit-ms-定义样式的两种方式
style="margin-top:20px;color:red;".p {text-index: 5in; color: red;}<link rel="stylesheet" href="mystyles.css" type="text/css">CSS 规则是样式表的主体,通常样式表会包括大量的规则列表。但有时候也有需要在样式表中包含一些其他的信息,比如字符集,导入其它外部样式表,字体等,这些需要专门的语句表示--即@规则
@namespace 告诉css引擎必须考虑XML命名空间@charset "UTF-8"; 定义样式所使用的字符集@import 用于告诉CSS引擎引入的一个外部样式表css/* 如果支持自定义属性,则把body颜色设置为变量varName指定的颜色 */
@supports(--foo: green) {
body {
color: var(--varName);
}
}
某个样式表文件到底用什么字符编码,浏览器一套识别顺序(优先级从高到低):
Byte Order mark字符值,一般编辑器并不能看到文件头里的BOM值,要使用十六进制编辑器;content-type字段包含的charset所指定的值,比如 Content-type: text/css; charset=utf-8<link>标签里的charset属性,该条已在HTML5中废除UTF-8favorite.ico、脚本和字体等;而@import是CSS语法,只能用来导入CSS;position它指定了应用到元素的定位类型
static 默认属性 置顶元素按照常规的文档流进行定位absolute 指定元素相对于它包含的元素进行定位。脱离文档流,要么相对于最近定位的祖先元素,要么是相对于文档本身(html标签的父元素)fixed 该值相对于浏览器窗口进行定位。固定定位的元素总是显示在那里,不随文档其他部分而滚动。脱离文档流reactive 按照常规文档流进行定位,它的定位相对于它在文档流中的位置进行调整sticky 生成粘性定位的元素, 容器的位置根据正常文档流计算得出注意事项:
absolute|sticky|fixed会受到transform | perspective | filter属性的影响
position: fixed 能够相对于浏览器窗口放置有一个条件,那就是不能有任何祖先元素设置了 transform、perspective 或者 filter 样式属性。 引用自vue Teleport
z-index 只对兄弟元素叠加应用效果颜色、透明度、半透明度
#fafafa #eeergba(255,255,255, 0) 最后一位是透明度 【0, 1】opacity 取值【0, 1】 IE 用 filter filter: alpha(opacity=75)overflow 和 clip继承的理解:设置在父元素或祖先元素上的样式被子元素继承。
display、margin、border、padding、background、height、min-height、max-height、width、min-width、max-width、overflow、position、left、right、top、bottom、z-index、float、clear、table-layout、vertical-align、page-break-after、page-bread-before和unicode-bidi。visibility和cursor。
内联元素可继承:letter-spacing、word-spacing、white-space、line-height、color、font、font-family、font-size、font-style、font-variant、font-weight、text-decoration、text-transform、direction。text-indent和text-align。list-style、list-style-type、list-style-position、list-style-image哪些属性属于默认继承很大程度上是由常识决定的。
inherit 开启继承initial 让当前属性恢复为默认值。unset 如果属性是自然继承那么就是 inherit,否则和 initial一样revert 当前属性的样式恢复为浏览器默认的样式all 批量设置(如all:unset), 值为以上四个值之一。html<!doctype html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<style>
.revert-ol {
list-style: none;
}
</style>
</head>
<body>
<ol class="revert-ol" style="list-style-type: revert">
<li>ol标签浏览器内置的样式为 ol{ list-style-type: decimal }</li>
<li>revert关键字可以让当前元素的样式还原成浏览器内置的样式</li>
</ol>
<hr>
<ol class="revert-ol" style="list-style-type: initial">
<li>CSS属性list-style-type的默认值对于disc</li>
<li>initial关键字可以让当前属性恢复为默认值</li>
</ol>
</body>
</html>
运行效果
all:revert 样式格式化html<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
.ui-button {
display: inline-block;
line-height: 20px;
font-size: 14px;
text-align: center;
color: #4c5161;
border-radius: 4px;
padding: 10px 15px;
min-width: 80px;
border: none;
background-color: #2a80eb;
color: #fff;
box-sizing: border-box;
font-family: inherit;
cursor: pointer;
overflow: visible;
}
</style>
</head>
<body>
<button>button标签浏览器默认样式</button>
<button class="ui-button">button.ui-button美美的按钮</button>
<br><br><br>
<button class="ui-button" style="all:initial">button.ui-button style="all:initial"</button>
<button class="ui-button" style="all:revert">button.ui-button style="all:revert"</button>
</body>
</html>
运行效果
参考资料:

CSS解析方式: 从右往左(为了最快定位到目标元素)
浏览器什么也不会做,继续解析下一个CSS样式,错误的属性、值及规则都会跳过。(除了注释、CSS规则集及@规则外,定义的一些别的东西都将被浏览器忽略)。
css.box {
width: 500px; /* 不支持calc函数的浏览器将会降级为 500px */
width: calc(100%-50px);
}
<style>style属性<link rel="stylesheet" href="CSS的文件路径">link标签href 是异步加载,只有当前css文件被下载解析之后,浏览器才知道还有另外的一个CSS需要下载,这时候才去下载 解析构建 渲染等,@import引起堵塞css解析延迟会加长页面白屏时间,所以要避免使用@import 尽量采用link标签方式引入。
em 相对长度单位。是相对于父元素的字体大小进行计算的。
16px,1em=16px,那么10px=0.625em。font-size的换算,需要在CSS中body选择器中声明 font-size: 62.5%,这就是的em值变为 16px*62.5%=10px=1em 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了.rem 相对于跟元素(html)的font-size的单位。 >=IE9
rem做响应式,具体实现点这里ex ch排版用的单位
ex 只得是小写字母x的高度,不同字体小写x的高度是不一样的。ch 与ex类似,它是基于数字0的宽度计算的,会随着字体的变化而变化。而0的宽度通常是对字体的平均字符宽度,它是一个估计值。由于ch是一个近似等宽的单元,所以在设置容器的宽度时很有用,比如一个容器想要显示指定个数的字符串时,就可以使用这个单位。
vw|vh|vmax| vmin
vw 视窗宽度的百分比 网页视口高度的1/100vh 视窗高度的百分比vmax vw和vh的较大值vmin vw和vh的较小值px 、pt 、pc、 cm、 mm、in
px像素Pixel 相对于显示器屏幕分辨率1in = 25.4mm = 2.54cm = 6pc = 72pt = 96px1pc = 16px 1pt = 1.3333pxwidth、max-width、min-width:值为百分比时,其相对于包含块的 width 进行计算height、max-height、min-height:值为百分比时,其相对于包含块的 height 进行计算;padding、margin:值为百分比时,如果是水平的值,就是相对于包含块的 width 进行计算;如果是垂直的值,就是相对于包含块的 height 进行计算。font-size会继承父元素的font-size;line-height根据font-size进行计算;vertical-align根据line-height进行计算;text-indent如果是水平的,则根据width进行计算,如果是垂直的,则根据height进行计算
window.screen.height 屏幕高度 667window.innerHeight 网页视口高度 553document.body.clientHeight body 高度浏览器默认文字大小 16px 默认行高: 18px(inlne-height) 行高 = 文字大小+上间距+下间距
行高的作用: 当行高值为父容器的高度时,可以让父容器中的文字垂直显示
当给一个独立的元素设置行高值的时候,除了以px为单位的行高值与文字大小无关,其他都与文字大小有关(与文字大小的积)
| 行高单位 | 赋值 | 文字大小 | 行高值 |
|---|---|---|---|
px | 20px | 20px | 20px |
em | 2em | 20px | 20px |
% | 200% | 20px | 40px |
| 不带单位 | 2 | 20px | 40px |
盒子嵌套:
| 行高单位 | 父元素line-height | 父元素文字大小 | 子元素文字大小 | 子元素行高值 |
|---|---|---|---|---|
px | 20px | 20px | 30px | 20px |
em | 2em | 20px | 30px | 40px |
| % | 200% | 20px | 30px | 40px |
| 不带单位 | 2 | 20px | 30px | 60px |
在页面中,每一个元素被表示成一个矩形的方框,被称为盒子。元素在页面中会生成盒子,一张页面由一个或多个盒子组成,这就是盒模型。
盒子从内到外由内容(Content)、内边距(Padding)、边框(Border)和外边距(Margin)组成,如下图:

关于盒模型内容比较多,将在我的下一篇文章《CSS盒模型与布局》中讲解.


规则总结
!important > 内联样式 > ID选择器 > 【类选择器|属性选择器|伪类选择器】> 元素选择器 > 通配符选择器
脚本化CSS最直接了当的方法是修改style属性。style属性的值是CSSDeclaration对象。
ele.style.fontSize = '24px'ele.setAttribute | ele.getAttribute方法ele.style.cssText = 'font-size:24px'
注意:cssFloat (因为float是JS保留字)IOS10不支持ele.style.xxx= 'XXX'写法,推荐使用setAttribute方法优点:
缺点:
所以如果需要查询样式时,就需要使用计算样式
getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration
与内联样式之间的异同
相同点
CSSdeclaration对象不同点
cssText属性为定义缺点
fontFamily属性时返回 ‘arial,helvetica,sans-serif’的值,你无法获知系统使用的哪种字体“auto”,这也大概不是你想要的(可通过ele.getBoundingClientRect方法解决)ele.className = 'XXX'ele.classList 该属性值是一个DOMTokenList对象,一个只读的类数组对象
.add .remove .toggle .contains方法document.styleSheets CSSStyleSheet对象document.styleSheets[X].disable = booleanvar firstRules = document.styleSheets[0].cssRules[0] (IE是.rules).insertRules('XXX', index) IE .addRules.deleteRules(index) IE .removeRulesvar s = document.createElement('style');s.innerHTML = '*{color:red;}';document.head.appendChild(s);var s = document.createStyleSheet();s.cssText = '*{color:red;}';本文作者:郭敬文
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!