CSS 轮廓(Outline)是一个经常被忽视但非常有用的属性。轮廓看起来像边框,但在行为和用途上有重要区别。
outline 是绘制在元素外侧的一条线,不占空间。
使用场景:输入框聚焦、按钮聚焦、调试元素边界。
| 属性 | 是否占空间 | 位置 | 是否影响布局 |
|---|---|---|---|
| border | ✔ 占空间 | 在 padding 外、margin 内 | ✔ 影响布局 |
| outline | ✖ 不占空间 | 在 border 外(不挤占布局) | ✖ 不影响布局 |
outline-width - 轮廓宽度设置轮廓线的粗细。
button {
outline-width: 2px; /* 固定值 */
outline-width: thin; /* 细线 */
outline-width: medium; /* 中等(默认)*/
outline-width: thick; /* 粗线 */
}
outline-style - 轮廓样式设置轮廓线的样式。
input {
outline-style: solid; /* 实线 */
outline-style: dashed; /* 虚线 */
outline-style: dotted; /* 点线 */
outline-style: double; /* 双实线 */
outline-style: groove; /* 3D凹槽 */
outline-style: none; /* 无轮廓(谨慎使用!)*/
}
outline-color - 轮廓颜色设置轮廓线的颜色。
a {
outline-color: red;
outline-color: #ff0000;
outline-color: invert; /* 颜色反转(确保对比度)*/
}
outline-offset - 轮廓偏移设置轮廓与元素边框之间的间距
button {
border: 2px solid #333;
outline: 2px solid #3498db;
outline-offset: 4px; /* 轮廓向外偏移4px */
}
img:focus {
outline: 3px dotted #e74c3c;
outline-offset: -6px; /* 轮廓向内偏移6px */
}
只在键盘焦点时显示轮廓,鼠标点击时不显示。
/* 现代方法:只在键盘导航时显示轮廓 */
button:focus-visible {
outline: 3px solid #3498db;
outline-offset: 2px;
}
/* 鼠标点击时不显示轮廓 */
button:focus:not(:focus-visible) {
outline: none;
}
element {
outline: 2px solid red; /* 宽度 样式 颜色 */
outline: thick dashed #3498db; /* 任意顺序 */
outline: none; /* 无轮廓 */
}
为键盘导航用户提供视觉反馈。
/* 良好的焦点样式 */
button:focus,
input:focus,
a:focus {
outline: 2px solid #3498db;
outline-offset: 2px; /* 增加轮廓与元素的间距 */
}
/* 更精美的焦点样式 */
.custom-focus:focus {
outline: 3px dashed #e74c3c;
outline-offset: 4px;
background-color: #fffacd; /* 同时改变背景色 */
}
临时添加轮廓来查看元素边界。
/* 调试所有元素 */
* {
outline: 1px solid red;
}
/* 调试特定元素 */
.debug * {
outline: 1px dashed blue;
}
.form-input {
width: 100%;
padding: 12px;
border: 2px solid #bdc3c7;
border-radius: 6px;
font-size: 16px;
transition: all 0.3s ease;
}
.form-input:focus {
border-color: #3498db;
outline: none; /* 移除默认轮廓 */
box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.2); /* 用阴影代替轮廓 */
}
/* 错误状态的焦点 */
.form-input.error:focus {
border-color: #e74c3c;
box-shadow: 0 0 0 3px rgba(231, 76, 60, 0.2);
}
.nav-link {
display: block;
padding: 10px 15px;
color: #333;
text-decoration: none;
border-radius: 4px;
}
.nav-link:focus {
outline: 2px dashed #3498db;
outline-offset: -2px; /* 向内偏移 */
background-color: #ecf0f1;
}
.nav-link:hover {
background-color: #f8f9fa;
}
.custom-checkbox {
width: 20px;
height: 20px;
border: 2px solid #bdc3c7;
border-radius: 3px;
display: inline-block;
position: relative;
}
.custom-checkbox:focus {
outline: 2px solid #3498db;
outline-offset: 2px;
}
input[type="checkbox"]:checked + .custom-checkbox {
background-color: #3498db;
border-color: #3498db;
}
.thumbnail {
border: 3px solid transparent;
border-radius: 8px;
transition: all 0.3s ease;
}
.thumbnail:focus {
outline: none; /* 移除默认轮廓 */
border-color: #3498db;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
/* 为键盘用户提供备用轮廓 */
.thumbnail:focus-visible {
outline: 3px dotted #3498db;
outline-offset: 4px;
}
/* ❌ 危险的写法 - 破坏可访问性 */
button:focus {
outline: none;
}
/* ✅ 安全的写法 - 提供替代焦点指示 */
button:focus {
outline: none;
background-color: #ffff99;
border-color: #333;
}
/* ✅ 更好的写法 - 保留轮廓但美化它 */
button:focus {
outline: 2px solid #3498db;
outline-offset: 2px;
}
/* 使用 :focus-visible 提供智能焦点 */
button {
/* 基础样式 */
}
button:focus-visible {
outline: 3px solid #3498db;
outline-offset: 2px;
}
/* 回退方案,支持旧浏览器 */
@supports not selector(:focus-visible) {
button:focus {
outline: 3px solid #3498db;
outline-offset: 2px;
}
}