整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

一个制作Web图案的组件css-doodle

一个制作Web图案的组件css-doodle

eb中使用一些图案做为背景图案是一种时常可见的,早期一般都是通过图片来完成。直至CSS一些新特性更趋成熟和稳定的时候,会通过CSS的相关技术,比如CSS的渐变属性配合background-size之类的来做一些复杂而又美观的Web图案,运用于background-image之中。

而其中最为出名的是@Lea写的CSS3 Patterns,并且@Lea在其《CSS Secrets》一书中特别介绍了CSS如何实现复杂背景图案。虽然CSS Patterns实现的图案是令人感到惊艳与好奇,但其扩展性以及适配性还是有一定的限制。因此有同学将CSS Patterns换成了SVG Patterns(也就是使用SVG相关的特性实现了CSS Patterns相同的效果)。当然,除此之外,还有很多工具能帮助我们来实现CSS图案的效果,其中有的工具可以生成代码,而有的工具会生成图片。

随着前端技术不断的革新,不久前看到一个生成Web图片的组件:<css-doodle /> —— 使用CSS绘制图案的Web组件!

这是一个非常强大的Web组件,初次看到,你会觉得她非常的神奇和强大。至于为什么?你要是花日间阅读完后面的内容,你就知道其中的原委了。为了让大家对其有初次的感觉,先上一个使用<css-doodle />组件创作的图案效果,如下:

是不是有点蠢蠢欲动的感觉。如果是的话,跟着下面的节奏继续往下阅读。

什么是<css-doodle />

<css-doodle />是一个Web组件。其基于Shadow DOM V1Custom Elements V1来构建的。该组件可以帮助轻松的使用Custom Elements、Shadow DOM和CSS Grid创建任何你想要的图案(CSS 图案)。创建出来的图案你可以运用于Web页面中。

当你看到Custom Elements、Shadow DOM和CSS Grid的时候,你一定会心却,这些东西浏览器能支持。事实上你的担忧是正常的,因为该组件到目前为止只在最新的Chrome和Safari浏览器上可以正常的运行。如果你想运用于其他的浏览器上,你需要相关的Polyfilling。

简单点说:

该组件通过其内部的规则(纯CSS)会生成一系列的div构建的CSS Grid。你可以使用CSS轻松地操作这些div(单元格,每个div就是一个单元格)来生成图案。生成的图案既可以是静态的,也可以是动态的。而其限制仅限于CSS本身的限制。

开始使用<css-doodle />

使用<css-doodle />组件创建图案很简单,当然有一个前提是你对其相关的API和使用方法有所了解。这里先来看怎么在你的项目中使用该组件。

使用<css-doodle />组件有两种方法,第一种是比较原始的方法,就是在你的HTML文件中引入该组件所需要的JS和CSS文件。最简单的方法就是直接引用cdnjs:

[xml] view plain copy

<script src="https://cdnjs.cloudflare.com/ajax/libs/css-doodle/0.3.0/css-doodle.min.js"></script>

这个script你可以在</head>或</body>结束标签前调用。然后在任何你想要的地方调用:

[xml] view plain copy

<css-doodle> /* 绘制图案的代码放在这里 */

</css-doodle>

如果你不想使用cdnjs提供的在线资源,你也可以将css-doodle-0.3.0.min.js文件下载到你本地的项目中,通过相对路径来引用下载的文件。

除此之外,也可以通过npm的方式将<css-doodle />安装到你的项目中,然后通过import的方式将其引入到你的项目中。比如说在Vue项目中,你可以先执行:

npm install css-doodle

或者使用yarn来安装:

yarn add css-doodle

然后在你想要使用<css-doodle />的地方先import,比如在App.vue文件中:

[python] view plain copy

import CSSDoodle from 'css-doodle'

然后你就可以在<template>中引用,比如:

这时在你的页面中看到的效果如下:

这个时候,你和我可以一样,对<css-doodle></css-doodle>中代码一无所知,但正是这里面的一些代码生成了上图这样的效果。这个时候你通过浏览器开发者工具查看代码的时候,你会看到生成的代码如下图所示:

基本语法

<css-doodle />的语法是基于CSS的,这一点需要特别记住 —— 一切能用于Web的CSS,都可以用于此处!。除此之外,他还提供了一些额外的实用函数和简写的属性。这些函数和属性可以在其官网中查阅。

有关于<css-doodle />提供的函数和属性,在本文章中不做一一介绍,如果你想使用该组件来创作一些有意思的Web图案,那非常有必要花一定的时间去阅读官方文档。并尝试自己写写Demo。你会很快就能掌握这些规则和使用姿势!

先看一个简单示例

使用<css-doodle />其后台运行机制是使用CSS Grid布局创建一个网格系统。其实创建一个简单的网格是<css-doodle />最为简单的一个示例。比如说,我们创建一个5 x 8(五行八列)的网格,并且这个网格的width和其父容器的宽度相同(即100%),高度为浏览器屏幕高度的五分之一。那么我们就可以这样写代码:

你将看到的效果如下:

特别注意:如果你的浏览器看不到任何的效果,请确认你使用的是最新版本的Chrome或Safari浏览器!后续的示例不再做相关的提示!

为了帮助没时间阅读官方文档的同学能看懂上面的代码,这里简单的做一下说明:

  • :doodle:是一个特殊的选择器,其指向的是组件元素本身,即<css-doodle />。注意,其样式会被你的CSS样式覆盖
  • @grid:创建一个网格,其后面配置的参数说明你要创建的网格。比如上面的示例5x8 / 100% 100vh;。其中5 x 8表示的是创建一个五行八列的网格;100%表示网格的宽度(和其容器宽度相同);100vh表示网格的高度(浏览器屏幕的高度)
  • :after:每个单元格的伪元素,用于生成内容,比如你在效果中看到的数字
  • @index():是一个函数,返回当前单元格的索引号,注意其开始值是从1开始
  • @even:对应的偶数单元格,这里将偶数单元格的背景颜色设置为#f36
  • @odd:类似于@even,但对应的是奇数单元格

再来看一个复杂的示例

上面看到的效果是一个简单的示例效果,使用了一些最基本的样式规则写了一个五行八列的网格。其实我们还可以利用<css-doodle />提供的一些函数和一些其他的CSS样式规则,制作一些复杂的效果,而且还可以是带有动效的。比如下面这个示例:

对应的效果如下:

效果是不是很炫,很酷!

  • @place-cell:将单元格相对布局
  • @size:设置单元格的width和height
  • @rand:从数字的范围内返回一个随机值
  • @pick:给定的列表中随机选取一个值

正如你所见,在上面这个示例中,还使用了@keyframe来声明动画,并且还使用了CSS自定义属性。再次验证,只要是浏览器支持的CSS属性都可能用于<css-doodle />。

带有交互效果的案例

上面的示例,使用@keyframes可以做一个带有动画的效果。除此之外,还有更神奇的效果,那就是使用<css-doodle />的JavaScript API还可以实现现有交互效果的图案。比如下面这个示例:

当我们鼠标悬浮在上面的时,图标会旋转,这依旧采用的是@keyframes做的一个简单动画。除此之外,你点击屏幕时,整个图案会更新。

实现这样的效果很简单,就只是简单的加了下面这么几行JavaScript代码:

[php] view plain copy

const myDoodle=document.querySelector('.my-doodle'); myDoodle.addEventListener('click', ()=> { myDoodle.update(); });

使用了一个.update()函数,当你在屏幕单击时,整个组件会使用给定的样式重新刷新。

上面看到的是不同方式实现的一些图案效果。除些之外,你可以发动你的大脑和创意,制作一些其他更有意思的图案效果。如果你感兴趣的话,可以看看@yuanchuan在Codepen整理的有关于<css-doodle />组件制作的一些图案效果。

总结

这篇文章主要科普了一下<css-doodle />组件。简单的回顾一下,该组件是一个Web组件,主要是基于Shadow DOM V1Custom Elements V1 来构建的。而其背后运行的原理是使用CSS Grid和纯CSS规则制作的一些图案。除了CSS自带的规则之外,该组件还封装了一些函数和属性,能让你快速制作一些图案。另外还你还可以使用Unicode字符创建一些字符图案。

当你阅读到这里的时候,我想你对<css-doodle />组件有所了解,如果你动手了,或许你创作出一些与众不同的图案效果。希望你能在下面的评论中分享您的作品。如果你有其他的想法,也欢迎在下面的评论中分享。最后,该文章要是对您有所帮助的话,欢迎各位爷打个赏,鼓励我继续创作一些优质的教程。(^_^)

TML(网页)

Web领域的一些基本概念。

WEB

Web(World Wide Web)叫全球广域网,俗称万维网(www)。

W3C

W3C(World Wide Web Consortium)叫万维网联盟,是国际最著名的标准化组织,制定了web标准。

WEB标准

一个网页包含了html元素 Css JavaScript,Html元素决定了网页结构,Css进行了修饰美化,JavaScript控制了交互行为和动态效果。

web标准包含了下面三个方面:

  • 结构标准(HTML):用于对网页元素进行整理和分类。
  • 表现标准(CSS):用于设置网页元素的版式、颜色、大小等外观样式。
  • 行为标准(JavaScript):用于定义网页的交互和行为。

HTML定义

Html不是一种编程语言,而是描述性的标记语言,主要作用是定义内容的结构。

2014年10月万维网联盟(W3C)完成了HTML5标准制定,是目前最新的HTM版本。

HTML5的出世,标志着web进入一个富客户端(具有很强的交互性和体验的客户端程序)时代,像APP网页,小程序都是HTML5的应用场景。

Html5新特性:

  • 用于绘画的 canvas 元素。
  • 用于媒介回放的 video 和 audio 元素。
  • 对本地离线存储的更好的支持。
  • 新的特殊内容元素,比如 article、footer、header、nav、section。
  • 新的表单控件,比如 calendar、date、time、email、url、search。

页面基本结构

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"> <!--字符集-->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <meta name="Author" content="">
    <meta name="Keywords" content="关键词" />
    <meta name="Description" content="页面描述" />
    <title>页面标题</title>
</head>
<body>

</body>
</html>

关于viewport

viewport用户网页的可视区域,一个针对移动网页优化的页面 viewport meta 标签如下:

<meta name="viewport" content="width=device-width, initial-scale=1.0">
  • width:控制 viewport 的大小,可以指定的一个值,如 600,或者特殊的值,如 device-width 为设备的宽度(单位为缩放为 100% 时的 CSS 的像素)。
  • height:和 width 相对应,指定高度。
  • initial-scale:初始缩放比例,也即是当页面第一次 load 的时候缩放比例。
  • maximum-scale:允许用户缩放到的最大比例。
  • minimum-scale:允许用户缩放到的最小比例。
  • user-scalable:用户是否可以手动缩放。

常见元素

head区域元素:

meta title style link script base。

body区域元素:

  • div、section、article、aside、header、footer
  • p
  • span、em、strong
  • table、thead、tbody、tr、td
  • ul、ol、dl、dt、dd
  • a
  • form、input、select、textarea、button

元素分类

块级元素:每个元素都是独占一行

  • address – 地址
  • blockquote – 块引用
  • center – 举中对齐块
  • dir – 目录列表
  • div – 常用块级容易,也是css layout的主要标签
  • dl – 定义列表
  • fieldset – form控制组
  • form – 交互表单
  • h1-h6 – 标题
  • hr – 水平分隔线
  • isindex – input prompt
  • menu – 菜单列表
  • noframes – frames可选内容,(对于不支持frame的浏览器显示此区块内容)
  • noscript – )可选脚本内容(对于不支持script的浏览器显示此内容)
  • ol – 排序表单
  • p – 段落
  • pre – 格式化文本
  • table – 表格
  • ul – 非排序列表

行内元素:元素在同一行水平排列

  • a – 锚点
  • abbr – 缩写
  • acronym – 首字
  • b – 粗体
  • big – 大字体
  • br – 换行
  • em – 强调
  • font – 字体设定(不推荐)
  • i – 斜体
  • img – 图片
  • input – 输入框
  • label – 表格标签
  • s – 中划线(不推荐)
  • select – 项目选择
  • small – 小字体文本
  • span – 常用内联容器,定义文本内区块
  • strike – 中划线
  • strong – 粗体强调
  • sub – 下标
  • sup – 上标
  • textarea – 多行文本输入框
  • tt – 电传文本
  • u – 下划线
  • var – 定义变量

inline-block:元素可以排列在同一行显示,并且可以设置一些块元素属性

通过Css:display:inline-block 改变元素。

元素默认样式

很多元素都自带了默认样式,不同浏览器下默认样式表现不一致,为了统一或者满足一些需求我们需求将所有默认样式清空,这种处理方式又称为 Css Reset,比如:

*{
    margin: 0;
    padding: 0;
}

另外一种方案使用normalize.css,它将不同浏览器下的默认样式进行了统一,

https://github.com/necolas/normalize.css

CSS(层叠样式表)

Css的单位

html中的单位是像素px

绝对单位

  • in:英寸,1in=2.54cm=96px
  • pc:皮卡,1皮卡=1/16英寸
  • pt:点,1点=1/72英寸
  • px:像素,1点=1/96英寸

相对单位

  • em:font-size中相对于父元素的字体大小,在元素属性中使用是相对于自身字体大小
  • rem:根元素的字体大小,在元素属性中使用是相对于根元素字体大小
  • 1h:元素的line-height
  • vw:视窗宽度的1%
  • vh:视窗高度的1%
  • vmin:视窗较小尺寸的1%
  • vmax:视图大尺寸的1%

字体属性

属性:字体、行高、颜色、大小、背景、边框、滚动、换行、修饰属性(粗体、斜体、下划线)

p{
    font-size: 20px;        /*字体大小*/
    line-height: 30px;      /*行高*/
    font-family: PingFang SC;   /*字体类型:显示PingFang SC,没有就显示默认*/
    font-style: italic ;        /*italic表示斜体,normal表示不倾斜*/
    font-weight: bold;  /*粗体或写(400|500|600)*/
    font-variant: small-caps;  /*小写变大写*/
}

行高(line-height)

一般约定行高、字号都是偶数,这样保证它们的差一定偶数除2得到整数,如下图所示:

line-height

文本垂直居中

对于单行文本可以设置行高=盒子高度

对于多行元素的垂直对齐,我们可以使用vertical-align: middle属性,不过vertical-align 仅适用inline、inline-block 和 table-cell 元素。

vertical-align

vertical-align: baseline;
vertical-align: sub;
vertical-align: super;
vertical-align: text-top;
vertical-align: text-bottom;
vertical-align: middle;
vertical-align: top;
vertical-align: bottom;
/* 指定长度值 */
vertical-align: 10em;
vertical-align: 4px;
/* 使用百分比 */
vertical-align: 20%;
/* 全局值 */
vertical-align: inherit;
vertical-align: initial;
vertical-align: revert;
vertical-align: unset;

文本属性

  • letter-spacing: 0.5em ; 单个字母之间的间距。
  • word-spacing: 1em; 单词之间的间距。
  • text-decoration: none; none 去掉下划线、underline 下划线、line-through 中划线、overline 上划线。
  • color:red; 字体颜色。
  • text-align: center; 文字对齐方式,属性值可以是:left、right、center、justify。
  • text-transform: lowercase; uppercase(大写)、lowercase(小写)capitalize(首字母大写)。
  • text-indent:10px; 文本首行缩进。
  • text-shadow:2px 2px #ff0000; 文字阴影效果。
  • white-space: normal; 设置元素空白处理,normal,nowrap,break-spaces。

Overflow属性

内容溢出处理

  • visible:默认值,多余的内容会全部显示出来。
  • hidden:超过元素的内容隐藏。
  • auto:内容超出显示滚动条。
  • scroll:Windows总是显示滚动条。Mac和auto 属性相同。

滤镜

filter:gray()

背景属性

  • background-color:#fff; 设置背景颜色。
  • background-image:url(img.png); 设置图像为背景。
  • background-repeat: no-repeat; no-repeat不要平铺,repeat-x横向平铺;repeat-y纵向平铺。
  • background-position:center top; 设置背景图片在容器的位置,top,bottom,left,right,center。
  • background-attachment:scroll; 设置背景图片随滚动条移动,scroll(跟随滚动),fixed(固定)。
  • background-origin:border-box; css3,border-box(背景相对于边框框定位),padding-box(背景相对于填充框定位),content-box(背景相对于内容框定位)。
  • background-clip:border-box; css3,背景裁切。
  • background-size:cover; css3,调整尺寸,contain(在不裁剪或拉伸图像的情况下,在其容器内尽可能大地缩放图像),cover(尽可能大地缩放图像以填充容器,必要时拉伸图像。),auto(在相应的方向上缩放背景图像,以保持其固有比例。)。

优先级

理解优先级很重要,有助于我们排查一些问题。浏览器将优先级分为两部分:HTML的行内样式和选择器的样式。

行内样式

行内样式是直接作用在元素,它的优先级高于选择器样式,使用!important可以提高样式表的优先级。

<div style="font-size:16px">
</div>

选择器样式

<style type="text/css">
    p{
      font-size: 16px;
    }
</style>
<link rel="stylesheet" href="style/app.css">

优先级规则如下:

  • 如果选择器的ID数量最多的胜出。
  • 如果ID数量一致,那么拥有最多类的选择器胜出。
  • 如果以上两次比较都一致,那么拥有最多标签名的选择器胜出。

优先级

我们通过下图这种标记方式,就可以判断出选择器的优先级。

优先级

两条经验法则

  1. 尽量不要使用ID选择器,因为它会大幅提升优先级。当需要覆盖这个选择器时,通常找不到另一个有意义的ID,于是就需要复制原来的选择器加上另一个类来让它区别于想要覆盖的选择器。
  2. 不要使用!important。它比ID更难覆盖,一旦用了它,想要覆盖原先的声明,就需要再加上一个!important,而且依然要处理优先级的问题。

基础选择器

  • 类型或标签选择器,匹配目标元素的标签名,如 :p,input[type=text],优先级(0,0,1)。
  • 类选择器,匹配class属性中有指定类名的元素,如:.box,优先级(0,1,0)。
  • ID选择器,匹配拥有指定ID属性的元素,如:#id, 优先级(1,0,0)。
  • 通用选择器(*),匹配所有元素 ,优先级(0,0,0)。

组合选择器

由多个基础选择器组合成的复杂选择器。

  • 后代组合器(单个空格()表示),比如 .nav li,表示li是一个拥有nav类的元素的后代。
  • 子组合器(>),匹配的元素是直接后代,.parent > .child。
  • 相邻兄弟组合器(+),匹配的元素紧跟在后面其它元素后面,div + p。
  • 通用兄弟组合器(~),匹配所有跟随在指定元素之后的兄弟元素,它不会选中目标元素之前的兄弟元素,li.active ~ li。

复合选择器

多个基础选择器连起来(中间没有空格)组成一个复合选择器(如:ul.nav)。复合选择器选中的元素将匹配其全部基础选择器,.box.nav 可以选中 class="box nav" ,但是不能选中 class="box"。

伪类选择器

用于选中某种特定状态的元素,优先级(0,1,0)。

  • :first-child——匹配的元素是其父元素的第一个子元素。
  • :last-child——匹配的元素是其父元素的最后一个子元素。
  • :only-child——匹配的元素是其父元素的唯一一个子元素(没有兄弟元素)。
  • :nth-child(an+b)——匹配的元素在兄弟元素中间有特定的位置。公式an+b里面的a和b是整数,该公式指定要选中哪个元素。要了解一个公式的工作原理,请从0开始代入n的所有整数值。公式的计算结果指定了目标元素的位置。下表给出了一些例子。

:nth-child(an+b)

  • :nth-last-child(an+b)——类似于:nth-child(),但不是从第一个元素往后数,而是从最后一个元素往前数。括号内的公式与:nth-child()里的公式的规则相同。
  • :first-of-type——类似于:first-child,但不是根据在全部子元素中的位置查找元素,而是根据拥有相同标签名的子元素中的数字顺序查找第一个元素。
  • :last-of-type——匹配每种类型的最后一个子元素。
  • :only-of-type——该选择器匹配的元素是满足该类型的唯一一个子元素。
  • :nth-of-type(an+b)——根据目标元素在特定类型下的数字顺序以及特定公式选择元素,类似于:nth-child。
  • :nth-last-of-type(an+b)——根据元素类型以及特定公式选择元素,从其中最后一个元素往前算,类似于:nth-last-child。
  • :not(<selector>)——匹配的元素不匹配括号内的选择器。括号内的选择器必须是基础选择器,它只能指定元素本身,无法用于排除祖先元素,同时不允许包含另一个排除选择器。
  • :focus——匹配通过鼠标点击、触摸屏幕或者按Tab键导航而获得焦点的元素。
  • :hover——匹配鼠标指针正悬停在其上方的元素。
  • :root——匹配文档根元素。对HTML来说,这是html元素,但是CSS还可以应用到XML或者类似于XML的文档上,比如SVG。在这些情况下,该选择器的选择范围更广。还有一些表单域相关的伪类选择器。
  • :disabled——匹配已禁用的元素,包括input、select以及button元素。
  • :enabled——匹配已启用的元素,即那些能够被激活或者接受焦点的元素。
  • :checked——匹配已经针对选定的复选框、单选按钮或选择框选项。
  • :invalid——根据输入类型中的定义,匹配有非法输入值的元素。例如,当<inputtype="email">的值不是一个合法的邮箱地址时,该元素会被匹配。

更多参考:https://developer.mozilla.org/zh-CN/docs/Web/CSS

伪元素选择器

伪元素选择器可以向HTML标记中未定义的地方插入内容,优先级(0,0,1)。

  • ::before——创建一个伪元素,使其成为匹配元素的第一个子元素。该元素默认是行内元素,可用于插入文字、图片或其他形状。必须指定content属性才能让元素出现,如:.nav::before。
  • ::after——创建一个伪元素,使其成为匹配元素的最后一个子元素。该元素默认是行内元素,可用于插入文字、图片或其他形状。必须指定content属性才能让元素出现,如:.nav::after。
  • ::first-letter——用于指定匹配元素的第一个文本字符的样式,如:h1::first-letter。
  • ::first-line——用于指定匹配元素的第一行文本的样式。
  • ::selection——用于指定用户使用鼠标高亮选择的任意文本的样式。通常用于改变选中文本的background-color。只有少数属性可以使用,包括color、background-color、cursor、text-decoration。

属性选择器

属性选择器用于根据HTML属性进行匹配元素,优先级(0,1,0)。

  • [attr]——匹配的元素拥有指定属性attr,无论属性值是什么,如:input[disabled]。
  • [attr="value"]——匹配的元素拥有指定属性attr,且属性值等于指定的字符串值,如:input[type="radio"]。
  • [attr^="value"] ——“开头”属性选择器。该选择器匹配的元素拥有指定属性attr,且属性值的开头是指定的字符串值,例如:a[href^="https"]。
  • [attr*="value"]——“包含”属性选择器。该选择器匹配的元素拥有指定属性attr,且属性值包含指定的字符串值,如:[class*="sprite-"]。
  • [attr~="value"]——“空格分隔的列表”属性选择器。该选择器匹配的元素拥有指定属性attr,且属性值是一个空格分隔的值列表,列表中的某个值等于指定的字符串值,如:a[rel="author"]。
  • [attr|="value"]——匹配的元素拥有指定属性attr,且属性值要么等于指定的字符串值,要么以该字符串开头且紧跟着一个连字符(-)。

小结

本文要点回顾,欢迎留言交流。

  • Web中的一些基本概念介绍。
  • Html页面结构,元素分类。
  • Css优先级。
  • Css选择器,(基础选择器,组合选择器,复合选择器,伪类选择器,伪元素选择器,属性选择器)。

些一行代码大多数会是CSS规则中的一个声明。在某些情况下,选择器可能不只是一个简单的元素;在其他情况下,我会添加额外的声明作为建议以获得更好的体验,因此使它们不再严格意义上是一行代码——对于这些情况我提前道歉。

这些一行代码中的一些更多是个人选择,并不适用于所有网站(并非每个人都使用表格或表单)。我会简要描述每一个,它们的作用(附带示例图片),以及为什么我喜欢使用它们。请注意,示例图片可能会在前面例子的基础上进行构建。

以下是这些一行代码的作用概述:

  1. 限制视口内的内容宽度
  2. 增加正文文本大小
  3. 增加文本行之间的间距
  4. 限制图片宽度
  5. 限制内容中文本的宽度
  6. 以更平衡的方式包裹标题
  7. 表单控件颜色与页面样式匹配
  8. 易于跟随的表格行
  9. 表格单元格和标题的间距
  10. 减少动画和移动

限制视口内的内容宽度

body {
  max-width: clamp(320px, 90%, 1000px);
  /* 额外建议 */
  margin: auto;
}

添加这个一行代码将使内容大小占据视口的90%,将其宽度限制在320到1000像素之间(可以随意更新最小和最大值)。

这个改变将自动使您的内容看起来更好看。它将不再是一个庞大的文本块,而是看起来更有结构和组织。如果你还给body添加margin: auto;,内容将在页面上居中。两行代码让内容看起来好多了。

并排比较变化。左侧(之前):一大块文本。右侧(之后):两侧有内边距的文本。仍然很大但有更多空间。

对齐和包含的文本比一大堆文本看起来更好

增加文本大小

body {
  font-size: 1.25rem;
}

让我们面对现实:浏览器默认的16px字体大小是小的。虽然这可能是基于我变老的个人观点

一个快速的解决方案是增加body中的字体大小。由于级联和浏览器使用的em单位,网页上的所有文本将自动增大。

并排比较。左侧(之前):带有文本的列。右侧(之后):带有更大字体的文本列。

更大的文本大小使阅读更容易。

增加行间距

body {
  line-height: 1.5;
}

另一个提高可读性和打破可怕的文本墙的偏好是增加段落和内容中行与行之间的间距。我们可以轻松地用line-height属性做到这一点。

并排比较。左侧(之前):带有文本的列。右侧(之后):带有文本的列(间距更大)。

行间的空间打破了文本墙和白色的河流。

这个选择(与前两个一起)将显著增加我们页面的垂直大小,但我向你保证文本将更易读,对所有用户更友好。

限制图片大小

img {
  max-width: 100%;
}

图片的大小应该大致与它们将占据的空间相当,但有时我们会遇到真正长的图片,导致内容移位并创建水平滚动。

避免这种情况的一种方法是设置最大宽度为100%。虽然这不是一个万无一失的解决方案(边距和内边距可能影响宽度),但在大多数情况下它都能工作。

并排比较。左侧(之前):图片溢出内容大小导致出现滚动条。右侧(之后):图片调整到内容大小。

防止水平滚动并使图片与文本更好地流动

限制内容中文本的宽度

p {
  max-width: 65ch;
}

避免可怕的文本墙和空白河流的另一种策略是应用这种样式,即使与body中的最大宽度结合使用。这可能看起来不必要,有时甚至很奇怪,因为段落会比其他元素更窄。但我喜欢这种对比和较短的行。

60ch或65ch的值在过去对我很有效,但你可以使用不同的值并调整最大宽度以满足你的需求。在你的网页上玩耍和探索它的外观。

并排比较。左侧(之前):文本占据整个宽度。右侧(之后):文本占据大部分宽度。

将较大的文本块分成较小的块以提高可读性

以更平衡的方式包裹标题

h1, h2, h3, h4, h5, h6 {
  text-wrap: balance;
}

标题是网页结构的重要部分,但由于它们的大小较大和内容较短,可能看起来很奇怪。特别是当它们占据多于一行时。一个有帮助的解决方案是使用text-wrap来平衡标题。

虽然balance似乎是text-wrap最流行的值,但它不是唯一的。我们也可以使用pretty,如果需要的话,它会将额外的一个词移到最后一行,而不是平衡所有内容。不幸的是,pretty目前还没有广泛的支持。

并排比较。左侧(之前):一个标题占据两行,第二行只有1个词。右侧(之后):标题占据宽度相似的两行。

平衡的换行可以改善可见性和可读性

表单控件颜色与页面样式匹配

body {
  accent-color: #080; /* 使用你喜欢的颜色 */
}

另一个小变化,虽然没有显著影响,但能让东西看起来更好。直到最近,我们还不能用CSS样式化原生表单控件,只能使用浏览器显示。但情况已经改变。

开发一个完整的组件可能很麻烦,但使用这个一行代码可以设置一个更接近网站其他部分和设计系统的颜色,这是可能的,而且很简单。

并排比较。左侧(之前):表单控件是默认的蓝色。右侧(之后):表单控件颜色与标题和链接颜色匹配(绿色)。

正是这些小细节(和颜色)让页面融为一体

易于跟随的表格行

:is(tbody, table) > tr:nth-child(odd) {
  background: #0001; /* 或者对于深色主题使用 #fff1 */
}

我们必须使用表格来显示数据,而不是用于布局。但默认情况下表格很丑,我们不希望数据看起来很丑。特别是,有一件事有助于组织数据并使其更易读,那就是有一个带有交替深浅行的斑马表格。

上面显示的一行代码使得实现这种样式变得容易。它可以简化为只有tr而不考虑tbody或table父元素,但这也会应用到表格头部,这可能不是我们想要的。这是一个品味问题。

并排比较。左侧(之前):所有表格行都是白色的。右侧(之后):偶数表格行略微深色。

更容易水平跟随数据(按行)

表格单元格和标题的间距

td, th {
  padding: 0.5em; /* 或 0.5em 1em... 或任何不为0的值 */
}

让表格更易访问和更易读的最后一个变化是通过给表格单元格和标题添加内边距来稍微间隔内容。默认情况下,大多数浏览器没有任何内边距,不同单元格的文本相互接触,使得区分一个单元格开始和另一个结束变得混乱。

我们可以更改内边距值以调整到我们喜欢的大小。然而,避免过度以防止不必要的滚动或太多空白空间。

并排比较。左侧(之前):表格单元格文本内容完全在一起。右侧(之后):表格单元格内容明显与其他表格单元格分开。

更容易水平和垂直跟踪数据

减少动画和移动

@media (prefers-reduced-motion) {
  *, *::before, *::after {
    animation-duration: 0s !important;
    /* 额外建议 */
    transition: none !important;
    scroll-behavior: auto !important;
  }
}

好吧,好吧。这段代码远不止一行。它有一个一行版本(通过将动画持续时间设置为零秒来移除动画),但网页上还有其他使元素移动的东西。

通过在prefers-reduced-motion媒体查询中设置这些声明,我们将尊重用户选择减少移动的意愿。这种方法有些激进,因为它移除了所有移动,这可能不一定是用户的意图 - 它是"减少移动"而不是"无移动"。如果适当的话,我们仍然可以根据具体情况保留移动。

并排比较。左侧(之前):一个图像在网页上移动。右侧(之后):图像是静态的。

没有动画?没问题!