2D/3D视图变换、canvas画布

1,2D图形变换

图形变换主要通过transform css属性来达到图形的旋转、平移、和缩放

  • 旋转 旋转中心(基准点)为中心点,deg是角度制单位 transform: rotate(45deg);
  • 缩放 缩放中心(基准点)为中心点,一个值表示宽高等比例缩放,两个值分别表示宽和高。 transform: scale(0.5);
  • 平移, transform: translate(-10px, 10px);
  • 倾斜,两个值分别表示y轴和x轴的倾斜角度 transform: skew(30deg, 30deg)
  • 改变基准点 transform-origin

先旋转再平移和先平移再旋转,最终结果不同的原因:图形旋转时,其坐标轴也同时发生旋转,所以先旋转再平移会沿着旋转后的轴向移动

div:nth-child(5){
            /* 5, 先向下平移300px再旋转45deg*/
            transform: translate(0px, 300px) rotate(45deg); 
        }
        div:nth-child(6){
            /* 6, 先旋转-45deg,再向下平移300px*/
            transform: rotate(-45deg) translate(0px, 300px); 
        }
  /* transform视图变换的基准点是中心点center */
        div{
            transform-origin: right top;
        }

2,3D图形变换

3d图形变换就是给父标签设置景深后,才会有旋转效果。

  • prerspective 景深,相机/眼睛和拍摄物品间的距离,默认无穷大。景深要设置给舞台元素,也就是视图变换的父元素
  • 给父标签设置景深后,视图变换的元素的子元素没有3D效果,原因是 景深只针对子标签有效果,子标签的子标签无效,此时可通过transform-style把3D效果向下传递给子标签即可
        main {
            width: 500px;
            height: 500px;
            border: 1px solid;
            margin: auto;
            /* perspective 景深,相机/眼睛和拍摄物品间的距离,默认无穷大 */
            /* 注意:景深要设置给舞台元素,指的就是视图变换的父元素 */
            perspective: 500px;
        }
        
        div {
            width: 300px;
            height: 300px;
            background-color: red;
            margin: 100px;
            transform: rotateX(0deg);
            transition: 1s;
            padding: 70px;
            box-sizing: border-box;
            /* 给父标签main设置景深后,div有3d效果,但是div的子标签section没有3D效果
            原因是 景深只针对子标签(div)有效果,子标签的子标签无效,
            此时可通过transform-style把3D效果向下传递给子标签即可
            */
            transform-style: preserve-3d;
        }

3,canvas画布

3.1 canvas基础语法

**canvas是行内块类型标签,样式类似于图片。**canvas是html5新增的一个标签,用于在网页上绘制图形。canvas标签需要使用js语法绘制图形。

3.1.1 实现canvas语法提示
        /** @type {HTMLCanvasElement}  */
3.1.2 js语法绘制图形步骤
  • 首先找到canvas标签

  • 使用canvas标签创建一个绘图对象,然后使用这个对象绘图

            var canvas = document.getElementById("canvas");
            var ctx = canvas.getContext("2d");
    

注意:

1,canvas绘制图形时,所有的坐标尺寸都不加单位,因为长度单位不是像素点px,单位是canvas内部的独立坐标系值,通过标签属性width和height设置,通过标签属性设置canvas的宽高不会拉伸变形

2,设置canvas的宽高不要使用css设置,会拉伸变形。通过设置标签属性设置宽高不会拉伸变形

3.1.3 绘制一个矩形

矩形包括线框矩形、填充矩形、清除矩形。

  • 线框矩形:前两个参数是左上角坐标,后两个参数是宽高
  • 填充矩形:实心矩形
  • 清除矩形:清理矩形区域内的所有图形
        // 线框矩形,前两个参数是左上角组表,后两个参数是宽高
        ctx.strokeRect(30, 30, 100, 100);
        // 填充矩形,实心矩形   
        ctx.fillRect(160, 30, 100, 100);
        // 清除矩形,清理矩形区域内的所有图形
        ctx.clearRect(80, 60, 150, 40);
3.1.4 绘制线段
  • 把画笔移动到起点 moveTo
  • 画线段到终点 lineTo
  • 如果上条线的终点和下一条线的起点重合,可省略下条线的起点
  • 线段的绘制需要使用stroke函数来执行,执行绘制线段,需要把所有的点设置之后再执行
        ctx.moveTo(100, 150); //把画笔移动到起点,100,150这个坐标点
        ctx.lineTo(100, 200); //画线段到终点

        // ctx.moveTo(100, 200); //把画笔移动到起点,
        ctx.lineTo(150, 200); //画线段到终点


        // ctx.moveTo(150, 200); //如果上条线的终点和下一条线的起点重合,可省略
        ctx.lineTo(150, 150); //画线段到终点 
		ctx.strokeStyle = "red" //设置线颜色,注意在stroke之前设置
        ctx.lineWidth = "15"
        ctx.lineJoin = "round" //折线拐角类型,平滑类型
        ctx.stroke(); //执行绘制线段,需要把所有的点设置之后再执行
        // ctx.closePath(); //闭合绘制路径,把起点和终点连接起来
3.1.5 绘制圆形

绘制圆形之前要设置beginPath重新开始一个绘制路径,避免上下相连

  • arc设置圆形属性,圆心横坐标,圆心纵坐标,半径,开始角度,结束角度
  • stroke 执行绘制线段,绘制一个线框圆
  • fillStyle 设置填充颜色
  • fill 执行绘制实心圆
        ctx.beginPath(); //重新开始一个绘制路径,避免上下相连
        // (圆心横坐标,圆心纵坐标,半径,开始角度,结束角度)
        ctx.arc(200, 400, 50, 0, Math.PI * 2); //先设置原型属性
        ctx.stroke(); //执行绘制线段,绘制一个线框圆
        ctx.fillStyle = "blue"; //设置填充颜色
        ctx.fill(); //执行绘制实心圆
3.1.6 绘制曲线
  • lineWidth 设置线的粗细
  • 设置二次曲线:先通过moveTo把画笔移动到曲线起点,然后再通过quadraticCurveTo 设置二次曲线,最后通过stroke绘制二次曲线
  • 设置三次曲线:先通过moveTo把画笔移动到曲线起点,然后再通过bezierCurveTo 设置三次曲线,最后通过stroke绘制三次曲线
     ctx.beginPath() //重新开始一个绘制路径,避免上下相连
        ctx.lineWidth = "3"
        ctx.moveTo(30, 230) //把画笔移动到曲线起点
        ctx.quadraticCurveTo(0, 300, 230, 300); //设置二次曲线
        ctx.stroke(); //绘制二次曲线

        ctx.moveTo(30, 330) //把画笔移动到曲线起点
        ctx.bezierCurveTo(0, 600, 300, 0, 300, 350) //设置三次曲线
        ctx.stroke() //绘制三次曲线
3.1.7 绘制文字
  • textBaseLine 设置文字的基准点
  • font 设置字体,不能只设置尺寸,还要设置字体
  • strokeText 空心描边字体,第一个参数是文字内容,第二个参数是坐标
  • fillText 实心描边字体,第一个参数是文字内容,第二个参数是坐标
        ctx.textBaseline = "top" //先设置文字以左上为基准点
        ctx.font = "100px 黑体" //设置字体,不能只设置尺寸
        ctx.strokeText("ganyu", 0, 0) //空心描边字体
        ctx.fillText("你好", 10, 100)
3.1.8 绘制图片
  • drawImage:绘制图片
        document.getElementById("img").onload = function() {
            this.style.display = "none" //隐藏img标签
            ctx.drawImage(this, 10, 290, 100, 100) //绘制图片
        }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值