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 相关文章推荐
分享8款纯CSS3实现的搜索框功能
Sep 14 HTML / CSS
CSS3 please 跨浏览器的CSS3产生器
Mar 14 HTML / CSS
利用纯CSS3实现tab选项卡切换示例代码
Sep 21 HTML / CSS
HTML+CSS3模拟心的跳动实例代码
Sep 05 HTML / CSS
CSS3动画特效在活动页中的应用
Jan 21 HTML / CSS
css3中less实现文字长阴影(long shadow)
Apr 24 HTML / CSS
canvas粒子动画背景的实现示例
Sep 03 HTML / CSS
html5中audio支持音频格式的解决方法
Aug 24 HTML / CSS
localStorage的过期时间设置的方法详解
Nov 26 HTML / CSS
CSS3鼠标悬浮过渡缩放效果
Apr 17 HTML / CSS
html form表单基础入门案例讲解
Jul 15 HTML / CSS
纯CSS如何禁止用户复制网页的内容
Nov 01 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对字符串的递增运算分析
2010/08/08 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
javascript+php实现根据用户时区显示当地时间的方法
2015/03/11 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
PHP的自定义模板引擎
2017/03/24 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
JavaScript 基本概念
2015/01/20 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
javascript轮播图算法
2016/10/21 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
使用FileReader API创建Vue文件阅读器组件
2018/04/03 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
python实现的MySQL增删改查操作实例小结
2018/12/19 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
五年级科学教学反思
2014/02/05 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
诉讼财产保全担保书
2014/05/20 职场文书
张丽莉观后感
2015/06/16 职场文书