Canvas 文本填充线性渐变的使用详解


Posted in HTML / CSS onJune 22, 2020

前言

在 Canvas 中对文本填充水平或垂直的线性渐变可以轻易实现,而带角度的渐变就复杂很多;就好像下面这样,假设文本矩形宽为 W, 高为 H, 左上角坐标为 X, Y

Canvas 文本填充线性渐变的使用详解

猜想与答案

给出两个答案:

Canvas 文本填充线性渐变的使用详解

正确答案是图二,因为这样得出来的坐标生成的渐变最紧接文本矩形边界,它的运动轨迹如下动图:

Canvas 文本填充线性渐变的使用详解

(图来源:Do you really know CSS linear-gradients)

渐变起点与终点坐标的计算

所以,渐变的起点与终点坐标该怎么计算呢?答:

  1. 先求得起点与终点的长度(距离)。
  2. 根据长度与文本矩形的中心点坐标分别计算出起点与终点坐标。

线性渐变长度的计算 W3C 给出了一个公式(A 表示角度):

gradientLineLength = abs(W * sin(A)) + abs(H * cos(A))

不过,该公式主要应用于 CSS 的线性渐变设置,即以 12 点钟方向为 0°,顺时针旋转。

而我们需要的是以 3 点钟方向为 0°,逆时针旋转,即公式为:

gradientLineLength = abs(W * cos(A)) + abs(H * sin(A))

// 半长:
halfGradientLineLength = (abs(W * cos(A)) + abs(H * sin(A))) / 2

那么这个公式是怎么来的呢?以下是笔者的求解:

Canvas 文本填充线性渐变的使用详解

由图可得以下方程组:

Canvas 文本填充线性渐变的使用详解

因此可推导出:

Canvas 文本填充线性渐变的使用详解

化简后为:

Canvas 文本填充线性渐变的使用详解

所以 c1 + c2 为:

Canvas 文本填充线性渐变的使用详解

由三角函数平方公式知:cos(A) * cos(A) = 1 - sin(A) * sin(A), 代入 c1 + c2

Canvas 文本填充线性渐变的使用详解

第一步化简后:

Canvas 文本填充线性渐变的使用详解

最后的结果就是:

Canvas 文本填充线性渐变的使用详解

因为 sin, cos 在函数周期内存在负值(见下面角度对应的三角函数周期图),所以线性渐变的长度需要取绝对值。

至此,我们知道了线性渐变长度,文本矩形的中心点坐标很好算,即:

centerX = X + W / 2
centerY = Y + H / 2

所以,起点与终点的坐标分别为:

startX = centerX - cos(A) * halfGradientLineLength
startY = centerY + sin(A) * halfGradientLineLength

endX = centerX + cos(A) * halfGradientLineLength
endY = centerY - sin(A) * halfGradientLineLength

看看最终效果

Canvas 文本填充线性渐变的使用详解

经验注释

进行三角函数计算时,应尽量避免先用 tan, 因为 tan 在其周期内存在无穷值,需要做特定的条件判断,而 sin, cos 没有此类问题,代码书写更为简洁清晰并且不会因疏忽产生错误,见下面三角函数与角度的对应关系周期图。

Canvas 文本填充线性渐变的使用详解

参阅

Do you really know CSS linear-gradients?

MDN linear-gradient

W3C - CSS Images Module Level 3 # linear-gradients

到此这篇关于Canvas 文本填充线性渐变的使用详解的文章就介绍到这了,更多相关Canvas文本填充线性渐变内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

HTML / CSS 相关文章推荐
纯CSS3实现质感细腻丝滑按钮
Mar 09 HTML / CSS
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
Dec 30 HTML / CSS
CSS3之transition实现下划线的示例代码
May 30 HTML / CSS
CSS3制作轮播图的一种方法
Nov 11 HTML / CSS
HTML5 本地存储 LocalStorage详解
Jun 24 HTML / CSS
js实现移动端H5页面手指滑动刻度尺功能
Nov 16 HTML / CSS
基于HTML5的WebSocket的实例代码
Aug 15 HTML / CSS
举例详解HTML5中使用JSON格式提交表单
Jun 16 HTML / CSS
html5简介_动力节点Java学院整理
Jul 07 HTML / CSS
Html5页面内使用JSON动画的实现
Jan 29 HTML / CSS
HTML5 播放 RTSP 视频的实例代码
Jul 29 HTML / CSS
前后端结合实现amazeUI分页效果
Aug 21 HTML / CSS
HTML5播放实现rtmp流直播
Jun 16 #HTML / CSS
HTML5实现应用程序缓存(Application Cache)
Jun 16 #HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
Jun 15 #HTML / CSS
HTML5页面无缝闪开的问题及解决方案
Jun 11 #HTML / CSS
Html5导航栏吸顶方案原理与对比实现
Jun 10 #HTML / CSS
浅析图片上传及canvas压缩的流程
Jun 10 #HTML / CSS
原生canvas制作画图小工具的踩坑和爬坑
Jun 09 #HTML / CSS
You might like
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
2018/08/10 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
Python爬取三国演义的实现方法
2016/09/12 Python
一文总结学习Python的14张思维导图
2017/10/17 Python
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
Python Merge函数原理及用法解析
2020/09/16 Python
Hotter Shoes美国官网:英国最受欢迎的舒适鞋
2018/08/02 全球购物
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
门诊挂号室室长岗位职责
2013/11/27 职场文书
幼儿园父亲节活动方案
2014/03/11 职场文书
优秀班集体申报材料
2014/12/25 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
Pygame Draw绘图函数的具体使用
2021/11/17 Python
关于Python中进度条的六个实用技巧分享
2022/04/05 Python