11表单与列表样式
表单和列表是网页的两大「重样式」容器:一个负责收集用户输入(注册、搜索、下单), 一个负责展示结构化信息(菜单、目录、表格)。浏览器给它们默认模样,CSS 给它们专业属性—— 这一节把表单控件的四件套(input / select / button / 列表与表格)一次收齐。
一、input 全家样式控制
所有输入控件 —— input[type=text]、type=email、type=password、textarea、type=search——
都能共用同一套样式:padding、font、border、color、background。
它们共享浏览器给「替换元素」备下的同一套外观,需要的时候再单独挑出来。
焦点时的轮廓线,先回顾一下第 08 课《继承与层叠》的关键词 :focus 触发的轮廓:
这是无障碍设计的键盘生命线,别随手写 outline: none 又不给替代。
占位符 ::placeholder 单独走一个伪元素选择器,和 a 链接第 10 课的「重置态」是一致的思路。
| 属性 / 伪元素 | 值示例 | 作用 |
|---|---|---|
| padding | 10px 14px | 撑大点击区,让输入不顶到边框 |
| font / font-size | 14px / inherit | 继承页面字号,避免输入框字体突然变小 |
| border | 1px solid #C9B995 | 边框;厚薄、实虚线随意 |
| background | #FDF9F4 | 输入区背景;可填图、可纯色 |
| color | #4E4A40 | 输入文字色(占位符单独配色) |
| :focus + outline | 2px solid #B8552F | 焦点环:键盘用户的「我现在在哪」 |
| ::placeholder | color: #B8552F; opacity: .6; | 占位符单独上色,比改整个 input 背景更准 |
| ::file-selector-button | background: #96652C; color: #fff; | 文件上传按钮「浏览…」单独染色 |
| appearance | none | 抹掉浏览器默认控件外观(按钮、下拉) |
.reg 的 focus 那块改成 outline: none、且不写替代样式 —— 键盘用户将彻底找不到光标在哪font: inherit(或 font-size 单独再写一遍)——
浏览器给 input 的默认 font-family 不是继承自 body,会让中文输入突然变难看。
还有,font 这条简写在大多数网页里也都写顺手了一遍。二、checkbox / radio 自定义样式
浏览器给单复选框画了「勾选框 + 圈」一套,各家画风不统一。 三大流派按「改动幅度」从小到大:
- accent-color 一行染色 —— 最简单,保留原生控件,只换主题色(呼应第 05 课颜色与单位)
- 隐藏 input,用 label 包裹 —— 最稳定,借助 label 触发勾选,自定义 label 样式
- appearance: none + ::before 画 SVG/字符 —— 最灵活,能画任何形状,但 CSS 代码最多
:root 的 accent-color 改成 #4E7A52,只有第一行变色——其他两行是定制标签,不吃 accent-colordisplay: none——
那会让键盘 Tab 键彻底跳过这个控件,视障用户根本无法勾选。
用 opacity: 0 或 position: absolute; clip: rect(0 0 0 0) 保留可聚焦性。三、select 改箭头 / datalist 改建议样式
<select> 默认的向下箭头在 Windows / macOS / Linux 三家浏览器画得五花八门,
「换皮统一」的标准写法:先 appearance: none 抹掉默认外观,
再用 background-image 内联一张 SVG 箭头(用 data URI 嵌进 CSS,零外部资源)。
内边距右半边要预留出箭头的位置,否则文字会被压到箭头下面。
<datalist> 的 <option> 弹出建议框样式 —— 各浏览器支持很有限(Firefox 基本不让你动),
真要强定制建议换成熟的 combobox 组件库,本节只演示 appearance: none 这一条通用路径。
background-image 那行整段删掉 —— 右侧立刻回到浏览器原生气死人的小箭头%23B8552F)就行,
想换深一点改成 %238F3A26 —— 不用每张图都出一份。
注意 # 在 URL 里要写成 %23。四、button 三态与禁用样式
按钮有三态:默认(normal)、悬停(hover)、按下(active), 加上「被禁用」还有 :disabled。第四态是「聚焦」:focus,给键盘用户;第五态是「正在加载」,常配合 JS 切换 class。
关键的 可访问性细节::disabled 状态除了改色,别忘了同时加
cursor: not-allowed 和 pointer-events: none(或 opacity)——
鼠标变成「禁止」图标 + 不响应点击,视觉、行为、辅助技术三层都到位。
disabled 属性去掉 —— 颜色瞬间恢复、cursor 也变回手型.btn-loading 类,
加上「正在加载…」文字与 cursor: progress;,
再加 animation: spin 1s linear infinite; 配 @keyframes spin 旋转一圈,
体验「按钮变忙」的视觉反馈。五、list-style 三件套
列表(<ul>、<ol>)的项目符号由三个属性控制,
全部能合写到 list-style 一行里:
list-style-type—— 符号形状:disc(实心圆)、circle(空心圆)、square(方块)、decimal(阿拉伯数字)、lower-roman(小写罗马数字)、upper-alpha(大写字母)、none(无)list-style-position—— 符号在文本外(outside,默认)还是内(inside,缩进对齐)list-style-image—— 自定义图片当符号:url(arrow.png)
| 属性 | 常用值 | 作用 |
|---|---|---|
| list-style-type | disc / circle / square / none / decimal / lower-roman / upper-alpha | 符号形状/编号体系 |
| list-style-position | outside(默认)/ inside | 符号挂在文字外/挤进文字里 |
| list-style-image | url(arrow.svg) | 用图代替符号 |
| list-style(合写) | decimal inside | 顺序:type → position → image |
| list-style: none | — | 彻底去掉符号(自定义菜单/导航标配) |
.ls-c 的 decimal 改成 lower-roman,数字立刻变 i / ii / iii- 实心圆 disc
- 默认形态
- 空心圆 circle
- 淡化节奏
- 数字 decimal
- 带步骤的列表
- 方块 square
- 严肃文档
list-style: none; padding-left: 0; 两条加在一起,
列表才会乖乖变成「横排无符号」的样子。光去符号还不行,浏览器默认会给 <ul> 留一段左侧缩进。六、计数器 counter / counters
不写 list-style-type,你也能自己手动编出章节号——CSS 提供了「自增计数器」三件套:
counter-reset: 章节 0;—— 在某个祖先元素上「新建一个叫『章节』的计数器,初始为 0」counter-increment: 章节;—— 在子元素上「每碰到一次,章节 + 1」counter(章节);—— 在::beforecontent 里「显示当前章节号」
多级编号(1.1、1.1.1、1.2.1)则用 counters(),它会从下往上把父级所有同名计数器拼成一段「父子编号」。
| 名称 | 语法 | 作用 |
|---|---|---|
| counter-reset | counter-reset: 章 0; | 新建 / 重置一个计数器,通常写在祖先元素 |
| counter-increment | counter-increment: 章; | 碰一次自增 1,写在要编号的子元素 |
| counter() | counter(章) | 单级取号,display 在 ::before 的 content 里 |
| counters() | counters(章, ".") | 多级嵌套编号,分隔符第二个参数指定 |
counter-reset 那行的 3 改成 5,最外层编号立刻跨过 1~4 直接从 5 开始《CSS 基础》目录(自动编号)
- CSS 是什么
- CSS 的历史
- CSS 的工作流
- 选择器与盒模型
- 选择器进阶
- 盒模型
- 显示与尺寸
- display 详解
- width / height
- 表单与列表
counter-reset 可以是任意值,不只 0:
写 counter-reset: 章 3; 就从 4 开始编号 —— 用来给目录续章节、从中间续编都方便。七、table 表格样式
表格默认双线(每个单元格各画一条边)丑得很。CSS 提供了整套表格属性, 加上「斑马纹」「标题位置」「空单元格显隐」这些贴心开关:
| 属性 | 常用值 | 效果 |
|---|---|---|
| border-collapse | collapse / separate | 合并边框(现代标配)/ 各自独立(默认) |
| border-spacing | 0 / 4px 8px | separate 下两个方向间距;塌缩到 0 写法只对 collapse 有效 |
| caption-side | top / bottom | 表格标题(上/下)位置 |
| empty-cells | show / hide | 空白单元格是否显示边框 |
| nth-child(odd/even) | tr:nth-child(odd) | 斑马纹:奇偶行底色 |
| text-align | left / center / right | 列对齐:常用 th { text-align: left } |
.t1 的 border-collapse 改回 separate,又变回双线丑样| 姓名 | 城市 | 职业 |
|---|---|---|
| 小满 | 杭州 | 前端开发 |
| 栗子 | 北京 | UI 设计师 |
| 阿白 | 成都 | |
| 抹茶 | 广州 | 产品经理 |
border-collapse: collapse 下不能再写 border-spacing,
它俩互斥;border: 0 不要写在 td 上来「去掉表格线」——
那只会让空单元格的边框消失,单元格里看不见,但你设置的其他边框属性也跟着乱了。
想要无线条就直接 border: 0 在 table 上。八、本章小结
- 输入控件通用样式:padding / font / border / background / color 五件套;
:focus焦点环不能用outline: none抹了就走;::placeholder单独配色。 - checkbox / radio 三流派:accent-color(一行染色) / 隐藏 input 包 label(稳定) / appearance: none + checked(最灵活)。
select自定义箭头:appearance: none+background-image: url("data:image/svg+xml;…")内联 SVG,右侧 padding 留出箭头位。- button 三态:默认 /
:hover/:active;禁用:disabled必须加cursor: not-allowed+ 视觉降级。 list-style三件套:type / position / image,合写list-style: decimal inside;;导航菜单list-style: none; padding-left: 0;双清才彻底。- 计数器:counter-reset → counter-increment → counter() / counters();
counters()用"."拼多级。 - 表格:
border-collapse: collapse合线;caption-side控制标题;tbody tr:nth-child(odd)斑马纹。
- 用
list-style装饰一篇笔记的项目符号(自定义图或 emoji 风格)。 - 用
counter()给自己的笔记目录做自动编号(至少两层)。 - 用
table样式美化一张数据表(合并线、斑马纹、标题样式配齐)。 - 用
appearance: none+ 自定义箭头改<select>样式,让 select 和其他输入控件视觉统一。