CSS 用户界面
Optional Advanced 刚给一张照片加了镂空模板。本课是另一套工具:用户界面。你改的是指针、插入光标和原生控件外观。这里不给海报打洞,也不把文章拆成报纸栏。
直接回答
CSS 用户界面属性提示如何交互。cursor 选择鼠标形状(pointer、wait、help、not-allowed…)。resize 让角可拖——多半用在 textarea。outline 配 outline-offset 画出不占布局空间的焦点环(盒模型课已讲过 outline;这里强调键盘习惯)。user-select 可减少误选。caret-color 给闪烁插入条上色。appearance(以及 -webkit-appearance)可剥掉原生皮肤以便重做样式。焦点要看得见。别把整页变成无法选中的海报。
为什么不是遮罩也不是分栏
遮罩决定一个盒子的哪些像素还看得见。多列切开一条文本流。界面属性两样都不做。宽高通常不变,除非用了 resize。滤镜和 mask-image 仍属于画面。这里问的是:「看起来能点吗?能打字吗?能把盒子拉大吗?键盘用户看得到自己在哪吗?」
cursor —— 说真话
cursor 是承诺。pointer 表示「可以点」。用在真正的按钮和链接。不要给什么也不做的标题加小手。
a.nav-link,
button.save {
cursor: pointer;
}
button[disabled] {
cursor: not-allowed;
}
.help-hint {
cursor: help;
}
.busy-panel {
cursor: wait;
}
default 是箭头。text 是可选文字上的 I 形光标。grab / grabbing 适合拖动手柄。自定义 url(...) 光标要小,并始终写回退关键字。骗人的光标比没有更糟:人去点口号,什么也不发生。
resize —— 拉大盒子,不是整页布局
resize 作用在能溢出的盒子上。日常用法是备注框:
textarea.notes {
min-height: 6rem;
min-width: 16rem;
max-width: 100%;
resize: vertical;
overflow: auto;
}
取值:none、both、horizontal、vertical。搭配非 visible 的 overflow,否则手柄可能不出现。别给每张卡片洒 resize: both。min-height / max-width 防止字段塌掉或撑爆。
作为焦点环的 outline
盒模型课里 outline 画在边框外侧且不占空间。在界面工具箱里,你为键盘焦点保留这圈——常用 :focus-visible,避免鼠标每次点击都套框:
button.save:focus-visible {
outline: 3px solid #2563eb;
outline-offset: 3px;
}
button.save:focus:not(:focus-visible) {
outline: none;
}
不要全局 *:focus { outline: none; },除非每个控件都有同样清楚的替代。outline-offset 把环推离边缘,邻居不跟着变大。这不是 border(会改尺寸),也不是给按钮标签做遮罩渐隐。
user-select —— 少误选
选择是功能。只在双击不该刷蓝的地方关掉——工具条标签、拖拽碎片——不是整篇文章。
.toolbar-label {
user-select: none;
}
article.body {
user-select: text;
}
none 禁止高亮。text 是可读默认。all 一点就选中整个元素。旧 WebKit 仍可能要 -webkit-user-select。法律文字、价格、必须复制的报错不要禁选。
caret-color —— 给插入条上色
插入条是输入框里闪烁的竖线。跟品牌对齐,不要藏起来:
input.email,
textarea.notes {
caret-color: #0f766e;
color: #0f172a;
}
caret-color: auto 跟随文字颜色。用 caret-color: transparent「图干净」是陷阱。这不是整页 color,也不是给字形套 mask-image。
appearance —— 重做原生控件外观
浏览器给复选框、搜索框画原生皮肤。appearance: none(需要时加 -webkit-appearance: none)剥掉它:
input.search {
appearance: none;
-webkit-appearance: none;
border: 1px solid #94a3b8;
border-radius: 0.5rem;
padding: 0.5rem 0.75rem;
}
input[type="checkbox"].tick {
appearance: none;
-webkit-appearance: none;
width: 1.15rem;
height: 1.15rem;
border: 2px solid #334155;
border-radius: 0.25rem;
}
写了 none 之后,你得补边框、选中态和焦点环。看不见的复选框不是自定义控件。支持因控件类型而异;测真实控件。appearance 修不好遮罩,也替不了多列。
界面对照遮罩、分栏与盒模型 outline
📊 UI vs mask vs columns vs outline
| Tool | Job | Poor fit |
|---|---|---|
cursor / resize / caret-color / appearance |
Interaction chrome on controls | Stenciling a photo; newspaper columns |
user-select |
Limit highlight on chrome, not articles | Hiding copy people must paste |
outline + :focus-visible |
Keyboard focus ring (no layout space) | Replacing border math; fading labels with a mask |
mask-image |
Soft holes on one element’s pixels | Pointer shape; growing a textarea |
Multi-column (column-*) |
Fragment flowing text | Cursors, carets, native widget skin |
Optional Advanced 用分栏处理正文、用遮罩处理图片。用户界面是控件层。设置表单上的 column-count、提交按钮上的 mask-image,并不会让表单「更像界面」。
不要抹掉什么
别拆光所有原生提示。滚动条、插入条、焦点环都有用。控件禁用时,cursor: not-allowed 加上真正的 disabled 属性,比用遮罩藏掉标签更稳。
.ok-ui {
cursor: pointer;
outline-offset: 2px;
}
.not-a-stencil {
/* don't: mask-image on the submit label to “soften” the click */
}
.not-a-newspaper {
/* don't: column-count on a login form to look advanced */
}
问题是照片边缘,回到遮罩。问题是长文,回到分栏或普通块流。感觉「不像能点」,从 cursor 和真正控件开始,不要靠装饰滤镜。
自己试试
- 真正的
<button>用cursor: pointer,[disabled]用not-allowed。 - 给
textarea:resize: vertical、min-height、overflow: auto。 - 加上
:focus-visible的 outline 和outline-offset——用 Tab 走过去。 - 只在工具条碎片上
user-select: none;正文仍可选。 - 给输入框改
caret-color。不要给字段做遮罩,也不要column-count。
常见错误
- 在既非链接也非按钮的文字上用
cursor: pointer - 给布局卡片和导航栏
resize: both - 全局
outline: none却没有:focus-visible替代 - 整页、价格或报错用
user-select: none - 为了「干净」用
caret-color: transparent appearance: none后没有边框、选中态、焦点环- 把遮罩或多列当成界面抛光
小结
- 用户界面 CSS 提示交互:指针、resize、插入条、原生皮肤
cursor必须说真话;resize属于字段,不属于整页外壳- 保留可见的焦点环;
user-select和caret-color轻量使用 - 只有彻底重做控件时才用
appearance: none - 既不是遮罩镂空,也不是报纸栏
- Optional Advanced 下一课是 3D 变换(
transforms-3d)
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部