canvas基础
canvas简述
canvas是html5新增的一个标签,使用都是依赖于js语法,不依赖任何第三方插件 ie低版本暂不支持
canvas的基本使用步骤:
1:先在body中设置一个容器
id='canvas'>
在这里显示canvas绘制的图形
默认的宽是300px 高150px 不能使用css去设置宽高 可以直接在标签中设置或者js设置宽高
2:在javascript中
2.1获取canvas标签对象---通过id名去获取
var canvas = document.getElementById('canvas')
2.2 获取画笔对象的上下文 | 画布的上下文对象 var ctx=canvas.getContext('2d')
2.3绘制一个矩形---表示初始坐标(10,10)宽100高50
ctx.rect(10,10,100,50)
ctx.moveTo(100,100)--- //起始点
ctx.fill() //填充
ctx.stroke() //描边--写在最后面
canvas默认的填充颜色和边框颜色均为黑色,可以自定义设置相关的样式:
关于颜色的设置-- 同css中颜色设置一样--一定在填充或者描边之前设置颜色fillStyle 填充颜色属性--
strokeStyle描边颜色属性
如:ctx.fillStyle='red';
ctx.strokeStyle='yellow';
线条样式的设置:
Linejoin 拐角设置 ---round圆角 miter bevel
LineCap 线条两端的设置 butt 默认 round圆角 square加了一个正方形的帽
LineWidth线宽---数字
开启路径和关闭路径:
ctx.beginPath()
绘制路径图形 moveTo LineTo rect arc
先开启路径,相当于开辟了一个开启路径私有空间,绘制的内容就不会互相影响
但是画笔的linewidth fillStyle strokeStyle Linejoin LineCap 都是全局的
ctx.closePath() 关闭路径 不需要手动闭合 会自动将末尾的点和起始点连接闭合
时钟案例:
main.js部分:
let dom = document.getElementById('clock');
let ctx = dom.getContext('2d');
let width = ctx.canvas.width;
let height = ctx.canvas.height;
var r = width / 2;
//为了宽度高度放大是时,其他边框等比美观,所以设置一个比例
var rem = width / 200;
function drawBackground() {
ctx.save();
ctx.translate(r, r);
ctx.beginPath(); //每次开始前必须开始一条路径
//按比例输出边框宽度,width/200=x/10=rem; 即 x=10 *rem
ctx.strokeStyle = 'lightblue'
ctx.lineWidth = 5 * rem;
ctx.arc(0, 0, r - ctx.lineWidth / 2, 0, 2 * Math.PI, false);
ctx.stroke();
var hourNumbers = ['Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅴ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ', 'Ⅹ', 'Ⅺ', 'Ⅻ'];
hourNumbers.map(function (number, i) {
var rad = 2 * Math.PI / 12 * i;
var x = Math.cos(rad) * (r - 30 * rem);
var y = Math.sin(rad) * (r - 30 * rem);
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.font = 10 * rem + "px Arial";
ctx.fillText(number, x, y)
});
for (var i = 0; i < 60; i++) {
var rad = 2 * Math.PI / 60 * i;
var x = Math.cos(rad) * (r - 18 * rem);
var y = Math.sin(rad) * (r - 18 * rem);
ctx.beginPath();
if (i % 5 === 0) {
ctx.fillStyle = '#000';
} else {
ctx.fillStyle = '#ccc';
}
ctx.moveTo(x, y,)
ctx.arc(x, y, 2 * rem, 2 * Math.PI, false);
ctx.fill();
}
}
function drawHour(hour, minute) {
ctx.save();
ctx.beginPath();
var rad = 2 * Math.PI / 12 * hour;
var mrad = 2 * Math.PI / 12 / 60 * minute;
ctx.rotate(rad + mrad);
ctx.lineWidth = 6 * rem;
ctx.moveTo(0, 10 * rem);
ctx.lineTo(0, -r / 2);
ctx.lineCap = 'round';
ctx.stroke();
ctx.restore();
}
function drawMinute(minute) {
ctx.save();
ctx.beginPath();
var rad = 2 * Math.PI / 60 * minute;
ctx.rotate(rad);
ctx.lineWidth = 3 * rem;
ctx.moveTo(0, 10 * rem);
ctx.lineTo(0, -r / 2 - 10);
ctx.lineCap = 'round';
ctx.stroke();
ctx.restore();
}
function drawSecond(second) {
ctx.save();
ctx.beginPath();
var rad = 2 * Math.PI / 60 * second;
ctx.rotate(rad);
ctx.lineWidth = 3;
ctx.moveTo(-2 * rem, 20 * rem);
ctx.lineTo(2 * rem, 20 * rem);
ctx.lineTo(1, -r + 18 * rem);
ctx.lineTo(1, -r + 18 * rem);
ctx.fillStyle = '#e4393c';
ctx.fill();
ctx.restore();
}
function drawDot() {
ctx.beginPath();
ctx.fillStyle = '#fff';
ctx.arc(0, 0, 3 * rem, 2 * Math.PI, false);
ctx.fill();
}
function draw() {
// 清除画布
ctx.clearRect(0, 0, width, height);
// 获取当前事件
var now = new Date();
// 获取当前的小时
var hour = now.getHours();
// 获取当前的分钟
var minute = now.getMinutes();
// 获取当前的秒钟
var second = now.getSeconds();
// 绘制
drawBackground();
drawHour(hour, minute);
drawMinute(minute);
drawSecond(second);
drawDot();
ctx.restore();
}
setInterval(draw, 1000);
渐变效果:
线性渐变:createlinearGradient
let linearGradient = ctx.createLinearGradient(0, 0, 300, 0)
linearGradient.addColorStop(0.2, '#ac8eff') //0-0.3 的颜色
linearGradient.addColorStop(0.5, '#dd8efd') //为我们fillStyle设置为渐变色
linearGradient.addColorStop(0.8, '#f084fd')
linearGradient.addColorStop(1, '#f683fc')
ctx.fillStyle = linearGradient //颜色对象赋值给当前轨迹的fillStyle
ctx.rect(0, 0, 300, 300)
ctx.fill()
径向渐变:createRadialGradient
let radialGradient=ctx.createRadialGradient(100, 200, 30, 80, 100, 150)
//渐变的开始圆的坐标和半径 vs 渐变的结束圆的坐标和半径
radialGradient.addColorStop(0.2, '#ac8eff')
radialGradient.addColorStop(0.5, '#dd8efd')
radialGradient.addColorStop(0.8, '#f084fd')
radialGradient.addColorStop(1, '#f683fc')
ctx.arc(100, 200, 60, 0, 2 * Math.PI)
ctx.fillStyle = radialGradient
ctx.fill()
变形:针对的是整个画布
translate位移 rotate 旋转 scale放大
save保存变形之前的状态
restore回到保存之前的状态