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>Document</title>
    <style>
        /* body {
            background-color: #000;
        }

        .box {
            height: 300px;
            width: 300px;
            background-color: #00ff78;
            margin: 200px auto;
            padding: 40px;
            filter: blur(2px)
        }

        .box1 {
            height: 300px;
            width: 300px;
            background-color: #fff;
            border-radius: 50%;
        } */
    </style>
</head>

<body>
    <!-- <div class="box">
    </div>
    <div class="box1"></div> -->


    <canvas id="canvas" width="500" height="500" style="box-shadow: 0px 0px 5px #ccc; border-radius: 10px;"></canvas>
     
    <script>
        let canvas = document.getElementById('canvas')
        let ctx = canvas.getContext("2d")
         
        // 线条
        // ctx.moveTo(50, 50); // 设置初始位置,参数为初始位置x和y的坐标点
        // ctx.lineTo(200, 200); // 绘制一条从初始位置到指定位置的直线,参数为指定位置x和y的坐标点
        // ctx.lineTo(200, 50);
        // ctx.lineTo(50, 50);
        // ctx.stroke(); // 通过线条来绘制图形轮廓
        // ctx.fill(); // 通过填充路径的内容区域生成实心的图形

        // 矩形
        // ctx.strokeRect(50, 50, 300, 50) // 绘制一个矩形的边框 (x, y, width, height) x和y 是矩形的起点坐标
        // ctx.fillRect(50, 50, 300, 50) // 绘制一个填充的矩形 (x, y, width, height)  x和y 是矩形的起点坐标
        // ctx.clearRect(50, 50, 200, 50) // 清除指定矩形区域 (x, y, width, height) 让清除部分完全透明,x和y 是矩形的起点坐标,width和height 是矩形的宽高


        // 圆
        // arc(x, y, radius, startAngle, endAngle, anticlockwise)。x和Y为圆心的坐标,radius为半径,startAngle为圆弧或圆的开始位置,endAngle为圆弧或圆的结束位置,anticlockwise是绘制的方向(不写默认为false,从顺时针方向)
        // 弧度 =  (Math.PI / 180) * 角度。 Math.PI 相当于180 度
        // ctx.arc(60, 60, 50, 5, Math.PI, true);
        // ctx.stroke(); 

        // ctx.beginPath() // 新建一条路径,生成之后,图形绘制命令被指向到路径上。
        // ctx.closePath() // 闭合路径之后图形绘制命令又重新指向到上下文中
        // 咱们开启和关闭路径的时候,关闭路径其实并不是必须的,对于新路径其实每次都开启新路径就ok。



        // 椭圆 
        // ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise)
        // x、y:椭圆的圆心位置  
        // radiusX、radiusY:x轴和y轴的半径   
        // rotation:椭圆的旋转角度,以弧度表示
        // startAngle:开始绘制点
        // endAngle:结束绘制点
        // anticlockwise:绘制的方向(默认顺时针),可选参数。



        // 贝塞尔曲线
        // 二次贝塞尔曲线
        // quadraticCurveTo(cp1x, cp1y, x, y),其中cp1x和cp1y为一个控制点,x和y为结束点

        // 三次贝塞尔曲线
        // ctx.bezierCurveTo(cp1x,cp1y, cp2x,cp2y, x, y),其中cp1x和cp1y为一个控制点,cp2x和cp2y为第二个控制点,x和y为结束点



        // 设置线条样式  
        // lineWidth 设置当前绘线的粗细。属性值必须为正数。默认值是 1.0。
        // lineCap 设置线段端点显示的样子。可选值为:butt,round 和 square。默认是 butt。
        // lineJoin 该属性可以设置两线段连接处所显示的样子。可选值为:round, bevel 和 miter。默认是 miter。
        // miterLimit 限制当两条线相交时交接处最大长度;所谓交接处长度(斜接长度)是指线条交接处内角顶点到外角顶点的长度
        // 绘制一条宽度为10的直线
        // ctx.beginPath()
        // ctx.lineWidth = 10;
        // ctx.moveTo(50, 20);
        // ctx.lineTo(250, 20);
        // ctx.stroke();
        // ctx.closePath();
        // // 绘制一条宽度为20的直线
        // ctx.beginPath()
        // ctx.lineWidth = 20;
        // ctx.lineCap='square'
        // ctx.lineJoin='bevel'
        // ctx.miterLimit = 10
        // ctx.moveTo(50, 50);
        // ctx.lineTo(250, 250);
        // ctx.lineTo(500, 50);
        // ctx.stroke();
        // ctx.closePath();


        // setLineDash 可以设置当前虚线样式。
        // getLineDash 则是返回当前虚线设置的样式,长度为非负偶数的数组。
        // ctx.setLineDash([5, 10, 20, 40]);
        // console.log(ctx.getLineDash()); // [5, 10, 20, 40]

        // 透明度
        // ctx.globalAlpha = 0.5;
        


        // 线性渐变 
        // createLinearGradient(x1, y1, x2, y2),参数分别为 起点的坐标和终点的坐标。
        // 在渐变的设置中还需要一个方法来添加渐变的颜色,语法为:gradient.addColorStop(offset, color),其中color就是颜色,offset 则是颜色的偏移值,只为0到1之间的数
        // 创建渐变
        // var gradient1 = ctx.createLinearGradient(10, 10, 400, 10);
        // gradient1.addColorStop(0, "#00ff00");
        // gradient1.addColorStop(1, "#ff0000");
        // var gradient2 = ctx.createLinearGradient(10, 10, 400, 10);
        // // 从0.5的位置才开始渐变
        // gradient2.addColorStop(0.5, "#00ff00");
        // gradient2.addColorStop(1, "#ff0000");
        // ctx.beginPath()
        // ctx.fillStyle = gradient1;
        // ctx.fillRect(10, 10, 400, 100);
        // ctx.beginPath();
        // ctx.fillStyle = gradient2;
        // ctx.fillRect(10, 150, 400, 100);

        // 径向渐变
        // ctx.createRadialGradient(x0, y0, r0, x1, y1, r1),参数分别为开始圆的坐标和半径以及结束圆的坐标和半径。


        // 图案样式
        // Canvas中想绘制图案效果,需要用 createPattern 方法来实现
        // createPattern(image, type),参数分别为:Image 参数可以是一个 Image 对象,也可以是一个 canvas 对象,Type 为图案绘制的类型,可用的类型分别有:repeat,repeat-x,repeat-y 和 no-repeat
        // var img = new Image();
        // img.src = "./image.png";
        // img.onload = function() {
        //     // 图片加载完以后
        //     // 创建图案
        //     var ptrn = ctx.createPattern(img, 'no-repeat');
        //     ctx.fillStyle = ptrn;
        //     ctx.fillRect(0, 0, 500, 500);
        // }

        // 绘制文本
        // strokeText(描边)
        // ctx.strokeText(text, x, y, maxWidth) 参数分别为:text:绘制的文案 x、y:文本的起始位置  maxWidth:可选参数,最大宽度。需要注意的是当文案大于最大宽度时不是裁剪或者换行,而是缩小字体。
        // ctx.strokeText("Canvas 详解", 50, 50);


        // fillText(填充)
        // ctx.fillText(text, x, y, maxWidth) 参数分别为:text:绘制的文案 x、y:文本的起始位置  maxWidth:可选参数,最大宽度。需要注意的是当文案大于最大宽度时不是裁剪或者换行,而是缩小字体。
        // ctx.fillText("Canvas 详解", 50, 50);


        // 文本样式
        // font 用于绘制文本的样式。默认的字体是 10px sans-serif。
        // textAlign  文本对齐的方式。可选值为:left、right、center、start和end。默认值是 start。
        // direction  文本的方向。可选值为:ltr(文本方向从左向右)、rtl(文本方向从右向左)、inherit(根据情况继承 Canvas元素或者 Document 。)。默认值是 inherit。
        // textBaseline  基线对齐选项,决定文字垂直方向的对齐方式。可选值为:top、hanging、middle、alphabetic、ideographic和bottom。默认值是 alphabetic。
        // ctx.font = "30px serif"; // 设置文案大小和字体
        // ctx.direction = "ltr"; // 文本方向从左向右
        // ctx.textAlign = "left"; // 左对齐

        // measureText 测量文本,返回一个 TextMetrics对象。
        // var ctx = canvas.getContext('2d');
        // ctx.font = "30px serif"; // 设置文案大小和字体
        // ctx.beginPath();
        // ctx.strokeText("Hi Canvas !", 150, 100);
        // var text = ctx.measureText("Hi Canvas !");
        // console.log("🚀 ~ 文案宽度:", text.width)
        // ctx.beginPath();
        // // 设置了文案最大宽度
        // ctx.strokeText("Hi Canvas !", 150, 200, 100);
        // var text1 = ctx.measureText("Hi Canvas !");
        // console.log("🚀 ~ 文案宽度:", text1.width)


        // 阴影
        // shadowOffsetX、shadowOffsetY
        // shadowOffsetX 和 shadowOffsetY 用来设定阴影在 X 和 Y 轴的延伸距离,它们是不受变换矩阵所影响的。负值表示阴影会往上或左延伸,正值则表示会往下或右延伸,它们默认都为 0。
        // shadowBlur: shadowBlur 用于设定阴影的模糊程度,其数值并不跟像素数量挂钩,也不受变换矩阵的影响,默认为 0。
        // shadowColor: shadowColor 是标准的 CSS 颜色值,用于设定阴影颜色效果,默认是全透明的黑色。
        // ctx.font = "50px serif"; // 设置文案大小和字体
        // ctx.shadowColor = "#cccccc"; //  设置阴影颜色
        // ctx.fillStyle = "#ee7934"; //  设置填充颜色
        // ctx.shadowOffsetX = 10; // X轴上的阴影
        // ctx.shadowOffsetY = 10; // Y轴上的阴影
        // ctx.shadowBlur = 5; // 阴影的模糊程度
        // ctx.fillText("Hi Canvas !", 100, 50);
        // ctx.fillRect(100, 100, 200, 100);
        // ctx.shadowOffsetX = -10;
        // ctx.shadowOffsetY = -10;
        // ctx.shadowBlur = 5;
        // ctx.fillText("Hi Canvas !", 100, 300);
        // ctx.fillRect(100, 350, 200, 100);
        

        // 绘制图片
        // drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight):只有单纯的绘制功能,可以绘制图片、视频和别的Canvas对象等。
        // image:绘制到上下文的元素。
        // sx、sy:裁剪框的左上角X轴坐标和Y轴坐标。
        // sWidth、sHeight:裁剪框的宽度和高度。
        // dx、dy:绘制到上下文的元素,在上下文中左上角的X轴坐标和Y轴坐标。
        // dWidth、dHeight:绘制到上下文的元素,在上下文中绘制的宽度和高度。如果不说明,在绘制时image宽度和高度不会缩放。
        // var img = new Image();
        // img.src = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20191212%2F556cc408058d4c64a46468761406afe6.png&refer=http%3A%2F%2F5b0988e595225.cdn.sohucs.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1660103116&t=8dd0c641e1e1890fa65ee80dfa428d34';
        // img.onload = function(){
        //   ctx.drawImage(img, 0, 0);
        // }

        // 状态的保存和恢复
        // save() 和 restore() 方法是用来保存和恢复 canvas 状态的,方法不需要参数。可以理解为就是对canvas 状态的快照进行保存和恢复。
        // ctx.fillStyle = "#cccccc";
        // ctx.fillRect(10, 10, 300, 100);
        // ctx.save(); // 保存状态
        // ctx.fillStyle = "#ee7034";
        // ctx.fillRect(10, 150, 300, 100);
        // ctx.restore(); // 还原到上次保存的状态
        // ctx.fillRect(10, 300, 300, 100);
         
        // 移动、旋转和缩放

        // 移动:translate(x, y) ,x 是左右偏移量,y 是上下偏移量。
        // 旋转:rotate(angle),angle是旋转的角度,它是顺时针旋转,以弧度为单位的值。
        // 缩放:scale(x, y),x 为水平缩放的值,y 为垂直缩放得值。x和y的值小于1则为缩小,大于1则为放大。默认值为 1。

      
    </script>

    <!-- <input id="aa" multiple type="file">
    <script>
        document.getElementById("aa").onchange = function (e) {
                 console.log(e)
        }
    </script> -->
</body>

</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容