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 和 HTML5 兼容速查表 图文
Apr 01 HTML / CSS
纯css3(无图片/js)制作的几个社交媒体网站的图标
Mar 21 HTML / CSS
css3实现动画的三种方式
Aug 24 HTML / CSS
css3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果
Jan 27 HTML / CSS
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
Jan 09 HTML / CSS
Html5实现如何在两个div元素之间拖放图像
Mar 29 HTML / CSS
H5 video poster属性设置视频封面的方法
May 25 HTML / CSS
HTML5实现应用程序缓存(Application Cache)
Jun 16 HTML / CSS
html5跳转小程序wx-open-launch-weapp踩坑
Dec 02 HTML / CSS
前端使用canvas生成盲水印的加密解密的实现
Dec 16 HTML / CSS
CSS3 制作的悬停缩放特效
Apr 13 HTML / CSS
CSS3中Animation实现简单的手指点击动画的示例
Jul 15 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导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
php实现两表合并成新表并且有序排列的方法
2014/12/05 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
jQuery仿Excel表格编辑功能的实现代码
2013/05/01 Javascript
js控制table合并具体实现
2014/02/20 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
用Vue.extend构建消息提示组件的方法实例
2017/08/08 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
vue.js项目nginx部署教程
2018/04/05 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
Python的Flask框架中配置多个子域名的方法讲解
2016/06/07 Python
python cs架构实现简单文件传输
2020/03/20 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
python中几种自动微分库解析
2019/08/29 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
Django自带的用户验证系统实现
2020/12/18 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
经营理念标语
2014/06/21 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
刮痧观后感
2015/06/05 职场文书
导游词之苏州阳澄湖
2019/11/15 职场文书