canvas 案例实现

canvas

1. 是 HTML5 新增的元素,可用于通过使用 JavaScript 中的脚本来绘制图形。例如,它可以用于绘制图形,制作照片,创建动画,甚至可以进行实时视频处理或渲染。
2.Canvas 能干什么
图表
小游戏
活动页
特效
背景等
3.方法 描述
fill() 填充路径
stroke() 描边
arc() 创建圆弧
rect() 创建矩形
fillRect() 绘制矩形路径区域
strokeRect() 绘制矩形路径描边
clearRect() 在给定的矩形内清除指定的像素
arcTo() 创建两切线之间的弧/曲线
beginPath() 起始一条路径,或重置当前路径
moveTo() 把路径移动到画布中的指定点,不创建线条
lineTo() 添加一个新点,然后在画布中创建从该点到最后指定点的线条
closePath() 创建从当前点回到起始点的路径
clip() 从原始画布剪切任意形状和尺寸的区域
quadraticCurveTo() 创建二次方贝塞尔曲线
bezierCurveTo() 创建三次方贝塞尔曲线
isPointInPath() 如果指定的点位于当前路径中,则返回 true,否则返回 false

案例: 页面上或一条线

  methods: {
    canvas() {
      //1. 获取节点
      var myCanvas = document.getElementById("demo");
      //2.获取绘图工具箱-->即创建画笔
      var ctx = myCanvas.getContext("2d");
      //3.把画笔移动到起点
      ctx.moveTo(10, 10);
      //4.绘制直线-->画笔的终点
      ctx.lineTo(300, 300);
      //5.描边
      ctx.stroke();
     // 6 关闭当前的绘制路径
          cxt.closePath();
    },
  },
};

项目使用:

效果
5列选项,每列限选一个。
在这里插入图片描述

<template>
  <div class="custom-tree-container">
    <div class="marginBottom">
      <el-card>
        <div class="queryConditions">
          <div
            class="item"
            v-for="(item, index) in queryConditionsList"
            :key="item.code"
          >
            <div class="left-content">
              <div class="head-top">{{ item.name }}</div>
              <div class="content-bottom">
                <div
                  v-for="(item2, index2) in item.list"
                  :key="index2"
                  class="item"
                  @click="queryConditionsItemClick(index, index2)"
                >
                  {{ item2.name }}
                </div>
              </div>
            </div>
            <canvas
              style="width: 40px; height: 100%"
              :id="'canvas' + index"
              :key="'canvas' + index"
            ></canvas>
          </div>
        </div>
      </el-card>
    </div>
  </div>
</template>

<script>
let id = 1000;

export default {
  data() {
    return {
      activeName: "asphalt",
      queryConditionsList: [
        {
          name: "技术等级",
          code: "technicalGrade",
          list: [
            {
              name: "高速、一级公路",
              code: "11",
            },
            {
              name: "二、三四级公路",
              code: "12",
            },
          ],
        },
        {
          name: "交通量",
          code: "traffic",
          list: [
            {
              name: "重>=8000",
              code: "11",
            },
            {
              name: "中8000→3000",
              code: "12",
            },
            {
              name: "轻<3000",
              code: "13",
            },
          ],
        },
        {
          name: "PCI",
          code: "PCI",
          list: [
            {
              name: "优良>=90",
              code: "11",
            },
            {
              name: "中90→80",
              code: "12",
            },
            {
              name: "次差<80",
              code: "13",
            },
          ],
        },
        {
          name: "RQI",
          code: "RQI",
          list: [
            {
              name: "优良>=90",
              code: "11",
            },
            {
              name: "中90→80",
              code: "12",
            },
            {
              name: "次差<80",
              code: "13",
            },
          ],
        },
        {
          name: "PSSI",
          code: "PSSI",
          list: [
            {
              name: "高>=70",
              code: "11",
            },
            {
              name: "低<70",
              code: "12",
            },
          ],
        },
      ],
      queryConditions: [],
    };
  },

  methods: {
    queryConditionsItemClick(index, index2) {
      this.$set(this.queryConditions, index, index2);
      this.setQueryConditionsCanvas(index, index2);
    },
    setQueryConditionsCanvas(index, index2) {
      this.queryConditions.forEach((item, j) => {
        if (item != undefined) {
          var c = document.getElementById("canvas" + j);
          var cxt = c.getContext("2d");
          c.width = c.width;
          cxt.strokeStyle = "red";
          cxt.lineCap = "round";
          //注意,Canvas的坐标系是:Canvas画布的左上角为原点(0,0),向右为横坐标,向下为纵坐标,单位是像素(px)。
          //开始一个新的绘制路径
          cxt.beginPath();
          //定义直线的起点坐标为(10,10)
          cxt.moveTo(0, 55 + item * 40);
          //定义直线的终点坐标为(50,10)
          cxt.lineTo(300, 55 + this.queryConditions[j + 1] * 40);
          //沿着坐标点顺序的路径绘制直线
          cxt.stroke();
          //关闭当前的绘制路径
          cxt.closePath();
        }
      });
    },
  },
};
</script>

<style lang="less" scoped>
.queryConditions {
  display: flex;
  & > .item {
    width: 11.5%;
    display: flex;
    .left-content {
      flex: 1;
      .head-top {
        text-align: center;
        padding: 20px 0;
        color: #999;
        font-size: 20px;
      }
      .content-bottom {
        .item {
          border: 1px solid #903939;
          height: 50px;
          line-height: 50px;
          border-radius: 8px;
          text-align: center;
          margin-top: 15px;
          font-size: 15px;
          cursor: pointer;
          &:first-child {
            margin-top: 0;
          }
          &.active {
            color: red;
          }
        }
      }
    }
  }
}
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值