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实现Material Design效果
Mar 09 HTML / CSS
CSS3之边框多颜色Border-color属性使用示例
Oct 11 HTML / CSS
CSS3 Columns分列式布局方法简介
May 03 HTML / CSS
使用CSS3编写类似iOS中的复选框及带开关的按钮
Apr 11 HTML / CSS
css3 column实现卡片瀑布流布局的示例代码
Jun 22 HTML / CSS
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
Mar 05 HTML / CSS
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
Jan 09 HTML / CSS
浅析HTML5的WebSocket与服务器推送事件
Feb 19 HTML / CSS
html5如何在Canvas中实现自定义路径动画示例
Sep 18 HTML / CSS
手机端用rem+scss做适配的详解
Nov 15 HTML / CSS
Html5嵌入钉钉的实现示例
Jun 04 HTML / CSS
浅析HTML5页面元素及属性
Jan 20 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
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
利用static实现表格的颜色隔行显示的代码
2007/09/02 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
javascript IFrame 强制刷新代码
2009/07/23 Javascript
JQuery select标签操作代码段
2010/05/16 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
nodejs URL模块操作URL相关方法介绍
2015/03/03 NodeJs
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
Python编程实现正则删除命令功能
2017/08/30 Python
django使用xlwt导出excel文件实例代码
2018/02/06 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
python多进程并发demo实例解析
2019/12/13 Python
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
运动会领导邀请函
2014/01/10 职场文书
文案策划求职信
2014/04/14 职场文书
初一语文教学反思
2016/03/03 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
Python读写yaml文件
2022/03/20 Python
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS