本文系统梳理CSS基础知识及面试常见问题。详细介绍了样式继承、CSS单位、CSS行高、CSS选择器及优先级、脚本化CSS等。
开门见山,先说一说CSS基础相关面试题
position
属性有哪些值,absoluted
相对于谁定位?inhert
、initial
、unset
、revert
之间的区别rem
vw
line-height
行高如何计算?link
和@import
都能导入一个样式文件,它们有什么区别吗?选择器 { 属性:属性值;//...}
/* ... */
,不支持单行注释 //
document.styleSheets
font
由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-8
favorite.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
#eee
rgba(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/100
vh
视窗高度的百分比vmax
vw
和vh
的较大值vmin
vw
和vh
的较小值px
、pt
、pc
、 cm
、 mm
、in
px
像素Pixel
相对于显示器屏幕分辨率1in
= 25.4mm
= 2.54cm
= 6pc
= 72pt
= 96px
1pc = 16px
1pt = 1.3333px
width
、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 = boolean
var firstRules = document.styleSheets[0].cssRules[0]
(IE是.rules
).insertRules('XXX', index)
IE .addRules
.deleteRules(index)
IE .removeRules
var s = document.createElement('style');
s.innerHTML = '*{color:red;}';
document.head.appendChild(s);
var s = document.createStyleSheet();
s.cssText = '*{color:red;}';
本文作者:郭敬文
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!