CSS笔记
CSS是前端必须掌握的基础之一,我个人觉得只要了解一些核心内容即可,其余的可以通过实战来积累。核心内容比如布局(Flex,Grid,Position...),层叠上下文,CSS渲染机制等。同样近些年热门的CSS Variables、原子化CSS也很推荐去学习了解。
position
static
该关键字指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。此时top
,right
,bottom
,left
和z-index
属性无效。relative
该关键字下,元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置(因此会在此元素未添加定位时所在位置留下空白)。position:relative 对 table-*-group, table-row, table-column, table-cell, table-caption 元素无效。absolute
元素会被移出正常文档流,并不为元素预留空间,通过指定元素相对于最近的非 static 定位祖先元素的偏移,来确定元素位置。绝对定位的元素可以设置外边距(margins),且不会与其他边距合并。fixed
元素会被移出正常文档流,并不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed
属性会创建新的层叠上下文。当元素祖先的transform
,perspective
或filter
属性非none
时,容器由视口改为该祖先。sticky
元素根据正常文档流进行定位,然后相对它的*最近滚动祖先(nearest scrolling ancestor)*和 containing block (最近块级祖先 nearest block-level ancestor),包括table-related元素,基于top
,right
,bottom
, 和left
的值进行偏移。偏移值不会影响任何其他元素的位置。该值总是创建一个新的层叠上下文(stacking context)。注意,一个sticky元素会“固定”在离它最近的一个拥有“滚动机制”的祖先上(当该祖先的overflow
是hidden
,scroll
,auto
, 或overlay
时),即便这个祖先不是最近的真实可滚动祖先。这有效地抑制了任何“sticky”行为(详情见Github issue on W3C CSSWG)。
行内元素/块级元素
行内元素特点:display:inline;
- 和其他元素都在一行上;
- 元素的高度、宽度及顶部和底部边距不可设置;
- 元素的宽度就是它包含的文字或图片的宽度,不可改变。
💡
这里自己试验过,span不可以设置margin上下,input都可以
块级元素特点:display:block;
- 每个块级元素都从新的一行开始,并且其后的元素也另起一行。独占一行
- 元素的高度、宽度、行高以及顶和底边距都可设置。
- 元素宽度在不设置的情况下,是它本身父容器的100%,除非设定一个宽度。
行内块级元素的特点:display:inline-block;
- 和其他元素都在一行上;
- 元素的高度、宽度、行高以及顶和底边距都可设置
Flex/Grid
这个我推荐玩一下下面几个CSS游戏,寓学于乐,结合实战很快就能掌握~
Flex
Flexbox Froggy - A game for learning CSS flexbox
💡
1.
2. 只有一行的时候
flex-flow:flex-direction flex-wrap;
2. 只有一行的时候
align-content
没有任何效果。Grid
Grid Garden - A game for learning CSS grid
💡
grid-template是grid-template-rows和grid-template-columns的缩写形式。 grid-template: 60% 1fr /200px 1fr
如果你觉得同时输入grid-column和grid-row也很复杂,我们还有另一种缩写。grid-area属性接受4个由'/'分开的值:grid-row-start, grid-column-start, grid-row-end, 最后是grid-column-end。
如果你觉得同时输入grid-column和grid-row也很复杂,我们还有另一种缩写。grid-area属性接受4个由'/'分开的值:grid-row-start, grid-column-start, grid-row-end, 最后是grid-column-end。
两者对比和选择
1px问题
var viewport = document.querySelector("meta[name=viewport]");
//下面是根据设备像素设置viewport
if (window.devicePixelRatio == 1) {
viewport.setAttribute('content', 'width=device-width,initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no');
}
if (window.devicePixelRatio == 2) {
viewport.setAttribute('content', 'width=device-width,initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no');
}
if (window.devicePixelRatio == 3) {
viewport.setAttribute('content', 'width=device-width,initial-scale=0.3333333333333333, maximum-scale=0.3333333333333333, minimum-scale=0.3333333333333333, user-scalable=no');
}
var docEl = document.documentElement;
var fontsize = 10 * (docEl.clientWidth / 320) + 'px';
docEl.style.fontSize = fontsize;
重绘回流
💡
对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素以及后续元素频繁的回流
层叠上下文
彻底搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index
怎样产生层叠上下文
HTML
中的根元素<html></html>
本身j就具有层叠上下文,称为“根层叠上下文”。- 普通元素设置
position
属性为非static
值并设置z-index
属性为具体数值,产生层叠上下文。 - CSS3中的新属性也可以产生层叠上下文。
CSS3中的属性对层叠上下文的影响
CSS3中出现了很多新属性,其中一些属性对层叠上下文也产生了很大的影响。如下:
- 父元素的display属性值为
flex|inline-flex
,子元素z-index
属性值不为auto
的时候,子元素为层叠上下文元素; - 元素的
opacity
属性值不是1
; - 元素的
transform
属性值不是none
; - 元素
mix-blend-mode属性值不是
normal`; - 元素的
filter
属性值不是none
; - 元素的
isolation
属性值是isolate
; will-change
指定的属性值为上面任意一个;- 元素的
webkit-overflow-scrolling
属性值设置为touch
。
CSS3中,元素属性满足以上条件之一,就会产生层叠上下文。我们用第1条来做一个简单的解释说明。
层叠等级决定
- 普通元素的层叠等级优先由其所在的层叠上下文决定。
- 层叠等级的比较只有在当前层叠上下文元素中才有意义。不同层叠上下文中比较层叠等级是没有意义的。
什么是“层叠顺序”
说完“层叠上下文”和“层叠等级”,我们再来说说“层叠顺序”。“层叠顺序”(stacking order)表示元素发生层叠时按照特定的顺序规则在Z轴上垂直显示。由此可见,前面所说的“层叠上下文”和“层叠等级”是一种概念,而这里的“层叠顺序”是一种规则。

在不考虑CSS3的情况下,当元素发生层叠时,层叠顺讯遵循上面途中的规则。 这里值得注意的是:
- 左上角"层叠上下文
background/border
"指的是层叠上下文元素的背景和边框 inline/inline-block
元素的层叠顺序要高于block
(块级)/float
(浮动)元素。- 单纯考虑层叠顺序,
z-index: auto
和z-index: 0
在同一层级,但这两个属性值本身是有根本区别的。
对于上面第2条,为什么inline/inline-block
元素的层叠顺序要高于block
(块级)/float
(浮动)元素?这个大家可以思考一下! 其实很简单,像border/background
属于装饰元素的属性,浮动和块级元素一般用来页面布局,而网页设计之初最重要的就是文字内容,所以在发生层叠时会优先显示文字内容,保证其不被覆盖。
DEMO
相同层叠上下文中才可以比较z-index大小,否则看父级
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
<title><%= htmlWebpackPlugin.options.title %></title>
<style>
.div1 {
position: absolute;
width: 200px;
height: 200px;
background-color: gold;
top: 0;
left: 0;
z-index: 0;
}
.div2 {
position: absolute;
width: 200px;
height: 200px;
background-color: greenyellow;
top: 50px;
left: 50px;
z-index: 0;
}
.c1 {
position: absolute;
left: 30px;
top: 30px;
width: 200px;
height: 200px;
background-color: red;
z-index: 10000;
}
.c2 {
position: absolute;
left: 30px;
top: 30px;
width: 200px;
height: 200px;
background-color: blue;
z-index: -1000;
}
.c3 {
position: absolute;
left: 50px;
top: 50px;
width: 200px;
height: 200px;
background-color: plum;
z-index: -1001;
}
</style>
</head>
<body>
<div class='div1'>div1
<div class='c1'>c1</div>
</div>
<div class='div2'>div2
<div class='c2'>c2</div>
<div class='c3'>c3</div>
</div>
</body>
</html>
sass/less
flex与scroll的问题
需要在父元素上加上minh=0
<VStack minH={0} className={'w-full h-full'} alignItems={'stretch'}>
<Button variant={'ghost'}>Clear</Button>
<VStack
alignItems={'stretch'}
className={'w-full gap-2 flex flex-col py-6 overflow-auto '}
>
{processingList.value.map((file: IExportRuleEntity) => (
<UploadCard data={file} key={file.id} />
))}
</VStack>
</VStack>
一些新特性
😀
待填坑
- css variable
字体切割
pip3 install fonttools
pyftsubset <字体文件> --text=<需要的字形> --output-file=<输出>
参考
A4打印尺寸cs
http://jsfiddle.net/mturjak/2wk6Q/1949/
css大小写敏感问题
- ID 和 类 选择器 区分 大小写
- 标签选择器、属性选择器 不区分 大小写
- 样式属性 不区分 大小写(比如:BORDER)
苹果web安全区域
// 苹果安全底部
.ios-safe-bottom{
height: calc(constant(safe-area-inset-bottom) - 0.32rem);
height: calc(env(safe-area-inset-bottom) - 0.32rem );
width: 100%;
background-color: #fff;
}