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解决移动页面上点击链接触发色块的问题
Jun 03 HTML / CSS
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
May 07 HTML / CSS
css3 position fixed固定居中问题解决方案
Aug 19 HTML / CSS
利用CSS3的线性渐变linear-gradient制作边框的示例
Jun 02 HTML / CSS
css3 边框、背景、文本效果的实现代码
Mar 21 HTML / CSS
详解CSS3中常用的样式【基本文本和字体样式】
Oct 20 HTML / CSS
Html5画布_动力节点Java学院整理
Jul 13 HTML / CSS
用HTML5制作视频拼图的教程
May 13 HTML / CSS
浅谈基于HTML5的在线视频播放方案
Feb 18 HTML / CSS
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
Aug 24 HTML / CSS
HTML5 Web缓存和运用程序缓存(cookie,session)
Jan 11 HTML / CSS
html5视频自动横过来自适应页面且点击播放功能的实现
Jun 03 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
用PHP制作静态网站的模板框架(二)
2006/10/09 PHP
如何使用脚本模仿登陆过程
2006/11/22 PHP
php下安装配置fckeditor编辑器的方法
2011/03/02 PHP
php设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
简单学习vue指令directive
2016/11/03 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
Python中apply函数的用法实例教程
2014/07/31 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
Python实现购物车程序
2018/04/16 Python
python中scikit-learn机器代码实例
2018/08/05 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
pycharm的python_stubs问题
2020/04/08 Python
python 使用tkinter+you-get实现视频下载器
2020/11/17 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
园林技术个人的自我评价
2014/01/08 职场文书
大学校园毕业自我鉴定
2014/01/15 职场文书
给幼儿园老师的表扬信
2014/01/19 职场文书
创意婚礼策划方案
2014/05/18 职场文书
2015年科协工作总结
2015/05/19 职场文书
汉字听写大会观后感
2015/06/12 职场文书
编写python程序的90条建议
2021/04/14 Python
详解Js模块化的作用原理和方案
2021/04/29 Javascript