CSS

自定义属性

之前通常是在预处理器里才可以使用变量,而现在 CSS 里也支持了变量的用法。通过自定义属性就可以在想要使用的地方引用它。
自定义属性也和普通属性一样具有级联性,申明在 :root 下的时候,在全文档范围内可用,而如果是在某个元素下申明自定义属性,则只能在它及它的子元素下才可以使用。
自定义属性必须通过 —x 的格式申明,比如:—theme-color: red; 使用自定义属性的时候,需要用 var 函数。比如:

  1. <!-- 定义自定义属性 -->
  2. :root {
  3. --theme-color: red;
  4. }
  5. <!-- 使用变量 -->
  6. h1 {
  7. color: var(--theme-color);
  8. }

CSS基础——常见需求实现 - 图1
上图这个是使用 CSS 自定义属性配合 JS 实现的动态调整元素的 box-shadow,具体可以看这个 codepen demo。

1px 边框解决方案

Retina 显示屏比普通的屏幕有着更高的分辨率,所以在移动端的 1px 边框就会看起来比较粗,为了美观通常需要把这个线条细化处理。
而这里附上最后一种通过伪类和 transform 实现的相对完美的解决方案:
只设置单条底部边框:

  1. .scale-1px-bottom {
  2. position: relative;
  3. border:none;
  4. }
  5. .scale-1px-bottom::after {
  6. content: '';
  7. position: absolute;
  8. left: 0;
  9. bottom: 0;
  10. background: #000;
  11. width: 100%;
  12. height: 1px;
  13. -webkit-transform: scaleY(0.5);
  14. transform: scaleY(0.5);
  15. -webkit-transform-origin: 0 0;
  16. transform-origin: 0 0;
  17. }

同时设置 4 条边框:

  1. .scale-1px {
  2. position: relative;
  3. margin-bottom: 20px;
  4. border:none;
  5. }
  6. .scale-1px::after {
  7. content: '';
  8. position: absolute;
  9. top: 0;
  10. left: 0;
  11. border: 1px solid #000;
  12. -webkit-box-sizing: border-box;
  13. box-sizing: border-box;
  14. width: 200%;
  15. height: 200%;
  16. -webkit-transform: scale(0.5);
  17. transform: scale(0.5);
  18. -webkit-transform-origin: left top;
  19. transform-origin: left top;
  20. }

清除浮动

什么是浮动:浮动元素会脱离文档流并向左/向右浮动,直到碰到父元素或者另一个浮动元素。
为什么要清楚浮动,它造成了什么问题?
因为浮动元素会脱离正常的文档流,并不会占据文档流的位置,所以如果一个父元素下面都是浮动元素,那么这个父元素就无法被浮动元素所撑开,这样一来父元素就丢失了高度,这就是所谓的浮动造成的父元素高度坍塌问题。
父元素高度一旦坍塌将对后面的元素布局造成影响,为了解决这个问题,所以需要清除浮动,让父元素恢复高度,那该如何做呢?
这里介绍两种方法:通过 BFC 来清除、通过 clear 来清除。

BFC 清除浮动

前面介绍 BFC 的时候提到过,计算 BFC 高度的时候浮动子元素的高度也将计算在内,利用这条规则就可以清楚浮动。
假设一个父元素 parent 内部只有 2 个子元素 child,且它们都是左浮动的,这个时候 parent 如果没有设置高度的话,因为浮动造成了高度坍塌,所以 parent 的高度会是 0,此时只要给 parent 创造一个 BFC,那它的高度就能恢复了。
而产生 BFC 的方式很多,可以给父元素设置overflow: auto 来简单的实现 BFC 清除浮动,但是为了兼容 IE 最好用 overflow: hidden

  1. .parent {
  2. overflow: hidden;
  3. }

通过 overflow: hidden 来清除浮动并不完美,当元素有阴影或存在下拉菜单的时候会被截断,所以该方法使用比较局限。

通过 clear 清除浮动

先把结论贴出来:

  1. .clearfix {
  2. zoom: 1;
  3. }
  4. .clearfix::after {
  5. content: "";
  6. display: block;
  7. clear: both;
  8. }

这种写法的核心原理就是通过 ::after 伪元素为在父元素的最后一个子元素后面生成一个内容为空的块级元素,然后通过 clear 将这个伪元素移动到所有它之前的浮动元素的后面,画个图来理解一下。
CSS基础——常见需求实现 - 图2
可以结合这个 codepen demo 一起理解上图的 clear 清楚浮动原理。
上面这个 demo 或者图里为了展示需要所以给伪元素的内容设置为了 ::after,实际使用的时候需要设置为空字符串,让它的高度为 0,从而父元素的高度都是由实际的子元素撑开。
该方式基本上是现在人人都在用的清除浮动的方案,非常通用。

消除浏览器默认样式

针对同一个类型的 HTML 标签,不同的浏览器往往有不同的表现,所以在网站制作的时候,开发者通常都是需要将这些浏览器的默认样式清除,让网页在不同的浏览器上能够保持一致。
针对清除浏览器默认样式这件事,在很早之前 CSS 大师 Eric A. Meyer 就干过。它就是写一堆通用的样式用来重置浏览器默认样式,这些样式通常会放到一个命名为 reset.css 文件中。比如大师的 reset.css 是这么写的:

  1. html, body, div, span, applet, object, iframe,
  2. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  3. a, abbr, acronym, address, big, cite, code,
  4. del, dfn, em, img, ins, kbd, q, s, samp,
  5. small, strike, strong, sub, sup, tt, var,
  6. b, u, i, center,
  7. dl, dt, dd, ol, ul, li,
  8. fieldset, form, label, legend,
  9. table, caption, tbody, tfoot, thead, tr, th, td,
  10. article, aside, canvas, details, embed,
  11. figure, figcaption, footer, header, hgroup,
  12. menu, nav, output, ruby, section, summary,
  13. time, mark, audio, video {
  14. margin: 0;
  15. padding: 0;
  16. border: 0;
  17. font-size: 100%;
  18. font: inherit;
  19. vertical-align: baseline;
  20. }
  21. /* HTML5 display-role reset for older browsers */
  22. article, aside, details, figcaption, figure,
  23. footer, header, hgroup, menu, nav, section {
  24. display: block;
  25. }
  26. body {
  27. line-height: 1;
  28. }
  29. ol, ul {
  30. list-style: none;
  31. }
  32. blockquote, q {
  33. quotes: none;
  34. }
  35. blockquote:before, blockquote:after,
  36. q:before, q:after {
  37. content: '';
  38. content: none;
  39. }
  40. table {
  41. border-collapse: collapse;
  42. border-spacing: 0;
  43. }

他的这份 reset.css 据说是被使用最广泛的重设样式的方案了。
除了 reset.css 外,后来又出现了 Normalize.css
文章介绍到:Normalize.css 只是一个很小的CSS文件,但它在默认的 HTML 元素样式上提供了跨浏览器的高度一致性。相比于传统的 CSS reset,Normalize.css 是一种现代的、为 HTML5 准备的优质替代方案,现在已经有很多知名的框架和网站在使用它了。
Normalize.css 的具体样式可以看这里 Normalize.css
区别于 reset.css,Normalize.css 有如下特点:

  • reset.css 几乎为所有标签都设置了默认样式,而 Normalize.css 则是有选择性的保护了部分有价值的默认值;
  • 修复了很多浏览器的 bug,而这是 reset.css 没做到的;
  • 不会让你的调试工具变的杂乱,相反 reset.css 由于设置了很多默认值,所以在浏览器调试工具中往往会看到一大堆的继承样式,显得很杂乱;
  • Normalize.css 是模块化的,所以可以选择性的去掉永远不会用到的部分,比如表单的一般化;
  • Normalize.css 有详细的说明文档;

    长文本处理

    默认:字符太长溢出了容器

    CSS基础——常见需求实现 - 图3

    字符超出部分换行

    CSS基础——常见需求实现 - 图4

    字符超出位置使用连字符

    CSS基础——常见需求实现 - 图5

    单行文本超出省略

    CSS基础——常见需求实现 - 图6

    多行文本超出省略

    CSS基础——常见需求实现 - 图7
    下面这种技术标签就是属于整块文本:
    CSS基础——常见需求实现 - 图8

    水平垂直居中

    让元素在父元素中呈现出水平垂直居中的形态,无非就 2 种情况:

  • 单行的文本、inline 或者 inline-block 元素;

  • 固定宽高的块级盒子;
  • 不固定宽高的块级盒子;

以下列到的所有水平垂直居中方案这里写了个 codepen demo,配合示例阅读效果更佳。

单行的文本、inline 或 inline-block 元素

水平居中

此类元素需要水平居中,则父级元素必须是块级元素(block level),且父级元素上需要这样设置样式:

  1. .parent {
  2. text-align: center;
  3. }

垂直居中

方法一:通过设置上下内间距一致达到垂直居中的效果:

  1. .single-line {
  2. padding-top: 10px;
  3. padding-bottom: 10px;
  4. }

方法二:通过设置 height 和 line-height 一致达到垂直居中:

  1. .single-line {
  2. height: 100px;
  3. line-height: 100px;
  4. }

固定宽高的块级盒子

方法一:absolute + 负 margin

CSS基础——常见需求实现 - 图9

方法二:absolute + margin auto

CSS基础——常见需求实现 - 图10

方法三:absolute + calc

CSS基础——常见需求实现 - 图11

不固定宽高的块级盒子

这里列了 6 种方法,参考了颜海镜 写的文章 ,其中的两种 line-height 和 writing-mode 方案看后让我惊呼:还有这种操作?学到了学到了。

方法一:absolute + transform

CSS基础——常见需求实现 - 图12

方法二:line-height + vertical-align

CSS基础——常见需求实现 - 图13

方法三:writing-mode

CSS基础——常见需求实现 - 图14

方法四:table-cell

CSS基础——常见需求实现 - 图15

方法五:flex

CSS基础——常见需求实现 - 图16

方法六:grid

CSS基础——常见需求实现 - 图17

常用布局

两栏布局(边栏定宽主栏自适应)

针对以下这些方案写了几个示例: codepen demo

方法一:float + overflow(BFC 原理)

CSS基础——常见需求实现 - 图18

方法二:float + margin

CSS基础——常见需求实现 - 图19

方法三:flex

CSS基础——常见需求实现 - 图20

方法四:grid

CSS基础——常见需求实现 - 图21

三栏布局(两侧栏定宽主栏自适应)

针对以下这些方案写了几个示例: codepen demo

方法一:圣杯布局

CSS基础——常见需求实现 - 图22

方法二:双飞翼布局

CSS基础——常见需求实现 - 图23

方法三:float + overflow(BFC 原理)

CSS基础——常见需求实现 - 图24

方法四:flex

CSS基础——常见需求实现 - 图25

方法五:grid

CSS基础——常见需求实现 - 图26

多列等高布局

结合示例阅读更佳:codepen demo

方法一:padding + 负margin

CSS基础——常见需求实现 - 图27

方法二:设置父级背景图片

CSS基础——常见需求实现 - 图28

三行布局(头尾定高主栏自适应)

列了 4 种方法,都是基于如下的 HTML 和 CSS 的,结合示例阅读效果更佳:codepen demo

  1. <div class="layout">
  2. <header></header>
  3. <main>
  4. <div class="inner"></div>
  5. </main>
  6. <footer></footer>
  7. </div>
  8. html,
  9. body,
  10. .layout {
  11. height: 100%;
  12. }
  13. body {
  14. margin: 0;
  15. }
  16. header,
  17. footer {
  18. height: 50px;
  19. }
  20. main {
  21. overflow-y: auto;
  22. }

方法一:calc

CSS基础——常见需求实现 - 图29

方法二:absolute

CSS基础——常见需求实现 - 图30

方法三:flex

CSS基础——常见需求实现 - 图31

方法四:grid

CSS基础——常见需求实现 - 图32