前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS 渐变色标同位置 硬边效果原理
CSS动画与视觉

linear-gradient 里两个色标写在同一位置,为什么会出现硬边?

浏览器在相邻色标之间做线性插值来生成渐变。如果两个色标的位置写成同一个值,插值区间长度为零,颜色之间没有过渡空间,就会直接跳变,形成一条清晰的硬边。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#动画与视觉#动画
先看核心答案读代码示例
理解线索

渐变插值的三个要素

  1. 色标位置每个色标在渐变轴上的百分比或长度,决定颜色出现的位置
  2. 插值区间两个相邻色标之间的距离,浏览器在这段距离里线性混合颜色
  3. 零距离跳变两个色标位置相同,插值区间为零,颜色瞬间切换形成硬边

如果后一个色标的位置比前一个小,比如先写 60% 再写 40%,浏览器会把后一个修正成 60%,效果等同于两个色标在同一位置。

核心回答

先记住这个答案

linear-gradient 在相邻两个色标之间做线性插值,从一种颜色平滑过渡到另一种。当两个色标写在同一个位置,比如 red 50%, blue 50%,插值区间的长度变成零,浏览器无法在零距离里做过渡,所以颜色直接从红跳到蓝,形成一条锐利的硬边。这不是 bug,而是插值算法的自然结果。

  • 渐变本质是相邻色标之间的线性插值
  • 色标位置相同时插值距离为零,颜色跳变
  • 硬边条纹就是多对色标交替共用同一位置
  • 后一个色标位置小于前一个时,浏览器会自动修正为相等

从普通渐变到硬边条纹

先看一个最简单的渐变:linear-gradient(red, blue)。浏览器默认把 red 放在 0%,blue 放在 100%,中间一百个百分点都在做颜色混合,所以看到的是柔和过渡。

如果把它改成 linear-gradient(red 50%, blue 50%),从 0% 到 50% 全是纯红(只有一个色标,没有混合对象),从 50% 到 100% 全是纯蓝,中间就是一条硬边。

用多对色标画出条纹CSS
/* 三条等宽硬边条纹 */
.stripe {
  height: 200px;
  background: linear-gradient(
    red    0%,   red    33.33%,   /* 第一段纯红 */
    white  33.33%, white  66.66%, /* 第二段纯白 */
    blue   66.66%, blue   100%    /* 第三段纯蓝 */
  );
}

每一对色标(比如 red 0%, red 33.33%)在自己的区间内保持纯色。相邻两对在同一个百分比交接,插值距离为零,形成硬边。这就是纯 CSS 条纹的原理。

浏览器的色标位置修正规则

规范规定:如果一个色标的位置比它前面那个色标小,浏览器会把它修正为和前一个相等。比如写 red 60%, blue 40%,blue 的 40% 会被修正成 60%,效果和 red 60%, blue 60% 一样,照样出现硬边。

这个规则经常被用来简化写法。比如画一个简单的进度条背景,前半段绿色后半段灰色,可以写成 linear-gradient(green var(--progress), #eee 0%)。#eee 的位置是 0%,比前面的 var(--progress) 小,会被自动修正到和它相等,刚好形成硬边分界。

回答前,多想一步

容易答错的地方

以为硬边是浏览器渲染精度不够
硬边不是精度问题。浏览器按照规范在两个色标之间做线性插值,距离为零就是零,不存在「渲染精度不足导致过渡消失」的情况。这是算法层面的确定性行为。
忘了色标位置会被自动修正
如果后一个色标位置写得比前一个小,比如 red 80%, blue 20%,浏览器不会倒着画,而是把 20% 修正成 80%。不知道这条规则的话,很容易以为代码写错了却看到了「正确」的硬边效果,排查不出原因。
试着用自己的话回答

面试官还会怎么问?

怎么用渐变画一个 45 度的斜条纹?

在 linear-gradient 第一个参数写角度,比如 45deg,然后用 repeating-linear-gradient 配合硬边色标。每一段条纹的宽度由相邻色标的位置差决定。repeating-linear-gradient(45deg, red 0 10px, white 10px 20px) 就能画出 10px 宽的红白斜条纹。

硬边渐变能做动画吗?

可以,但不能直接对 background 做 transition,因为渐变不是可插值类型。要实现进度条动画,通常把色标位置写成 CSS 自定义属性,用 @property 注册为 <percentage> 类型,这样浏览器就知道怎么对它做插值了。

repeating-linear-gradient 和手写多段色标有什么区别?

repeating-linear-gradient 会自动把你定义的色标段循环铺满整个元素,不用手动算每一段的百分比。手写多段色标更灵活,可以让每段宽度不一样,但条纹多的时候代码很长。效果上没有区别,都是硬边。

从一道题,走向一组知识

把知识连起来

动画与视觉

怎么用 conic-gradient 做一个圆环进度条?

conic-gradient 里色标同位置也是硬边,原理一样,只是渐变方向从直线变成了角度。

动画与视觉

关键帧动画里写了 display 这种不可插值的属性,浏览器会怎么处理?

不可插值属性在关键帧里也是跳变而不是过渡,和渐变硬边背后是同一个「无法插值就跳变」的逻辑。

参考资料

  • CSS:动画与视觉参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 从普通渐变到硬边条纹
  3. 浏览器的色标位置修正规则
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑