Canvas中createLinearGradient画不出渐变,主因是坐标系理解错误、变换干扰、色标offset超范围(须0–1)、未适配devicePixelRatio及resize后未更新渐变坐标。
createLinearGradient 画不出渐变?先看坐标系是否搞反了Canvas 的渐变不是“从颜色 A 到颜色 B”就完事,它严格依赖起点 (x0, y0) 和终点 (x1, y1) 构成的线段方向。常见错误是以为 createLinearGradient(0, 0, 100, 0) 就是“从左到右”,但实际效果取决于你 fillRect 的位置和 canvas 坐标系原点(左上角)。如果画布没重置、或用 transform 移动过,起点/终点坐标可能被意外偏移。
0, 0, canvas.width, 0 表示横向全宽渐变)createLinearGradient 前使用 ctx.save()/ctx.translate() 等变换,除非你明确知道它们会影响渐变线段坐标ctx.strokeStyle = 'red'; ctx.beginPath(); ctx.moveTo(x0,y0); ctx.lineTo(x1,y1); ctx.stroke(); 画出渐变轴线,确认方向是否符合预期addColorStop,且 offset 必须在 0–1 范围内addColorStop 的第一个参数是归一化偏移量(0.0 到 1.0),不是像素值。很多人写成 grad.addColorStop(50, '#f00') 或 grad.addColorStop(-0.1, '#000'),结果静默失败——浏览器不会报错,但该色标直接被忽略,导致渐变断层或单色填充。
0 和 1),否则渐变无效addColorStop(0.5, '#f00'); addColorStop(0.5, '#00f');)const grad = ctx.createLinearGradient(0, 0, 200, 0); grad.addColorStop(0, '#ff9a9e'); // 左端 grad.addColorStop(0.5, '#fad0c4'); // 中间 grad.addColorStop(1, '#a1c4fd'); // 右端 ctx.fillStyle = grad; ctx.fillRect(0, 0, 200, 100);
createLinearGradient 返回的是一个 CanvasGradient 对象,它本身不绑定画布尺寸或绘制内容,只要坐标逻辑合理,完全可以复用。问题常出在:你在 canvas resize 后没更新渐变坐标,却还用旧的 grad 对象,导致渐变拉伸变形或偏移。
(x0,y0,x1,y1)
ctx.fillStyle = grad 写在初始化阶段,而应在每次绘制前设置,避免因上下文状态残留导致意外覆盖某些 iOS Safari 版本对带 transform: scale() 的 canvas 容器中渲染渐变有 bug;更常见的是高 DPI 设备(如 Retina 屏)下,若 canvas 的 width/height 属性没按 devic 缩放,而 CSS 样式又设置了
ePixelRatiowidth: 100%; height: 100%,会导致渐变坐标被拉伸,看起来像“只显示一半”或“颜色挤在一起”。
width 和 height 属性(不是 CSS 样式),并乘以 window.devicePixelRatio
transform,改用 position + top/left 控制位置console.log(ctx.fillStyle) 看是否仍为 CanvasGradient 实例,排除被意外覆盖成字符串颜色的可能addColorStop 不代表能稳定出图。
# css
# html
# html5
# 浏览器
# safari
# ios
# win
# 响应式布局
# 重绘
# canva
# red
# chrome
# 封装
# 字符串
# 闭包
# console
# 对象
# position
# transform
# canvas
# bug
# 色标
# 的是
# 不出
# 复用
# 左端
# 升序
# 也不
# 第一个
# 多个
# 你在
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎么设置桌面图标间距_Windows11注册表IconSpacing修改
如何在Golang中处理数据库事务错误_回滚和日志记录
Win11怎么关闭系统推荐内容_Windows11开始菜单布局设置
c++如何实现多态性_c++ 虚函数表原理与动态绑定机制【教程】
PHP的FastAdmin架构适合二次开发吗_特点分析【介绍】
Win11怎么关闭防火墙通知_屏蔽Win11安全中心安全警告弹窗【技巧】
Win11怎么清理C盘系统错误报告_Win11清理系统错误报告技巧【教程】
PHP主流架构怎么部署到Docker_容器化流程【操作】
如何在 Go 中可靠地测试含 time.Time 字段的结构体
如何在Windows上设置闹钟和计时器_系统自带的时钟应用全攻略【生活技巧】
Win11怎么设置默认浏览器Chrome_Windows11修改默认网页打开方式
Win10如何卸载Skype_Win10卸载Skype步骤【步骤】
如何用列表一次性对 DataFrame 的指定列应用字典映射
如何在 Go 中比较自定义的数组类型(如 [20]byte)
c++中如何计算坐标系中两点间距离_c++勾股定理求距离
如何在 Python 中将 ISO 8601 时间戳转换为日期并计算日期差值
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
php本地部署支持nodejs吗_php与nodejs混合开发环境搭建教程【教程】
Linux怎么修改用户密码_Linux系统passwd命令使用与权限管理【方法】
win11如何清理传递优化文件 Win11为C盘瘦身删除更新缓存【技巧】
如何使用Golang defer优化性能_减少不必要的函数调用
如何在Golang中使用内置函数_Golanglen append make等使用技巧
Win11怎么打开旧版计算器_Win11恢复传统计算器应用【详解】
php485读数据时阻塞怎么办_php485非阻塞读取设置技巧【详解】
Win11任务栏怎么固定应用 Win11将软件图标固定到底部【步骤】
c++ namespace命名空间用法_c++避免命名冲突
MAC如何快速搜索大文件_MAC磁盘空间分析与冗余数据清理【方法】
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Win11怎么调整屏幕亮度_Windows 11调节显示器亮度护眼设置【步骤】
Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录
如何解决同一段404代码在不同主机上表现不一致的问题
php怎么下载安装并配置环境变量_命令行调用PHP技巧【技巧】
c++怎么处理多线程死锁_c++ lock_guard与unique_lock锁管理【技巧】
Win10怎样清理C盘爱奇艺缓存_Win10清理爱奇艺缓存步骤【步骤】
手机php文件怎么变成mp4_安卓苹果打开php转mp4方法【教程】
MySQL 中使用 IF 和 CASE 实现查询字段条件化显示
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Mac系统更新下载慢或失败怎么办_解决macOS升级问题【方法】
Python 中将 ISO 8601 时间戳转换为日期并计算日期差值的完整教程
Django 测试数据库表缺失与字段未创建问题的完整解决方案
Win10怎么关闭自动更新错误弹窗_Win10策略屏蔽失败提示减少干扰【防护】
php订单日志怎么导出excel_php导出订单日志到表格教程【教程】
如何在Golang中实现文件下载_Golang文件传输与内容类型处理方法
Win11无法安装软件怎么办_Win11解除应用安装限制设置【修复】
Win11怎么清理C盘OneDrive缓存_Win11清理OneDrive缓存技巧【方法】
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
如何使用Golang反射将map转换为struct_Golang reflect类型映射技巧
Windows 10怎么把任务栏放在屏幕上方_Windows 10解锁任务栏并拖动位置
c++中如何使用auto关键字_c++11类型推导用法说明
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
2025-12-31
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。