CSS笔记

CSS笔记
Photo by Pankaj Patel / Unsplash
CSS是前端必须掌握的基础之一,我个人觉得只要了解一些核心内容即可,其余的可以通过实战来积累。核心内容比如布局(Flex,Grid,Position...),层叠上下文,CSS渲染机制等。同样近些年热门的CSS Variables、原子化CSS也很推荐去学习了解。

position

  • static该关键字指定元素使用正常的布局行为,即元素在文档常规流中当前的布局位置。此时 toprightbottomleft 和 z-index 属性无效。
  • relative该关键字下,元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置(因此会在此元素未添加定位时所在位置留下空白)。position:relative 对 table-*-group, table-row, table-column, table-cell, table-caption 元素无效。
  • absolute元素会被移出正常文档流,并不为元素预留空间,通过指定元素相对于最近的非 static 定位祖先元素的偏移,来确定元素位置。绝对定位的元素可以设置外边距(margins),且不会与其他边距合并。
  • fixed元素会被移出正常文档流,并不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed 属性会创建新的层叠上下文。当元素祖先的 transformperspective 或 filter 属性非 none 时,容器由视口改为该祖先。
  • sticky元素根据正常文档流进行定位,然后相对它的*最近滚动祖先(nearest scrolling ancestor)*和 containing block (最近块级祖先 nearest block-level ancestor),包括table-related元素,基于toprightbottom, 和 left的值进行偏移。偏移值不会影响任何其他元素的位置。该值总是创建一个新的层叠上下文(stacking context)。注意,一个sticky元素会“固定”在离它最近的一个拥有“滚动机制”的祖先上(当该祖先的overflow 是 hiddenscrollauto, 或 overlay时),即便这个祖先不是最近的真实可滚动祖先。这有效地抑制了任何“sticky”行为(详情见Github issue on W3C CSSWG)。

行内元素/块级元素

行内元素特点:display:inline;

  1. 和其他元素都在一行上;
  2. 元素的高度、宽度及顶部和底部边距不可设置;
  3. 元素的宽度就是它包含的文字或图片的宽度,不可改变。
💡
这里自己试验过,span不可以设置margin上下,input都可以

块级元素特点:display:block;

  1. 每个块级元素都从新的一行开始,并且其后的元素也另起一行。独占一行
  2. 元素的高度、宽度、行高以及顶和底边距都可设置。
  3. 元素宽度在不设置的情况下,是它本身父容器的100%,除非设定一个宽度。

行内块级元素的特点:display:inline-block;

  1. 和其他元素都在一行上;
  2. 元素的高度、宽度、行高以及顶和底边距都可设置

Flex/Grid

这个我推荐玩一下下面几个CSS游戏,寓学于乐,结合实战很快就能掌握~

Flex

Flexbox Froggy - A game for learning CSS flexbox

💡
1. 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 还是 Flex?

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;

重绘回流

浏览器的回流与重绘 (Reflow & Repaint)

💡
对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素以及后续元素频繁的回流

层叠上下文

彻底搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index

怎样产生层叠上下文

  1. HTML中的根元素<html></html>本身j就具有层叠上下文,称为“根层叠上下文”。
  2. 普通元素设置position属性为static值并设置z-index属性为具体数值,产生层叠上下文。
  3. CSS3中的新属性也可以产生层叠上下文。

CSS3中的属性对层叠上下文的影响

CSS3中出现了很多新属性,其中一些属性对层叠上下文也产生了很大的影响。如下:

  1. 父元素的display属性值为flex|inline-flex,子元素z-index属性值不为auto的时候,子元素为层叠上下文元素;
  2. 元素的opacity属性值不是1
  3. 元素的transform属性值不是none
  4. 元素mix-blend-mode属性值不是normal`;
  5. 元素的filter属性值不是none
  6. 元素的isolation属性值是isolate
  7. will-change指定的属性值为上面任意一个;
  8. 元素的webkit-overflow-scrolling属性值设置为touch

CSS3中,元素属性满足以上条件之一,就会产生层叠上下文。我们用第1条来做一个简单的解释说明。

层叠等级决定

  1. 普通元素的层叠等级优先由其所在的层叠上下文决定。
  2. 层叠等级的比较只有在当前层叠上下文元素中才有意义。不同层叠上下文中比较层叠等级是没有意义的。

什么是“层叠顺序”

说完“层叠上下文”和“层叠等级”,我们再来说说“层叠顺序”。“层叠顺序”(stacking order)表示元素发生层叠时按照特定的顺序规则在Z轴上垂直显示。由此可见,前面所说的“层叠上下文”和“层叠等级”是一种概念,而这里的“层叠顺序”是一种规则。

在不考虑CSS3的情况下,当元素发生层叠时,层叠顺讯遵循上面途中的规则。 这里值得注意的是:

  1. 左上角"层叠上下文background/border"指的是层叠上下文元素的背景和边框
  2. inline/inline-block元素的层叠顺序要高于block(块级)/float(浮动)元素。
  3. 单纯考虑层叠顺序,z-index: autoz-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=<输出>

参考

Font­Tools 字体子集化

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;
}