本文属于意译而非直译,为了方便理解也增加了一些自己的语言,如果存在偏差或错误还请留言指正。

精选的有用CSS片段集合,您可以在30秒或更短的时间内理解这些片段。

本 CSS 精选集合共分为5类 - 布局、视觉、动画、交互、其他。

更加详细的内容还请看 原文档。https://github.com/30-seconds/30-seconds-of-css

布局

1. 盒模型重置


  1. 盒模型重置,使盒子的宽度和高度不受其边框(border)或填充(padding)的影响。

HTML

  1. <div class="box">border-box</div>
  2. <div class="box content-box">content-box</div>

CSS

  1. html {
  2. box-sizing: border-box;
  3. }
  4. *,
  5. *::before,
  6. *::after {
  7. box-sizing: inherit;
  8. }
  9. .box {
  10. display: inline-block;
  11. width: 150px;
  12. height: 150px;
  13. padding: 10px;
  14. background: tomato;
  15. color: white;
  16. border: 10px solid red;
  17. }
  18. .content-box {
  19. box-sizing: content-box;
  20. }

DEMO

布局 - 图1

可在 CodePen 上查看真实效果和编辑代码

说明

  • box-sizing:当元素设置为border-box时,即便设置了padding或border也不会改变元素的宽度和高度。
  • box-sizing:设置inherit使元素继承父级的box-sizing规则。

浏览器支持情况

99.9% 查看本条 caniuse

2. 清除浮动更好的方式


无需借助辅助元素进行浮动的清除。

注意:这仅在使用float布局时才有用。实际场景中请考虑使用Flexbox布局或者网格布局。

HTML

  1. <div class="clearfix">
  2. <div class="floated">float a</div>
  3. <div class="floated">float b</div>
  4. <div class="floated">float c</div>
  5. </div>

CSS

  1. .clearfix{
  2. border:solid 1px red;
  3. }
  4. .clearfix::after {
  5. content: '';
  6. display: block;
  7. clear: both;
  8. }
  9. .floated {
  10. float: left;
  11. margin-left:20px;
  12. }

DEMO

布局 - 图2

可在 CodePen 上查看真实效果和编辑代码

浏览器支持情况

100%

3. 不变宽高比


给定宽度可变的元素,它将确保其高度以响应方式保持成比例(即,其宽高比保持不变)。

DEMO

布局 - 图3

可在 CodePen 上查看真实效果和编辑代码

HTML

  1. <div class="constant-width-to-height-ratio"></div>

CSS

  1. .constant-width-to-height-ratio {
  2. background: #333;
  3. width: 50%;
  4. }
  5. .constant-width-to-height-ratio::before {
  6. content: '';
  7. padding-top: 100%;
  8. float: left;
  9. }
  10. .constant-width-to-height-ratio::after {
  11. content: '';
  12. display: block;
  13. clear: both;
  14. }

说明

  • width:50% 只设置父级元素的宽度
  • ::before 为父级元素定义一个伪元素
  • padding-top: 100%; 设置伪元素的内上边距,这里的百分比的值是按照宽度计算的,所以会呈现为一个响应式的元素块。
  • 此方法还允许将内容正常放置在元素内。

浏览器支持情况

100%


4.使用表格居中


使用display:table(作为flexbox的替代)使子元素在其父元素中水平垂直居。

HTML

  1. <div class="container">
  2. <div class="center"><span>Centered content</span></div>
  3. </div>

CSS

  1. .container {
  2. border: 1px solid #333;
  3. height: 250px;
  4. width: 250px;
  5. }
  6. .center {
  7. display: table;
  8. height: 100%;
  9. width: 100%;
  10. }
  11. .center > span {
  12. display: table-cell;
  13. text-align: center;
  14. vertical-align: middle;
  15. }

DEMO

布局 - 图4

可在 CodePen 上查看真实效果和编辑代码

  • display:table 使.center元素的行为类似于 HTML元素。
  • 设置.center的宽高为100%,使其填满父元素。
  • display:table-cell, 设置’.center > span’的table-cell允许元素表现得像HTML元素。
  • text-align: center 使子元素水平居中。
  • vertical-align: middle 使子元素垂直居中。
  • 外部父级必须有固定的宽高。

    浏览器支持情况

    100% 查看本条 caniuse

    5. 使子元素均匀分布


    HTML

    1. <div class="evenly-distributed-children">
    2. <p>Item1</p>
    3. <p>Item2</p>
    4. <p>Item3</p>
    5. </div>
    1. .evenly-distributed-children {
    2. display: flex;
    3. justify-content: space-between;
    4. }

    DEMO

    布局 - 图5

    可在 CodePen 上查看真实效果和编辑代码

    说明

    • display: flex :启动flex 布局
    • justify-content: space-between:
    • 均匀地水平分配子元素。 第一个子元素位于左边缘,而最后一个子元素位于右边缘。 或者,使用justify-content:space-around来分配子节点周围的空间,而不是它们之间。

    浏览器支持情况

    99.5%

    • 需要前缀才能获得全面支持。 caniuse

    6. 让图片在容器中显示的更舒适


    设置图像在其容器内的适合度和位置,同时保留其宽高比。 以前只能使用背景图像和background-size属性来实现。

    HTML

    1. <img class="image image-contain" src="https://picsum.photos/600/200" />
    2. <img class="image image-cover" src="https://picsum.photos/600/200" />

    CSS

    1. .image {
    2. background: #34495e;
    3. border: 1px solid #34495e;
    4. width: 200px;
    5. height: 200px;
    6. }
    7. .image-contain {
    8. object-fit: contain;
    9. object-position: center;
    10. }
    11. .image-cover {
    12. object-fit: cover;
    13. object-position: right top;
    14. }

    DEMO

    布局 - 图6

    可在 CodePen 上查看真实效果和编辑代码

    说明

    • object-fit: contain 容器内显示整个图像,并且保持宽高比
    • object-fit: cover 用图像填充容器,并保持宽高比
    • object-position: [x] [y] 对图像的显示部位进行调整

    浏览器支持程度

    95.5% caniuse

    7. 使用 flexbox 居中


    使用 flexbox 水平垂直居中其子元素

    HTML

    1. <div class="flexbox-centering"><div class="child">Centered content.</div></div>

    CSS

    1. .flexbox-centering {
    2. display: flex;
    3. justify-content: center;
    4. align-items: center;
    5. height: 100px;
    6. }

    DEMO

    布局 - 图7

    可在 CodePen 上查看真实效果和编辑代码

    说明

    • display: flex 启用 flex 局部
    • justify-content: center 子元素水平居中
    • align-items: center 子元素垂直居中

    浏览器支持程度

    99.5% (需要使用前缀) caniuse

    8.将元素垂直居中于另一个元素。


    HTML

    1. <div class="ghost-trick">
    2. <div class="ghosting"><p>Vertically centered without changing the position property.</p></div>
    3. </div>

    CSS

    1. .ghosting {
    2. height: 300px;
    3. background: #0ff;
    4. }
    5. .ghosting:before {
    6. content: '';
    7. display: inline-block;
    8. height: 100%;
    9. vertical-align: middle;
    10. }
    11. p {
    12. display: inline-block;
    13. vertical-align: middle;
    14. }

    DEMO

    布局 - 图8

    可在 CodePen 上查看真实效果和编辑代码

    说明 使用 :before伪元素的样式垂直对齐内联元素而不更改其position属性。

    浏览器支持程度

    99.9% caniuse

    9. 使用网格居中


    使用网格水平垂直居中子元素.

    HTML

    1. <div class="grid-centering"><div class="child">Centered content.</div></div>

    CSS

    1. .grid-centering {
    2. display: grid;
    3. justify-content: center;
    4. align-items: center;
    5. height: 100px;
    6. }

    DEMO

    布局 - 图9

    可在 CodePen 上查看真实效果和编辑代码

    说明

    • display: grid 启用网格布局
    • justify-content: center 使子元素水平居中
    • align-items: center 使子元素垂直居中

    浏览器支持程度

    92.3% caniuse

    10. 使最后一项占满剩余高度


    通过为最后一个元素提供当前视口中剩余的可用空间,即使在调整窗口大小时,也可以利用可用的视口空间。

    HTML

    1. <div class="container">
    2. <div>Div 1</div>
    3. <div>Div 2</div>
    4. <div>Div 3</div>
    5. </div>

    CSS

    1. html,
    2. body {
    3. height: 100%;
    4. margin: 0;
    5. }
    6. .container {
    7. height: 100%;
    8. display: flex;
    9. flex-direction: column;
    10. }
    11. .container > div:last-child {
    12. background-color: tomato;
    13. flex: 1;
    14. }

    DEMO

    布局 - 图10

    可在 CodePen 上查看真实效果和编辑代码

    说明

    • height: 100% 将容器的高度设为视口的高度
    • display: flex 启用 flex
    • flex-direction: column 将项目的顺序设置成从上到下
    • flex-grow: 1 flexbox会将容器的剩余可用空间应用于最后一个子元素。 父级必须具有视口高度。 flex-grow:1可以应用于第一个或第二个元素,它将具有所有可用空间。

    浏览器支持程度

    99.5% 需要使用前缀 caniuse

    11. 屏外隐藏元素


    HTML

    1. <a class="button" href="http://pantswebsite.com">
    2. Learn More <span class="offscreen"> about pants</span>
    3. </a>

    CSS

    1. .offscreen {
    2. border: 0;
    3. clip: rect(0 0 0 0);
    4. height: 1px;
    5. margin: -1px;
    6. overflow: hidden;
    7. padding: 0;
    8. position: absolute;
    9. width: 1px;
    10. }

    DEMO

    布局 - 图11 可在 CodePen 上查看真实效果和编辑代码

    说明

    • 删除所有边框
    • 使用 clip 隐藏元素
    • 设置宽高为1px
    • 使用margin:-1px取消元素的高度和宽度
    • 隐藏元素的溢出
    • 移除所有的padding
    • 绝对定位元素,使其不占用DOM中的空间

    浏览器支持程度

    100% 需要使用前缀 caniuse (虽然cilp已被废弃,但较新的clip-path 目前对浏览器的支持非常有限。)

    12. 使用transform居中子元素


    使用 position: absolute and transform: translate() 进行居中,不需要知道父级和子元素的宽高,因此它非常适合响应式应用程序。

    HTML

    1. <div class="parent"><div class="child">Centered content</div></div>

    CSS

    1. .parent {
    2. border: 1px solid #333;
    3. height: 250px;
    4. position: relative;
    5. width: 250px;
    6. }
    7. .child {
    8. left: 50%;
    9. position: absolute;
    10. top: 50%;
    11. transform: translate(-50%, -50%);
    12. text-align: center;
    13. }

    DEMO

    布局 - 图12

    可在 CodePen 上查看真实效果和编辑代码

    浏览器支持程度

    97.7% 需要使用前缀 caniuse

    视觉

    13.多行文本截断显示


    如果文本长于一行,则将截断n行,并以渐变结束。

    HTML

    1. <p class="truncate-text-multiline">
    2. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
    3. labore et.
    4. </p>

    CSS

    1. .truncate-text-multiline {
    2. overflow: hidden;
    3. display: block;
    4. height: 109.2px;
    5. margin: 0 auto;
    6. font-size: 26px;
    7. line-height: 1.4;
    8. width: 400px;
    9. position: relative;
    10. }
    11. .truncate-text-multiline:after {
    12. content: '';
    13. position: absolute;
    14. bottom: 0;
    15. right: 0;
    16. width: 150px;
    17. height: 36.4px;
    18. background: linear-gradient(to right, rgba(0, 0, 0, 0), #f5f6f9 50%);
    19. }

    DEMO

    布局 - 图13

    可在 CodePen 上查看真实效果和编辑代码

    说明

    • overflow: hidden 防止内容溢出
    • width: 400px 确保元素有尺寸
    • height: 109.2px 计算的高度值,它等于font-size line-height numberOfLines(在这种情况下为26 1.4 3 = 109.2)
    • height: 36.4px 渐变容器的计算值,它等于font-size line-height(在这种情况下为26 1.4 = 36.4)
    • background: linear-gradient(to right, rgba(0, 0, 0, 0), #f5f6f9 50% 渐变从 透明到渐变从透明到#f5f6f9

    浏览器支持程度

    97.5% caniuse

    14. 画一个圆


    使用纯CSS创建圆形。

    HTML

    1. <div class="circle"></div>

    CSS

    1. .circle {
    2. border-radius: 50%;
    3. width: 2rem;
    4. height: 2rem;
    5. background: #333;
    6. }

    DEMO

    布局 - 图14

    可在 CodePen 上查看真实效果和编辑代码

    浏览器支持程度

    97.7% caniuse

    15. 列表计数器


    计数器本质上是由CSS维护的变量,其值可以通过CSS规则递增以跟踪它们被使用的次数。

    HTML

    1. <ul>
    2. <li>List item</li>
    3. <li>List item</li>
    4. <li>
    5. List item
    6. <ul>
    7. <li>List item</li>
    8. <li>List item</li>
    9. <li>List item</li>
    10. </ul>
    11. </li>
    12. </ul>

    CSS

    1. ul {
    2. counter-reset: counter;
    3. }
    4. li::before {
    5. counter-increment: counter;
    6. content: counters(counter, '.') ' ';
    7. }

    DEMO

    布局 - 图15

    可在 CodePen 上查看真实效果和编辑代码

    说明 你现在可以使用任何类型的html 标签创建有序列表。

    • counter-reset 初始化计数器,该值是计数器的名称。默认情况下,计数器从0开始。此属性还可用于将其值更改为任何特定数字。
    • counter-increment 用于可数的元素。 一旦计数器重置初始化,计数器的值可以增加或减少。
    • counter(name, style)显示节计数器的值。通常用于内容属性。此函数可以接收两个参数,第一个作为计数器的名称,第二个参数表示占位内容,例如3.1的小数点。
    • CSS计数器对于制作轮廓列表特别有用,因为计数器的新实例是在子元素中自动创建的。使用counters()函数,可以在不同级别的嵌套计数器之间插入分隔文本。

    浏览器支持程度

    99.9% caniuse

    16.自定义滚动条


    HTML

    1. <div class="custom-scrollbar">
    2. <p>
    3. Lorem ipsum dolor sit amet consectetur adipisicing elit.<br />
    4. Iure id exercitationem nulla qui repellat laborum vitae, <br />
    5. molestias tempora velit natus. Quas, assumenda nisi. <br />
    6. Quisquam enim qui iure, consequatur velit sit?
    7. </p>
    8. </div>

    CSS

    1. .custom-scrollbar {
    2. height: 70px;
    3. overflow-y: scroll;
    4. }
    5. /* To style the document scrollbar, remove `.custom-scrollbar` */
    6. .custom-scrollbar::-webkit-scrollbar {
    7. width: 8px;
    8. }
    9. .custom-scrollbar::-webkit-scrollbar-track {
    10. box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
    11. border-radius: 10px;
    12. }
    13. .custom-scrollbar::-webkit-scrollbar-thumb {
    14. border-radius: 10px;
    15. box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.5);
    16. }

    DEMO

    布局 - 图16

    可在 CodePen 上查看真实效果和编辑代码

    浏览器支持程度

    90.7% caniuse

    17. 自定义文本选择的样式


    HTML

    1. <p class="custom-text-selection">Select some of this text.</p>

    CSS

    1. ::selection {
    2. background: aquamarine;
    3. color: black;
    4. }
    5. .custom-text-selection::selection {
    6. background: deeppink;
    7. color: white;
    8. }

    DEMO

    布局 - 图17

    可在 CodePen 上查看真实效果和编辑代码

    浏览器支持程度

    86.5% caniuse

    18. 创建动态阴影


    创建类似于box-shadow的阴影,但基于元素本身的颜色。

    HTMl

    1. <div class="dynamic-shadow"></div>

    CSS

    1. .dynamic-shadow {
    2. position: relative;
    3. width: 10rem;
    4. height: 10rem;
    5. background: linear-gradient(75deg, #6d78ff, #00ffb8);
    6. z-index: 1;
    7. }
    8. .dynamic-shadow::after {
    9. content: '';
    10. width: 100%;
    11. height: 100%;
    12. position: absolute;
    13. background: inherit;
    14. top: 0.5rem;
    15. filter: blur(0.4rem);
    16. opacity: 0.7;
    17. z-index: -1;
    18. }

    DEMO

    布局 - 图18 可在 CodePen 上查看真实效果和编辑代码

    说明

    • ::after 定义一个伪元素
    • position: absolute 使伪元素脱离文档流并相对于父级定位
    • width: 100% and height: 100% 对伪元素进行大小调整以填充其父元素的大小,使其大小相等。
    • background: inherit 使伪元素继承父级的线性渐变
    • top: 0.5rem 将伪元素相对于其父元素略微偏移。
    • filter: blur(0.4rem) 设置伪元素模糊效果,以创建下方阴影效果。
    • opacity: 0.7 设置伪元素透明度
    • z-index: -1 将伪元素定位在父元素后面但在背景前面。

    浏览器支持程度

    94.2% 需要使用前缀 caniuse

    19. 蚀刻文字效果


    创建一种效果,其中文本看起来像“蚀刻”或雕刻在背景中。 HTML

    1. <p class="etched-text">I appear etched into the background.</p>

    CSS

    1. .etched-text {
    2. text-shadow: 0 2px white;
    3. font-size: 1.5rem;
    4. font-weight: bold;
    5. color: #b8bec5;
    6. }

    DEMO

    布局 - 图19 可在 CodePen 上查看真实效果和编辑代码

    说明

    • text-shadow: 0 2px white 从原点位置创建一个水平偏移0px和垂直偏移2px的白色阴影。
    • 背景必须比阴影更暗,效果才更明显。

    浏览器支持程度

    99.5% 需要使用前缀 caniuse

    20. Focus Within 伪类


    如果表单中的任何子项被聚焦,则更改表单的外观。 HTML

    1. <div class="focus-within">
    2. <form>
    3. <label for="given_name">Given Name:</label> <input id="given_name" type="text" /> <br />
    4. <label for="family_name">Family Name:</label> <input id="family_name" type="text" />
    5. </form>
    6. </div>

    CSS

    1. form {
    2. border: 3px solid #2d98da;
    3. color: #000000;
    4. padding: 4px;
    5. }
    6. form:focus-within {
    7. background: #f7b731;
    8. color: #000000;
    9. }

    DEMO

    布局 - 图20

    布局 - 图21

    可在 CodePen 上查看真实效果和编辑代码

    说明

    • 伪类::focus-within 将对应的样式应用于父元素(任何子元素被聚焦)。 例如,表单元素内的输入元素。

    浏览器支持程度

    82.9% IE11或当前版本的Edge不支持。 caniuse

    21. 指定元素的全屏


    :fullsrcreen 全屏伪类表示浏览器处于全屏模式时显示的元素。 HTML

    1. <div class="container">
    2. <p><em>Click the button below to enter the element into fullscreen mode. </em></p>
    3. <div class="element" id="element"><p>I change color in fullscreen mode!</p></div>
    4. <br />
    5. <button onclick="var el = document.getElementById('element'); el.requestFullscreen();">
    6. Go Full Screen!
    7. </button>
    8. </div>

    CSS

    1. .container {
    2. margin: 40px auto;
    3. max-width: 700px;
    4. }
    5. .element {
    6. padding: 20px;
    7. height: 300px;
    8. width: 100%;
    9. background-color: skyblue;
    10. }
    11. .element p {
    12. text-align: center;
    13. color: white;
    14. font-size: 3em;
    15. }
    16. .element:-ms-fullscreen p {
    17. visibility: visible;
    18. }
    19. .element:fullscreen {
    20. background-color: #e4708a;
    21. width: 100vw;
    22. height: 100vh;
    23. }

    DEMO

    布局 - 图22

    布局 - 图23 可在 CodePen 上查看真实效果和编辑代码

    说明

    • :fullscreen 伪类选择器用于选择和设置以全屏模式显示的元素。

    浏览器支持程度

    85.6%

    属性详解

    caniuse

    22.渐变文字


    为文本提供渐变颜色。

    HTML

    1. <p class="gradient-text">Gradient text</p>

    CSS

    1. .gradient-text {
    2. background: -webkit-linear-gradient(pink, red);
    3. -webkit-text-fill-color: transparent;
    4. -webkit-background-clip: text;
    5. }

    DEMO

    布局 - 图24

    可在 CodePen 上查看真实效果和编辑代码

    浏览器支持程度

    94.1%

    caniuse

    23. 渐变跟踪


    一种悬停效果,其中渐变跟随鼠标光标。

    HTML

    1. <button class="button">
    2. <span>Hover me I'm awesome</span>
    3. </button>

    CSS

    1. body {
    2. display: flex;
    3. justify-content: center;
    4. align-items: center;
    5. min-height: 100vh;
    6. background: white;
    7. }
    8. .button {
    9. position: relative;
    10. appearance: none;
    11. background: #f72359;
    12. padding: 1em 2em;
    13. border: none;
    14. color: white;
    15. font-size: 1.2em;
    16. cursor: pointer;
    17. outline: none;
    18. overflow: hidden;
    19. border-radius: 100px;
    20. span {
    21. position: relative;
    22. pointer-events: none;
    23. }
    24. &::before {
    25. --size: 0;
    26. content: '';
    27. position: absolute;
    28. left: var(--x);
    29. top: var(--y);
    30. width: var(--size);
    31. height: var(--size);
    32. background: radial-gradient(circle closest-side, #4405f7, transparent);
    33. transform: translate(-50%, -50%);
    34. transition: width .2s ease, height .2s ease;
    35. }
    36. &:hover::before {
    37. --size: 400px;
    38. }
    39. }
    1. document.querySelector('.button').onmousemove = (e) => {
    2. const x = e.pageX - e.target.offsetLeft
    3. const y = e.pageY - e.target.offsetTop
    4. e.target.style.setProperty('--x', `${ x }px`)
    5. e.target.style.setProperty('--y', `${ y }px`)
    6. }

    DEMO

    布局 - 图25

    布局 - 图26

    可在 CodePen 上查看真实效果和编辑代码

    浏览器支持程度

    91.6% 需要使用 js caniuse

    24. :not 伪类选择器


    :not 伪选择器对于设置一组元素的样式非常有用,同时保留最后一个(指定的)元素的样式。

    HTML

    1. <ul class="css-not-selector-shortcut">
    2. <li>One</li>
    3. <li>Two</li>
    4. <li>Three</li>
    5. <li>Four</li>
    6. </ul>

    CSS

    1. .css-not-selector-shortcut {
    2. display: flex;
    3. }
    4. ul {
    5. padding-left: 0;
    6. }
    7. li {
    8. list-style-type: none;
    9. margin: 0;
    10. padding: 0 0.75rem;
    11. }
    12. li:not(:last-child) {
    13. border-right: 2px solid #d2d5e4;
    14. }

    DEMO

    布局 - 图27

    可在 CodePen 上查看真实效果和编辑代码

    说明

    • li:not(:last-child) 设置除last:child之外的所有li元素的样式,所以最后一个元素右侧没有 border.

    浏览器支持程度

    99.9% caniuse

    25.溢出滚动渐变


    给溢出元素添加渐变,以更好地指示要滚动的内容。 HTLM

    1. <div class="overflow-scroll-gradient">
    2. <div class="overflow-scroll-gradient__scroller">
    3. Lorem ipsum dolor sit amet consectetur adipisicing elit. <br />
    4. Iure id exercitationem nulla qui repellat laborum vitae, <br />
    5. molestias tempora velit natus. Quas, assumenda nisi. <br />
    6. Quisquam enim qui iure, consequatur velit sit? <br />
    7. Lorem ipsum dolor sit amet consectetur adipisicing elit.<br />
    8. Iure id exercitationem nulla qui repellat laborum vitae, <br />
    9. molestias tempora velit natus. Quas, assumenda nisi. <br />
    10. Quisquam enim qui iure, consequatur velit sit?
    11. </div>
    12. </div>

    CSS

    1. .overflow-scroll-gradient {
    2. position: relative;
    3. }
    4. .overflow-scroll-gradient::after {
    5. content: '';
    6. position: absolute;
    7. bottom: 0;
    8. width: 240px;
    9. height: 25px;
    10. background: linear-gradient(
    11. rgba(255, 255, 255, 0.001),
    12. white
    13. ); /* transparent keyword is broken in Safari */
    14. pointer-events: none;
    15. }
    16. .overflow-scroll-gradient__scroller {
    17. overflow-y: scroll;
    18. background: white;
    19. width: 240px;
    20. height: 200px;
    21. padding: 15px;
    22. line-height: 1.2;
    23. }

    DEMO

    布局 - 图28

    说明

    • ::after 定义一个伪元素用来展示渐变效果
    • background-image: linear-gradient(...) 添加一个从透明变为白色(从上到下)的线性渐变。
    • pointer-events: none 指定伪元素不能是鼠标事件的目标,后面的文本仍然是可选择/交互的。

    浏览器支持程度

    97.5% caniuse

    26.给文字添加漂亮的下划线


    HTML

    1. <p class="pretty-text-underline">Pretty text underline without clipping descending letters.</p>

    CSS

    1. .pretty-text-underline {
    2. display: inline;
    3. text-shadow: 1px 1px #f5f6f9, -1px 1px #f5f6f9, -1px -1px #f5f6f9, 1px -1px #f5f6f9;
    4. background-image: linear-gradient(90deg, currentColor 100%, transparent 100%);
    5. background-position: bottom;
    6. background-repeat: no-repeat;
    7. background-size: 100% 1px;
    8. }
    9. .pretty-text-underline::-moz-selection {
    10. background-color: rgba(0, 150, 255, 0.3);
    11. text-shadow: none;
    12. }
    13. .pretty-text-underline::selection {
    14. background-color: rgba(0, 150, 255, 0.3);
    15. text-shadow: none;
    16. }

    DEMO

    布局 - 图29 CodePen上查看和编辑代码

    浏览器支持程度

    97.5% caniuse1 caniuse2

    27. 重置所有样式


    使用一个属性将所有样式重置为默认值。 这不会影响directionunicode-bidi属性。

    HTML

    1. <div class="reset-all-styles">
    2. <h5>Title</h5>
    3. <p>
    4. Lorem ipsum dolor sit amet consectetur adipisicing elit. Iure id exercitationem nulla qui
    5. repellat laborum vitae, molestias tempora velit natus. Quas, assumenda nisi. Quisquam enim qui
    6. iure, consequatur velit sit?
    7. </p>
    8. </div>

    CSS

    1. .reset-all-styles {
    2. all: initial;
    3. }

    DEMO

    布局 - 图30

    CodePen上查看和编辑代码

    说明

    all 属性允许您将所有样式(继承或不继承)重置为默认值。

    浏览器支持程度

    91.2% caniuse

    28. 形状分隔符


    使用SVG形状分割两个不同的块以创建更有趣的视觉外观。

    HTML

    1. <div class="shape-separator"></div>

    CSS

    1. .shape-separator {
    2. position: relative;
    3. height: 48px;
    4. background: #333;
    5. }
    6. .shape-separator::after {
    7. content: '';
    8. background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 12'%3E%3Cpath d='m12 0l12 12h-24z' fill='%23fff'/%3E%3C/svg%3E");
    9. position: absolute;
    10. width: 100%;
    11. height: 12px;
    12. bottom: 0;
    13. }

    DEMO

    布局 - 图31

    CodePen上查看和编辑代码

    说明

    • background-image: url(...)添加SVG形状(24x12三角形)作为伪元素的背景图像,默认情况下重复。 它必须与要分割的块颜色相同。对于其他形状,我们可以使用SVG的URL编码器

    浏览器支持程度

    99.7% caniuse

    29. 系统字体


    HTML

    1. <p class="system-font-stack">This text uses the system font.</p>

    CSS

    1. .system-font-stack {
    2. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu,
    3. Cantarell, 'Helvetica Neue', Helvetica, Arial, sans-serif;
    4. }

    DEMO

    布局 - 图32

    CodePen上查看和编辑代码

    说明 浏览器会对字体进行逐个查找,如果找到的话就是用当前的,如果找不到字体(在系统上或在CSS中定义),则继续往后查找。

    • -apple-system在iOS和macOS上使用(但不是Chrome)
    • BlinkMacSystemFont 用于macOS Chrome
    • Segoe UI 用于Windows 10
    • Roboto 在Android上使用
    • Oxygen-Sans 在Linux KDE上使用
    • Ubuntu 用于Ubuntu
    • Cantarell 在GNOME Shell的Linux上使用
    • Helvetica Neue and Helvetica 用于macOS 10.10及更低版本
    • Arial 操作系统广泛支持的字体
    • sans-serif 如果不支持其他任何字体,则降级使用 sans-serif 通用字体

    浏览器支持程度 100%

    30. css 开关


    只使用 css 来实现

    HTMl

    1. <input type="checkbox" id="toggle" class="offscreen" /> <label for="toggle" class="switch"></label>

    CSS

    1. .switch {
    2. position: relative;
    3. display: inline-block;
    4. width: 40px;
    5. height: 20px;
    6. background-color: rgba(0, 0, 0, 0.25);
    7. border-radius: 20px;
    8. transition: all 0.3s;
    9. }
    10. .switch::after {
    11. content: '';
    12. position: absolute;
    13. width: 18px;
    14. height: 18px;
    15. border-radius: 18px;
    16. background-color: white;
    17. top: 1px;
    18. left: 1px;
    19. transition: all 0.3s;
    20. }
    21. input[type='checkbox']:checked + .switch::after {
    22. transform: translateX(20px);
    23. }
    24. input[type='checkbox']:checked + .switch {
    25. background-color: #7983ff;
    26. }
    27. .offscreen {
    28. position: absolute;
    29. left: -9999px;
    30. }

    DEMO

    布局 - 图33

    CodePen上预览和编辑代码

    浏览器支持程度 97.7% 需要使用前缀

    caniuse

    31. 用 css 画一个三角形


    HTML

    1. <div class="triangle"></div>

    CSS

    1. .triangle {
    2. width: 0;
    3. height: 0;
    4. border-top: 20px solid #333;
    5. border-left: 20px solid transparent;
    6. border-right: 20px solid transparent;
    7. }

    DEMO

    布局 - 图34 CodePen上预览和编辑代码

    浏览器支持程度 100%;

    32. 斑马条纹列表


    创建具有交替背景颜色的列表,这对于区分各行间的内容很有用。

    HTML

    1. <ul>
    2. <li>Item 01</li>
    3. <li>Item 02</li>
    4. <li>Item 03</li>
    5. <li>Item 04</li>
    6. <li>Item 05</li>
    7. </ul>

    CSS

    1. li:nth-child(odd) {
    2. background-color: #eee;
    3. }

    DEMO

    布局 - 图35

    CodePen上预览和编辑代码

    浏览器支持程度 99.9% caniuse

    动画

    33.弹跳 loading 动画


    HTML

    1. <div class="bouncing-loader">
    2. <div></div>
    3. <div></div>
    4. <div></div>
    5. </div>

    CSS

    1. @keyframes bouncing-loader {
    2. to {
    3. opacity: 0.1;
    4. transform: translate3d(0, -1rem, 0);
    5. }
    6. }
    7. .bouncing-loader {
    8. display: flex;
    9. justify-content: center;
    10. }
    11. .bouncing-loader > div {
    12. width: 1rem;
    13. height: 1rem;
    14. margin: 3rem 0.2rem;
    15. background: #8385aa;
    16. border-radius: 50%;
    17. animation: bouncing-loader 0.6s infinite alternate;
    18. }
    19. .bouncing-loader > div:nth-child(2) {
    20. animation-delay: 0.2s;
    21. }
    22. .bouncing-loader > div:nth-child(3) {
    23. animation-delay: 0.4s;
    24. }

    DEMO

    布局 - 图36

    CodePen上预览和编辑代码

    浏览器支持程度97.4% caniuse

    34. 按钮边框动画


    创建一个鼠标悬停的边框动画

    HTML

    1. <div class="button-border"><button class="button">Submit</button></div>

    CSS

    1. .button {
    2. background-color: #c47135;
    3. border: none;
    4. color: #ffffff;
    5. outline: none;
    6. padding: 12px 40px 10px;
    7. position: relative;
    8. }
    9. .button:before,
    10. .button:after {
    11. border: 0 solid transparent;
    12. transition: all 0.25s;
    13. content: '';
    14. height: 24px;
    15. position: absolute;
    16. width: 24px;
    17. }
    18. .button:before {
    19. border-top: 2px solid #c47135;
    20. left: 0px;
    21. top: -5px;
    22. }
    23. .button:after {
    24. border-bottom: 2px solid #c47135;
    25. bottom: -5px;
    26. right: 0px;
    27. }
    28. .button:hover {
    29. background-color: #c47135;
    30. }
    31. .button:hover:before,
    32. .button:hover:after {
    33. height: 100%;
    34. width: 100%;
    35. }

    DEMO

    布局 - 图37

    CodePen上预览和编辑代码

    说明 使用:before和:after伪元素作为在悬停时设置动画的边框。

    浏览器支持程度 100%.

    35.甜甜圈旋转器


    创建一个甜甜圈旋转器,可用于等待内容的加载。

    DEMO

    布局 - 图38

    HTML

    1. <div class="donut"></div>

    CSS

    1. @keyframes donut-spin {
    2. 0% {
    3. transform: rotate(0deg);
    4. }
    5. 100% {
    6. transform: rotate(360deg);
    7. }
    8. }
    9. .donut {
    10. display: inline-block;
    11. border: 4px solid rgba(0, 0, 0, 0.1);
    12. border-left-color: #7983ff;
    13. border-radius: 50%;
    14. width: 30px;
    15. height: 30px;
    16. animation: donut-spin 1.2s linear infinite;
    17. }

    CodePen上预览和编辑代码

    说明 对于整个元素使用半透明边框,然后设置一侧的边框颜色 border-left-color: #7983ff;,最后使用动画旋转整个元素。

    浏览器支持程度 97.4% 需要使用前缀。

    caniuse1 https://caniuse.com/#feat=transforms2d

    caniuse2 feat=transforms2d

    36.缓动效果


    DEMO

    布局 - 图39

    HTML

    1. <div class="easing-variables">Hover</div>

    CSS

    1. :root {
    2. /* Place variables in here to use globally */
    3. }
    4. .easing-variables {
    5. --ease-in-quad: cubic-bezier(0.55, 0.085, 0.68, 0.53);
    6. --ease-in-cubic: cubic-bezier(0.55, 0.055, 0.675, 0.19);
    7. --ease-in-quart: cubic-bezier(0.895, 0.03, 0.685, 0.22);
    8. --ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06);
    9. --ease-in-expo: cubic-bezier(0.95, 0.05, 0.795, 0.035);
    10. --ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.335);
    11. --ease-out-quad: cubic-bezier(0.25, 0.46, 0.45, 0.94);
    12. --ease-out-cubic: cubic-bezier(0.215, 0.61, 0.355, 1);
    13. --ease-out-quart: cubic-bezier(0.165, 0.84, 0.44, 1);
    14. --ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1);
    15. --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
    16. --ease-out-circ: cubic-bezier(0.075, 0.82, 0.165, 1);
    17. --ease-in-out-quad: cubic-bezier(0.455, 0.03, 0.515, 0.955);
    18. --ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1);
    19. --ease-in-out-quart: cubic-bezier(0.77, 0, 0.175, 1);
    20. --ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1);
    21. --ease-in-out-expo: cubic-bezier(1, 0, 0, 1);
    22. --ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.15, 0.86);
    23. display: inline-block;
    24. width: 75px;
    25. height: 75px;
    26. padding: 10px;
    27. color: white;
    28. line-height: 50px;
    29. text-align: center;
    30. background: #333;
    31. transition: transform 1s var(--ease-out-quart);
    32. }
    33. .easing-variables:hover {
    34. transform: rotate(45deg);
    35. }

    CodePen上预览和编辑代码

    浏览器支持程度 91.6% caniuse css-variables

    37.高度过度


    当元素的高度未知时,将元素的高度从0转换为自动。

    DEMO

    布局 - 图40

    CodePen上预览和编辑代码

    HTML

    1. <div class="trigger">
    2. Hover me to see a height transition.
    3. <div class="el">content</div>
    4. </div>

    CSS

    1. .el {
    2. transition: max-height 0.5s;
    3. overflow: hidden;
    4. max-height: 0;
    5. }
    6. .trigger:hover > .el {
    7. max-height: var(--max-height);
    8. }

    JAVASCRIPT

    1. var el = document.querySelector('.el')
    2. var height = el.scrollHeight
    3. el.style.setProperty('--max-height', height + 'px')

    说明

    浏览器支持程度 91.6% caniuse css-variables

    • 注意:将会导致所有动画帧重排,过度中如果元素下方有大量元素,则可能会出现滞后现象。

    caninuse - css-variables

    caninuse - css-transitions

    38.悬停阴影动画


    在文本上悬停时,在文本周围创建一个阴影框动画效果。

    布局 - 图41

    动画效果可在CodePen上预览和编辑代码

    HTML

    1. <p class="hover-shadow-box-animation">Box it!</p>

    CSS

    1. .hover-shadow-box-animation {
    2. display: inline-block;
    3. vertical-align: middle;
    4. transform: perspective(1px) translateZ(0);
    5. box-shadow: 0 0 1px transparent;
    6. margin: 10px;
    7. transition-duration: 0.3s;
    8. transition-property: box-shadow, transform;
    9. }
    10. .hover-shadow-box-animation:hover,
    11. .hover-shadow-box-animation:focus,
    12. .hover-shadow-box-animation:active {
    13. box-shadow: 1px 10px 10px -10px rgba(0, 0, 24, 0.5);
    14. transform: scale(1.2);
    15. }

    浏览器支持程度97.3%

    caniuse - feat-transforms3d

    caniuse - css-transitions

    39.悬停下滑线动画


    当文本悬停时,创建文本下划线动画效果。

    DEMO

    布局 - 图42

    动画效果可在CodePen上预览和编辑代码

    HTML

    1. <p class="hover-underline-animation">Hover this text to see the effect!</p>

    CSS

    1. .hover-underline-animation {
    2. display: inline-block;
    3. position: relative;
    4. color: #0087ca;
    5. }
    6. .hover-underline-animation::after {
    7. content: '';
    8. position: absolute;
    9. width: 100%;
    10. transform: scaleX(0);
    11. height: 2px;
    12. bottom: 0;
    13. left: 0;
    14. background-color: #0087ca;
    15. transform-origin: bottom right;
    16. transition: transform 0.25s ease-out;
    17. }
    18. .hover-underline-animation:hover::after {
    19. transform: scaleX(1);
    20. transform-origin: bottom left;
    21. }

    说明

    • display: inline-block 使p成为内联块,以防止下划线跨越整行宽度而不仅仅是文本内容。
    • position: relative 设置父元素为相对定位
    • ::after 定义一个伪元素
    • position: absolute 将伪元素脱离文档六,并将其相对于父元素定位
    • width: 100% 确保伪元素和父元素的宽度一致。
    • transform: scaleX(0) 最初将伪元素缩放为0,因此他是看不见的。
    • bottom: 0 and left: 0 将伪元素放在父元素的左下角。
    • transition: transform 0.25s ease-out 设置动画效果为ease-out,并且在0.25秒内完成。
    • transform-origin: bottom right 变换中心点到父元素的右下角。
    • :hover::after 然后使用scaleX(1)将宽度转换为100%,然后将中心点更改为左下角,允许它在悬停时从另一个方向转换出来。

    浏览器支持程度97.5%

    caniuse - feat=transforms2d

    caniuse - css-transitions

    交互

    40. 禁用选择


    使用 css 让内容无法选取。

    DEMO

    布局 - 图43

    可在CodePen上预览效果和编辑代码

    HTML

    1. <p>You can select me.</p>
    2. <p class="unselectable">You can't select me!</p>

    CSS

    1. .unselectable {
    2. user-select: none;
    3. }

    说明

    user-select: none 指定无法选择文本

    浏览器支持程度93.2% (需要使用前缀,这并不是防止用户复制内容的安全方法。)

    caniuse - feat=user-select-none

    41. 弹出菜单


    在悬停和焦点上弹出交互式菜单。

    布局 - 图44

    可在CodePen上预览效果和编辑代码

    HTML

    1. <div class="reference" tabindex="0"><div class="popout-menu">Popout menu</div></div>

    CSS

    1. .reference {
    2. position: relative;
    3. background: tomato;
    4. width: 100px;
    5. height: 100px;
    6. }
    7. .popout-menu {
    8. position: absolute;
    9. visibility: hidden;
    10. left: 100%;
    11. background: #333;
    12. color: white;
    13. padding: 15px;
    14. }
    15. .reference:hover > .popout-menu,
    16. .reference:focus > .popout-menu,
    17. .reference:focus-within > .popout-menu {
    18. visibility: visible;
    19. }

    说明

    • left: 100% 弹出菜单从左侧偏移其父级宽度的100%。
    • visibility: hidden
    • .reference:hover > .popout-menu 鼠标悬停时,.popout-menu 显示
    • .reference:focus > .popout-menu 聚焦时,.popout-menu 显示
    • .reference:focus-within > .popout-menu 确保在焦点位于参考范围内时显示弹出窗口。

    浏览器支持程度 100%;

    42.兄弟元素淡化


    悬停时兄弟节点淡化显示.

    DEMO

    布局 - 图45

    布局 - 图46

    可在CodePen上预览效果和编辑代码

    HTML

    1. <div class="sibling-fade">
    2. <span>Item 1</span> <span>Item 2</span> <span>Item 3</span> <span>Item 4</span>
    3. <span>Item 5</span> <span>Item 6</span>
    4. </div>

    CSS

    1. span {
    2. padding: 0 1rem;
    3. transition: opacity 0.2s;
    4. }
    5. .sibling-fade:hover span:not(:hover) {
    6. opacity: 0.5;
    7. }

    说明

    • transition: opacity 0.2s 设置0.2秒的淡化动画。
    • .sibling-fade:hover span:not(:hover)当父级悬停时,选择当前未悬停的span子项并将其透明度更改为0.5。

    浏览器支持程度 97.5%;

    caniuse-feat=css-sel3

    caniuse-feat=css-transitions

    其他

    43. 计算函数 Calc()


    函数calc()允许使用数学表达式定义CSS值,属性采用的值是数学表达式的结果。

    DEMO

    布局 - 图47

    可在CodePen上预览效果和编辑代码

    如果你想在右侧和底部对齐背景图像,则只能使用直线长度值。 所以现在可以使用calc()函数.

    HTML

    1. <div class="box-example"></div>

    CSS

    1. .box-example {
    2. height: 280px;
    3. background: #222 url('https://image.ibb.co/fUL9nS/wolf.png') no-repeat;
    4. background-position: calc(100% - 20px) calc(100% - 20px);
    5. }

    说明

    • 允许加法,减法,乘法和除法。
    • 可以为表达式中的每个值使用不同的单位(例如,像素和百分比)。
    • 允许嵌套calc()函数。
    • 它可用于任何允许

    浏览器支持程度 97.0%

    caniuse - feat=calc

    44. css 自定义变量


    包含要重用的特定值的CSS变量。

    HTML

    1. <p class="custom-variables">CSS is awesome!</p>

    CSS

    1. :root {
    2. /* Place variables within here to use the variables globally. */
    3. }
    4. .custom-variables {
    5. --some-color: #da7800;
    6. --some-keyword: italic;
    7. --some-size: 1.25em;
    8. --some-complex-value: 1px 1px 2px whitesmoke, 0 0 1em slategray, 0 0 0.2em slategray;
    9. color: var(--some-color);
    10. font-size: var(--some-size);
    11. font-style: var(--some-keyword);
    12. text-shadow: var(--some-complex-value);
    13. }

    DEMO

    布局 - 图48

    可在CodePen上预览效果和编辑代码

    说明

    • --variable-name: 用这样的格式来声明变量。
    • var(--variable-name) 使用此函数在整个文档中重用变量。

    浏览器支持程度 91.6%

    caniuse - feat=css-variables


    更多精彩好玩有用的前端内容,请关注公众号《前端张大胖》

    布局 - 图49