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实现的几个小loading效果
Sep 27 HTML / CSS
35款精致的 CSS3 和 HTML5 网页模板 推荐
Aug 03 HTML / CSS
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
Jan 07 HTML / CSS
分享CSS3制作卡片式图片的方法
Jul 08 HTML / CSS
详解CSS3中强大的filter(滤镜)属性
Jun 29 HTML / CSS
html5 拖拽上传图片实例演示
Apr 01 HTML / CSS
html5图片上传预览示例分享
Apr 14 HTML / CSS
用HTML5 实现橡皮擦的涂抹效果的教程
May 11 HTML / CSS
详解H5 活动页之移动端 REM 布局适配方法
Dec 07 HTML / CSS
canvas版人体时钟的实现示例
Jan 29 HTML / CSS
position:sticky 粘性定位的几种巧妙应用详解
Apr 24 HTML / CSS
css常用字体属性与背景属性介绍
Feb 28 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
DIY实用性框形天线
2021/03/02 无线电
第四节--构造函数和析构函数
2006/11/16 PHP
php 中的4种标记风格介绍
2012/05/10 PHP
360通用php防护代码(使用操作详解)
2013/06/18 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
PDO::rollBack讲解
2019/01/29 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
基于jQuery的倒计时插件代码
2011/05/07 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
js实时获取并显示当前时间的方法
2015/07/31 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
python数字图像处理之高级形态学处理
2018/04/27 Python
numpy库reshape用法详解
2020/04/19 Python
虚拟机下载python是否需要联网
2020/07/27 Python
如何选择使用结构还是类
2014/05/30 面试题
医师定期考核实施方案
2014/05/07 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
环卫处个人工作总结
2015/03/04 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
经济纠纷起诉状
2015/05/20 职场文书
刮痧观后感
2015/06/05 职场文书
银行工作心得体会范文
2016/01/23 职场文书
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记