canvas 阴影和图形变换的示例代码


Posted in HTML / CSS onJanuary 02, 2018

本文介绍了canvas 阴影和图形变换的示例代码,分享给大家,具体如下:

一、阴影设置

1、阴影的颜色:值为标准的CSS颜色值,用于设定阴影颜色效果,默认是全透明的黑色

context.shadowColor = color;

2、阴影模糊度:用户设定阴影的模糊程度,其数值不跟像素挂钩,默认为0

context.shadowBlur = 5;

3、阴影的偏移:

shadowOffsetX 和 shadowOffsetY 用来设定阴影在 X 和 Y 轴的延伸距离。负值表示阴影会往上或左延伸,正值则表示会往下或右延伸,它们默认都为 0

context.shadowOffsetX = 10; //正值:往右
context.shadowOffsetY = 10;  //正值:往下

4、设置文字阴影的例子

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            canvas{
                border:1px solid red;
            }
        </style>
    </head>
    <body>
        <canvas id="mycanvas" width="500" height="500"></canvas>
    </body>
    <script type="text/javascript">
        var canvas = document.getElementById("mycanvas");
        var context = canvas.getContext("2d");
        context.font = "bold 50px 微软雅黑";
        context.fillStyle="red";
        //阴影的颜色
        context.shadowColor = "orangered";
        //阴影模糊度
        context.shadowBlur = 20;
        //阴影的偏移
        context.shadowOffsetX = 10; //正值:往右
        context.shadowOffsetY = 10;  //正值:往下
        context.fillText("你好",100,100);
    </script>
</html>

canvas 阴影和图形变换的示例代码
 

二、图形变换

我们之前在2D变换中也学习过这些知识,但是我们canvas图形变换有所不同,不同点就是这里的变换并不是变换图形,而是变换坐标系,因此,我们在变换完一个图形之后,坐标系就发生变换了,那么我们如果再直接绘图的话就会出现问题,下面我们来具体是什么情况吧

1、为了验证我们上面的说法,我们来看一个例子

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            canvas{
                border:1px solid red;
            }
        </style>
    </head>
    <body>
        <canvas id="mycanvas" width="800" height="800"></canvas>
    </body>
    <script type="text/javascript">
        var canvas = document.getElementById("mycanvas");
        var context = canvas.getContext("2d");
        //用黑色直线线表示开始的x/y轴
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 5;
        context.lineTo(800,0);
        context.stroke();
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 5;
        context.lineTo(0,800);
        context.stroke();
        //原矩形:蓝色
        context.beginPath();
        context.fillStyle = "cornflowerblue";
        context.fillRect(0,0,50,50);
        context.fill();
        //平移矩形:粉色
        context.beginPath();
        context.translate(200,0)  //正:往右、下
        context.fillStyle = "deeppink";
        context.fillRect(0,0,50,50);
        context.fill();
        //用蓝色直线表示平移以后的坐标轴
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 5;
        context.lineTo(400,0);
        context.stroke();
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 5;
        context.lineTo(0,400);
        context.stroke();
    </script>
</html>

得到如下效果:证明图形变换以后是改变了坐标系的

canvas 阴影和图形变换的示例代码
 

2、旋转

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            canvas{
                border:1px solid red;
            }
        </style>
    </head>
    <body>
        <canvas id="mycanvas" width="800" height="800"></canvas>
    </body>
    <script type="text/javascript">
        var canvas = document.getElementById("mycanvas");
        var context = canvas.getContext("2d");
        //用黑色直线表示平移以后的坐标轴
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 10;
        context.lineTo(800,0);
        context.stroke();
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 10;
        context.lineTo(0,800);
        context.stroke();
        //原图:蓝色
        context.beginPath();
        context.fillStyle = "cornflowerblue";
        context.fillRect(100,0,50,50);
        context.fill(); 
        //旋转:绿色
        context.beginPath();
        context.fillStyle = "limegreen";
        context.rotate(Math.PI/4);
        context.fillRect(100,0,50,50);
        //用蓝色直线表示平移以后的坐标轴
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 5;
        context.strokeStyle = "blue";
        context.lineTo(800,0);
        context.stroke();
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 5;
        context.strokeStyle = "blue";
        context.lineTo(0,800);
        context.stroke();
    </script>
</html>

效果如下:

canvas 阴影和图形变换的示例代码
 

说明我们图形默认是绕canvas坐标系原点旋转的,图形在旋转的过程中,坐标系也会跟着旋转

3、图形缩放

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            canvas{
                border:1px solid red;
            }
        </style>
    </head>
    <body>
        <canvas id="mycanvas" width="800" height="800"></canvas>
    </body>
    <script type="text/javascript">
        var canvas = document.getElementById("mycanvas");
        var context = canvas.getContext("2d");
        //用黑色直线线表示开始的坐标系
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 30;
        context.lineTo(100,0);
        context.stroke();
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 30;
        context.lineTo(0,100);
        context.stroke();
        //原图:蓝色
        context.beginPath();
        context.fillStyle = "cornflowerblue";
        context.fillRect(100,0,50,50);
        context.fill();
        //缩放:粉色  ,放大/小坐标系,图形大小也缩放
        context.scale(2,1);   //第一个参数是X轴缩放比例,第二个参数是Y轴缩放比例
        context.beginPath();
        context.fillStyle = "pink";
        context.fillRect(100,0,50,50);
    //用蓝色直线表示平移以后的坐标轴
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 10;
        context.strokeStyle = "blue";
        context.lineTo(100,0);
        context.stroke();
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 10;
        context.strokeStyle = "blue";
        context.lineTo(0,100);
        context.stroke();
    </script>
</html>

效果如下:

canvas 阴影和图形变换的示例代码
 

我们可以看到,我们在放大X轴图形的宽度时,我们的坐标系的X轴也跟着放大了

那我们在对canvas图形做变换之后,怎么才能重新再canvas上绘制我们我们想要的图形而又不用繁琐的方式将他改变的坐标系恢复呢?
 

刚好canvas有状态的保存和获取

canvas 阴影和图形变换的示例代码

比如我们拿上面写过的例子进行演示一下状态的保存和获取效果

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            canvas{
                border:1px solid red;
            }
        </style>
    </head>
    <body>
        <canvas id="mycanvas" width="800" height="800"></canvas>
    </body>
    <script type="text/javascript">
        var canvas = document.getElementById("mycanvas");
        var context = canvas.getContext("2d");
        //用黑色直线线表示开始的坐标系
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 30;
        context.lineTo(100,0);
        context.stroke();
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 30;
        context.lineTo(0,100);
        context.stroke();
        //原图:蓝色
        context.beginPath();
        context.fillStyle = "cornflowerblue";
        context.fillRect(100,0,50,50);
        context.fill();
        //缩放:粉色  ,放大/小坐标系,图形大小也缩放
        context.save();
        context.scale(2,1);   //第一个参数是X轴缩放比例,第二个参数是Y轴缩放比例
        context.beginPath();
        context.fillStyle = "pink";
        context.fillRect(100,0,50,50);
        context.restore();
    //用蓝色直线表示平移以后的坐标轴
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 10;
        context.strokeStyle = "blue";
        context.lineTo(100,0);
        context.stroke();
        context.beginPath();
        context.moveTo(0,0);
        context.lineWidth = 10;
        context.strokeStyle = "blue";
        context.lineTo(0,100);
        context.stroke();
    </script>
</html>

canvas 阴影和图形变换的示例代码

正如你看到的效果图,我们在缩放之前保存了坐标系的状态,也就是一开始未做任何变动的状态,然后在图像缩放之后我们又将这种状态获取到,也就是回到一开始未做任何变动的状态,这就是状态的保存和获取,这样就可以解决我们图形变换对坐标系的影响了。
 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
10 套华丽的CSS3 按钮小结
Oct 03 HTML / CSS
布局和排版教程 纯css3实现图片三角形排列
Oct 17 HTML / CSS
实例教程 纯CSS3打造非常炫的加载动画效果
Nov 05 HTML / CSS
一款纯css3实现的颜色渐变按钮的代码教程
Nov 12 HTML / CSS
利用CSS3实现折角效果实例源码
Sep 28 HTML / CSS
一篇文章带你学习CSS3图片边框
Nov 04 HTML / CSS
CSS3 实现穿梭星空动画
Nov 13 HTML / CSS
Canvas 文本转粒子效果的实现代码
Feb 14 HTML / CSS
HTML5 贪吃蛇游戏实现思路及源代码
Sep 03 HTML / CSS
详解HTML5中的元素与元素
Aug 17 HTML / CSS
AmazeUI 缩略图的实现示例
Aug 18 HTML / CSS
CSS3实现360度循环旋转功能
Feb 12 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
Dec 29 #HTML / CSS
Canvas绘制浮动球效果的示例
Dec 29 #HTML / CSS
微信小程序“圣诞帽”的实现思路详解
Dec 28 #HTML / CSS
基于HTML5+Webkit实现树叶飘落动画
Dec 28 #HTML / CSS
HTML5 解决苹果手机不能自动播放音乐问题
Dec 27 #HTML / CSS
canvas实现圆形进度条动画的示例代码
Dec 26 #HTML / CSS
详解HTML5 录音的踩坑之旅
Dec 26 #HTML / CSS
You might like
ThinkPHP php 框架学习笔记
2009/10/30 PHP
php提高网站效率的技巧
2015/09/29 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
体验jQuery和AngularJS的不同点及AngularJS的迷人之处
2016/02/02 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
JSON.stringify()方法讲解
2019/01/31 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
js实现打字小游戏
2019/12/17 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
2020/05/08 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
python实现感知器算法详解
2017/12/19 Python
Python设计模式之中介模式简单示例
2018/01/09 Python
Python生成器以及应用实例解析
2018/02/08 Python
对python中两种列表元素去重函数性能的比较方法
2018/06/29 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
文秘应届生求职信
2014/07/05 职场文书
党员群众路线学习心得体会
2014/11/04 职场文书
死亡赔偿协议书
2015/01/28 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
浅谈Python数学建模之整数规划
2021/06/23 Python