用 radial-gradient 制作点状背景需手动固定圆心、硬切色标(如 transparent 0%, #000 0%, #000 2px, transparent 2px)、设固定像素 background-size(如 20px),并注意 retina 屏用偶数尺寸、伪元素隔离布局干扰及 css 变量解耦样式。

直接用 radial-gradient 叠加就能做出清晰、可控的点状背景,不需要图片、SVG 或 JS;但写错色标位置或尺寸单位,点会糊、发虚、错格,尤其在 Retina 屏上几乎看不见。
为什么单层 radial-gradient 做不出整齐点阵
很多人试过 radial-gradient(circle, #000 1px, transparent 2px) 配 background-size: 10px 10px,结果点边缘毛、间距不均、缩放后错位。根本原因是:浏览器对渐变默认做插值过渡,1px → 2px 这段不是硬切,而是渐变淡出,导致“点”变成灰晕;同时 repeating-radial-gradient 的圆心默认锚在左上角,且尺寸按容器边界自动计算,无法稳定复现等距单元。
正确做法是手动固定圆心 + 强制硬切色标:
-
radial-gradient(circle at 50% 50%, transparent 0%, #000 0%, #000 2px, transparent 2px):两个0%和两个2px实现瞬切,杜绝插值模糊 -
background-size: 20px 20px:必须是固定像素(不能是1em或5%),否则响应式缩放时点被拉伸 - 显式写
background-repeat: repeat,避免某些旧浏览器 fallback 行为不一致
如何叠加两层实现波点错位效果
要模拟经典波点裙那种交错感,不是靠 transform 旋转,而是用两层完全相同的点阵,仅偏移半个周期。关键在于两层参数必须严格一致,否则错位后出现空洞或重影。
示例写法:
background-image: radial-gradient(circle at 50% 50%, transparent 0%, #000 0%, #000 2px, transparent 2px), radial-gradient(circle at 50% 50%, transparent 0%, #000 0%, #000 2px, transparent 2px); background-size: 30px 30px; background-position: 0 0, 15px 15px;
注意:
- 第二层
background-position必须是background-size的一半(如30px → 15px),否则错位失效 - 若底层是深色背景,建议把点颜色设为
rgba(0,0,0,0.15),避免压住文字内容 - 不要给其中一层加
opacity,它会影响整层透明度,破坏叠加逻辑;应改用rgba()控制单个点的透光率
Retina 屏点发虚?检查这三点
dpr > 1 的设备上,1px 点常因亚像素渲染而消失或发虚——这不是代码错了,是浏览器渲染机制问题。解决方式很具体:
- 点直径和间距都用偶数像素:比如
#000 2px, transparent 2px配background-size: 20px 20px,避开 0.5px 对齐陷阱 - 强制起点对齐:加
background-origin: border-box和background-clip: border-box,防止 padding 或 content-box 导致偏移 - 调试时临时加
background-color: rgba(255,0,0,0.05),看底色是否被完全覆盖——有漏色说明点阵没填满,大概率是色标没硬切或background-size不匹配
在 Vue/Vuetify 组件里点被裁切或偏移
Vuetify 的 v-card、v-img 等组件自带 padding/margin,还可能启用 object-fit,直接把点背景写在图片元素上,极易被裁掉或错位。
稳妥做法是套一层伪元素:
.dot-bg::before {
content: "";
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background-image: radial-gradient(...);
background-size: 20px 20px;
z-index: -1;
}
这样点背景脱离内容流,不受 object-fit 或内边距干扰。如果容器本身有圆角,记得给伪元素也加 border-radius: inherit,否则点阵会溢出。
最易被忽略的是:点阵密度和主题色必须解耦——用 CSS 变量控制 --dot-size、--dot-color、--dot-spacing,否则换肤或适配暗色模式时得全局搜替换。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











