canvas 根底入门(四)

【今日学习目录】

  • canvas中怎么应用图片
  • canvas中怎么应用暗影
  • canvas中绘制文本信息

【今日实现指标】

通过这么多天的分享,canvas的根底应该还是把握了一些,明天就来实现一个根底班的折线图,进阶版:尝试一下用数据驱动,动态创建这个折线图。

1、应用图片

在canvas中应用图片,须要用到JavaScript中原生提供的Image的构造函数来生成一个图片对象,因为canvas提供的图片办法承受两个参数。第一个参数就是一个图片的对象或者是一个另外的canvas对象,第一个参数是决定以后图片是否反复平铺,跟css中的background-repeat一样的参数:repeat、repeat-x、repeat-y、no-repeat。通过 createPattern 办法来创立图片。

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>canvas 根底入门(四)</title>    <style>        #canvasBox{            border: 1px solid #ccc;            display: block;            margin: 100px auto;        }    </style></head><body>    <canvas width="500" height="500" id="canvasBox"> 您浏览器暂不反对 canvas 标签的渲染,请抉择 谷歌浏览器或者火狐浏览器关上浏览~ </canvas>    <script type="text/javascript">         // 获取到canvas盒子        let canvas = document.getElementById("canvasBox");        // 获取canvas的上下文对象        let ctx = canvas.getContext("2d");        // 判断以后浏览器是否反对        if ( ctx ) {            // 生成图片对象            let img = new Image();            // 加载图片门路            img.src = "./1.jpg";            // 监听图片加载胜利            img.onload = () => {                // 创立canvas图片对象                let ctxImg = ctx.createPattern(img, 'repeat');                // 赋值给款式                ctx.fillStyle = ctxImg;                // 创立矩形                ctx.fillRect(10, 10, 300, 300);            }        } else {            console.log("您以后浏览器不反对canvas");        }    </script></body></html>

【效果图】

能够看到 createPattern 的第二个参数为repeat的时候,是会x、y轴都会平铺。对应批改第二个参数,会有不同的平铺成果。

【repeat-x】

【repeat-y】

【no-repeat】

2、应用暗影

在很多网站中都能够看到暗影的成果,文字暗影,盒子暗影。应用的还是比拟多的。在canvas中也反对暗影的绘制。

canvas提供了四个属性来设置暗影成果,shadowOffsetX 设置暗影在x轴延申的地位,shadowOffsetY 设置暗影在y轴延申的地位,shadowBlur 设置暗影的含糊水平。两个属性的默认值是0,shadowColor 是设置暗影的色彩,与 CSS 的色彩统一标准,默认是全透明的彩色。

通过一个小例子来感受一下canvas的暗影成果

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>canvas 根底入门(四)</title>    <style>        #canvasBox{            border: 1px solid #ccc;            display: block;            margin: 100px auto;        }    </style></head><body>    <canvas width="500" height="500" id="canvasBox"> 您浏览器暂不反对 canvas 标签的渲染,请抉择 谷歌浏览器或者火狐浏览器关上浏览~ </canvas>    <script type="text/javascript">         // 获取到canvas盒子        let canvas = document.getElementById("canvasBox");        // 获取canvas的上下文对象        let ctx = canvas.getContext("2d");        // 判断以后浏览器是否反对        if ( ctx ) {            // 设置 暗影 延申地位            ctx.shadowOffsetX = 10;            ctx.shadowOffsetY = 10;            // 设置含糊水平            ctx.shadowBlur = 10;            // 设置暗影色彩            ctx.shadowColor = "rgba(255,0,255, 0.5)";            // 设置盒子的色彩            ctx.fillStyle = "#f0f";            // 绘制矩形            ctx.fillRect(100, 100, 100, 100);        } else {            console.log("您以后浏览器不反对canvas");        }    </script></body></html>

【效果图】

在canvas中应用暗影还是比拟不便的,四个属性就能够把暗影成果展示进去。刚是设置的正向的暗影,设置地位的时候,值是能够为正数的,给盒子的上方以及右方增加暗影。

// 设置 暗影 延申地位ctx.shadowOffsetX = -10;ctx.shadowOffsetY = -10;

【效果图】

仔细的小伙伴应该能够发现一个问题,就是,canvas如同没有提供一个同时左右都有暗影的属性,那怎么能力让盒子周围都有暗影呢。

因为canvas没有像html中css款式提供的shadow哪有有五个参数,设置扩散范畴。那么只能看到一个简略的周围暗影成果

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>canvas 根底入门(四)</title>    <style>        #canvasBox{            border: 1px solid #ccc;            display: block;            margin: 100px auto;        }    </style></head><body>    <canvas width="500" height="500" id="canvasBox"> 您浏览器暂不反对 canvas 标签的渲染,请抉择 谷歌浏览器或者火狐浏览器关上浏览~ </canvas>    <script type="text/javascript">         // 获取到canvas盒子        let canvas = document.getElementById("canvasBox");        // 获取canvas的上下文对象        let ctx = canvas.getContext("2d");        // 判断以后浏览器是否反对        if ( ctx ) {            // 设置 暗影 延申地位            ctx.shadowOffsetX = 0;            ctx.shadowOffsetY = 0;            // 设置含糊水平            ctx.shadowBlur = 20;            // 设置暗影色彩            ctx.shadowColor = "rgba(255,0,255, 1)";            // 设置盒子的色彩            ctx.fillStyle = "#f0f";            // 绘制矩形            ctx.fillRect(100, 100, 100, 100);        } else {            console.log("您以后浏览器不反对canvas");        }    </script></body></html>

【效果图】

3、绘制文本

之前咱们学了怎么画一条线,怎么画一个圆,画一个有弧度的形态,设置款式,应用图片,应用暗影。始终还没波及到如果设置一个文字,canvas常见的应用场景,图表插件,分享海报,以及其余的一些图片合成的算法和小游戏的开发。文字必定是必不可少的。

canvas 提供了两个绘制文本的办法。fillText( text, x, y [, maxWidth ] ), strokeText( text, x, y[, maxWidth] ), 两个办法参数是一样的。第一个参数是须要绘制的文本信息,x,y确定文本开始绘制的地位。最初一个参数是可选的,是绘制文本最大的宽度。如果文字超出了。会对文字进行缩放。

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>canvas 根底入门(四)</title>    <style>        #canvasBox{            border: 1px solid #ccc;            display: block;            margin: 100px auto;        }    </style></head><body>    <canvas width="500" height="500" id="canvasBox"> 您浏览器暂不反对 canvas 标签的渲染,请抉择 谷歌浏览器或者火狐浏览器关上浏览~ </canvas>    <script type="text/javascript">         // 获取到canvas盒子        let canvas = document.getElementById("canvasBox");        // 获取canvas的上下文对象        let ctx = canvas.getContext("2d");        // 判断以后浏览器是否反对        if ( ctx ) {            // 设置文本大小            ctx.font = "40px serif";            // 绘制填充文本            ctx.fillText("hello word", 100, 100);            // 绘制空心文本            ctx.strokeText("hello word", 100, 200);        } else {            console.log("您以后浏览器不反对canvas");        }    </script></body></html>

【效果图】

刚刚下面的例子中,我用到了一个font属性,对文字大小进行了批改。canvas 提供了四个属性设置文本的款式。font 跟css中的fon属性是一样的。textAlign 设置文本对齐形式: start、end、left、 right、或者 center, 默认值是start。textBaseline 设置基线对齐形式:top, hanging, middle, alphabetic, ideographic, bottom,默认值是 alphabetic。direction 设置文本的方向:lrt, rtl, inherit

4、实现一个简略的折线图

【剖析】

  • x轴刻度线
  • 底部x轴划分y轴工夫线的数据
  • 折线图地位

    首先须要咱们实现一个简略版的折线图。最高是300,x轴每个刻度相隔50高度。y轴间隔分成七份,简略剖析后,咱们须要绘画的有三大部分,线段,文字,圆点。那么咱们对实现三个办法。绘制不同内容。

【绘制线段】

// 绘制线段的办法 开始点xy,完结点xy, 色彩值 默认是彩色let line = ( startX, startY, endX, endY, color = "#000" ) => {    // 设置色彩    ctx.strokeStyle = color;    // 生成门路    ctx.beginPath();    // 设置笔触    ctx.moveTo(startX,startY);    // 第一笔    ctx.lineTo(endX, endY);    // 敞开门路    ctx.closePath();    ctx.stroke();}

【绘制文字】

// 绘制文字 文本, 绘制开始坐标,字体大小let text = (text, x, y, fontSize = 16) => {    // 设置文字大小    ctx.font = fontSize + 'px serif';    // 绘制文本    ctx.fillText(text, x, y);}

【绘制圆】

 // 绘制圆 中心点地位,半径 let round = ( x, y, r ) => {     // 生成门路     ctx.beginPath();     // 绘制圆     ctx.arc(x, y, r, 0, Math.PI / 180 * 360, false);     ctx.stroke(); }

辅助函数都曾经筹备好了。咱们现来绘制折线图的x轴和y轴。首先确定一下分割线的间隔。x轴的线,须要从总高度 / 刻度线 = 分割线间隔。写着写着忽然发现,这个计算规定有问题。稍微难堪,数学真是硬伤呀

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>canvas 根底入门(四)</title>    <style>        #canvasBox{            border: 1px solid #ccc;            display: block;            margin: 100px auto;        }    </style></head><body>    <canvas width="500" height="500" id="canvasBox"> 您浏览器暂不反对 canvas 标签的渲染,请抉择 谷歌浏览器或者火狐浏览器关上浏览~ </canvas>    <script type="text/javascript">         // 获取到canvas盒子        let canvas = document.getElementById("canvasBox");        // 获取canvas的上下文对象        let ctx = canvas.getContext("2d");        // 判断以后浏览器是否反对        if ( ctx ) {                      // 绘制线段的办法 开始点xy,完结点xy, 色彩值 默认是彩色            let line = ( startX, startY, endX, endY, color = "#000" ) => {                // 设置色彩                ctx.strokeStyle = color;                // 生成门路                ctx.beginPath();                // 设置笔触                ctx.moveTo(startX,startY);                // 第一笔                ctx.lineTo(endX, endY);                // 敞开门路                // ctx.closePath();                ctx.stroke();            }            // 绘制文字 文本, 绘制开始坐标,字体大小            let text = (text, x, y, fontSize = 16) => {                // 设置文字大小                ctx.font = fontSize + 'px serif';                // 绘制文本                ctx.fillText(text, x, y);            }            // 绘制圆 中心点地位,半径            let round = ( x, y, r ) => {                // 生成门路                ctx.beginPath();                // 绘制圆                ctx.arc(x, y, r, 0, Math.PI / 180 * 360, false);                ctx.stroke();            }            // 绘制办法            let polyline = () => {                // 定义盒子总高度,宽度, 咱们定义canvas高度是500,这里咱们取400                let H = 400,                    W = 400;                // 获取到x轴之间间隔                let X = parseInt(400 / 7);                // 获取Y轴之间间隔                let Y = parseInt(400 / 8);                                // 绘制折线的数据                let lineData = [50, 130, 150, 88, 250, 33, 300];                // 工夫线的数据                let timeData = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];                // 绘制x轴的线                [7,6,5,4,3,2,1].forEach((item, index) => {                    // 画线                    line(50,50 + X * index, W, 50 + X * index, item === 1 ? "#000" : "#ccc" );                    console.log(50 + X * index)                    // 标注刻度值                    text((item - 1) * 50, 20,56 + X * index);                })                // 画工夫分割线                for ( let i = 0, len = timeData.length + 1; i < len; i++ ) {                    // 画线                    line(50 + Y * i,X * 6 + 50, 50 + Y * i, X * 6 + 50 + 10);                    if ( len - 1 > i ) {                        // 标注刻度工夫                        text(timeData[i], 65 + Y * i, X * 6 + 65, 13);                    }                }                // 绘制折线图                lineData.forEach(( item, index ) => {                    if ( index === 0 ) {                        ctx.moveTo(50 + Y   * (index + 1), 400 - item  - 14 );                        ctx.lineTo(50 +  Y  * (index + 1), 400 - item  - 14 );                    } else {                        ctx.lineTo(50 +  Y  * (index + 1), 400 - item - 14 );                    }                    ctx.stroke();                })            }            polyline();        } else {            console.log("您以后浏览器不反对canvas");        }    </script></body></html>

【效果图】

进阶版没工夫去实现了。忽然邻近上班,来我的项目了。靠各位大佬去实现了。