首页 > 其他分享 >绘制刻度尺

绘制刻度尺

时间:2023-11-03 14:31:35浏览次数:27  
标签:center 刻度尺 height let timeline margin 绘制

绘制刻度尺_html

本文,我们将介绍两种方法来绘制刻度值:

  1. 使用 canvas 绘制
  2. 使用 div 绘制

我们将设定场景来讲解~

使用 canvas 绘制

实现均分尺子,如下图:

绘制刻度尺_前端_02

下面来讲解:

<div id="title">均分尺子</div>
<div id="content">
  <!-- 重点 -->
  <canvas id="canvas"></canvas>
  <div class="buttons">
    <button id="decrease">减少</button>
    <button id="increase">增加</button>
  </div>
</div>
<div id="controls">
  <span>Slider: </span>
  <input type="range" value="100" min="10" max="400" id="range"/>
</div>

添加点样式,让布局不至于碍眼~

html, body {
  padding: 0;
  margin: 0;
  height: 100%;
}
body {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  // transform: scale(0.5);
  // 可以通过 scale 进行缩放
}
#content {
  display: flex;
  justify-content: center;
  align-items: center;
  margin-top: 20px;
  margin-bottom: 20px;
  // transform: scale(0.5);
  // 可以通过 scale 进行缩放
  #canvas {
    background-color: transparent;
  }
  .buttons {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    margin-left: 12px;
    button {
      margin-top: 6px;
      margin-bottom: 6px;
    }
  }
}

#controls {
  display: flex;
  justify-content: center;
  align-items: center;
}

下面我们操作 javascript 实现功能(代码即文档):

window.onload = function() {
  let caculateWidth = 199; // 宽度计算
  let height = 288; // 高度固定(后期是计算)
  let heightDivide = 10; // 等分固定

  let paddingLeft = 20; // 左侧的预留
  let paddingRight = 10; // 右侧的预留

  let offset = 0; // 偏移的距离

  let cell = height / heightDivide; // 每个单元格之间的距离

  let canvasDom = document.getElementById('canvas'); // 获取画布
  let rangeDom = document.getElementById('range');
  rangeDom.addEventListener('change', changeSlider); // 监听 slider 的更改
  let context = canvasDom.getContext('2d'); // 获取画笔

  // 增加功能
  let increaseDom = document.getElementById('increase');
  increaseDom.addEventListener('click', () => {
    if(offset >= 25) return;
    offset += 1;
    draw(caculateWidth + paddingLeft + paddingRight)
  })
  // 减少功能
  let decreaseDom = document.getElementById('decrease');
  decreaseDom.addEventListener('click', () => {
    if(offset <= 0) return;
    offset -= 1;
    draw(caculateWidth + paddingLeft + paddingRight)
  })
  
  // 这部分是重点,对 canvas 进行操作
  context.strokeStyle = '#000';
  context.lineWidth = 1;
  context.font = 12;
  function draw(width) {
    canvasDom.width = width;
    canvasDom.height = height;
    context.clearRect(0, 0, width, height);
    
    // 水平线
    for(let i = 0; i < heightDivide; i += 1) {
      context.beginPath();
      context.moveTo(paddingLeft, i * cell + (cell / 2));
      context.lineTo(caculateWidth + paddingLeft, i * cell + (cell / 2));
      context.stroke();
      context.closePath();
    }
    // 垂直线
    for(let i = 0; i < heightDivide; i += 1) {
      context.beginPath();
      // 开始
      context.moveTo(paddingLeft, i * cell + (cell / 2) - 10);
      context.lineTo(paddingLeft, i * cell + (cell / 2) + context.lineWidth / 2);

      // 序号
      context.fillText(i + 1 + offset, 0, i * cell + (cell / 2));
      
      for(let j = 0; j < i + offset; j += 1) {
        context.moveTo(caculateWidth / (i + 1 + offset) * (j + 1) + paddingLeft, i * cell + (cell / 2) - 6);
        context.lineTo(caculateWidth / (i + 1 + offset) * (j + 1) + paddingLeft, i * cell + (cell / 2));
      }

      // 结尾
      context.moveTo(caculateWidth + paddingLeft, i * cell + (cell / 2) - 10);
      context.lineTo(caculateWidth + paddingLeft, i * cell + (cell / 2) + context.lineWidth / 2);
      context.stroke();
      context.closePath();
    }
  }
  draw(caculateWidth + paddingLeft + paddingRight);
  
  // slider 更改
  function changeSlider(event) {
    caculateWidth = parseInt(event.target.value);
    draw(caculateWidth + paddingLeft + paddingRight)
  }
}

上面的代码,其实可以进一步提炼,比如 25 ,可以设置为 const OFFSET_NUMBER = 25。感兴趣的读者可以对其进行优化。

使用 div 绘制

绘制时间线,如下:

绘制刻度尺_JavaScript_03

假设我们知道了开始的时间 10:10:13 - 其时间戳 diagramTimeFrameBegin1691806213000 和间隔的时间 20 分钟 - 即变量 fragmentTime20 * 60 * 1000 毫秒。

实现该 timeline,我们主要是使用了伪元素。

案例使用到了 angular 的语法

<div class="timeline" #timeline>
      <div class="horizontal-line begin-line">{{axisLabelFormatter(diagramTimeFrameBegin)}}</div>
      <div *ngFor="let item of timelineData" class="horizontal-line middle-line"
        [ngStyle]="{
          'left': cellWidth * (item.index + 1) + 'px'
        }"
      >{{axisLabelFormatter(item.timestamp)}}</div>
      <div class="horizontal-line end-line">{{axisLabelFormatter(diagramTimeFrameBegin + fragmentTime)}}</div>
  </div>

我们在 typescript 中对时间进行格式化:

import moment from "moment";
// format chart begin and end time
public formatChartTime(value: number): string {
    return moment(value).format('HH:mm:ss');
}

重点是下面的 css 对刻度线的绘制和布局:

.timeline {
  border-bottom: 1px solid #666;
  position: relative;
  height: 48px;
}
.timeline .horizontal-line {
  width: 100px;
  height: 48px;
  line-height: 48px;
  text-align: center;
  position: absolute;
  bottom: 0;
}
/*  绘制刻度 */
.timeline .horizontal-line:after {
  content: "";
  display: block;
  width: 1px;
  height: 10px;
  background-color: #000;
  margin-left: 50px;
  position: relative;
  bottom: 9px;
}
/* 居中对齐 */
.timeline .begin-line {
  left: 0;
  transform: translateX(-50%);
}
.timeline .middle-line {
  transform: translateX(-50%);
}
.timeline .end-line {
  right: 0;
  transform: translateX(50%);
}

是的,我们介绍的这两种绘制刻度尺的方法,在这两个案例中是可以互相转换的。我们可以使用 canva 来画图,也可以直接使用多 html 元素来布局。具体的业务具体分析。

【完】谢谢阅读~

标签:center,刻度尺,height,let,timeline,margin,绘制
From: https://blog.51cto.com/u_11966691/8169901

相关文章

  • 如何使用python 绘制圈圈大小相同的韦恩图
    百度之换数据,画之,就这么简单哦,如果要画大小一致的圈圈,只需要venn3.py里350代码改成如下即可:#areas=compute_venn3_areas(subsets,normalize_to)areas=compute_venn3_areas((1,1,1,1,1,1,1),normalize_to)importmatplotlib.pyplotaspltfrommatplotlib_vennimpor......
  • Jim Kalbach:3 个关键点与 4 个绘制步骤,直击客户体验可视化
    “你必须从客户体验出发,技术为之服务,而非相反。”在神策2023数据驱动大会现场,JimKalbach引用了SteveJobs的观点,并就客户体验对企业的价值做了深入分享。本文根据JimKalbach的完整分享整理。一、理解“体验”的3个关键点JimKalbach表示,在我们试图理解“体验”时,要明确......
  • 如何快速绘制网络拓扑图
    关于网络拓扑网络拓扑能直观明了的展示网络中各网元之间的关系,极大方便运维人员对网络进行实时监测、优化配置、故障排查等操作。传统采用Visiot或PowerPoint的方式存在耗时耗力且无法实现动态更新,维护及使用成本高;可展现的内容有限,拓扑展示形式单一,大屏展示效果差;无层次化的网络拓......
  • 阿基米德螺线和花瓣曲线的Python绘制
    frommatplotlibimportpyplotaspltimportnumpyasnpdefplt_draw_dynamic(x,y):foriinrange(x.shape[0]):plt.pause(0.001)plt.cla()plt.xlim((-200,200))plt.ylim((-200,200))plt.plot(x[:i],y[:i])......
  • echarts x轴下绘制表
    效果图: 把下面代码复制到官网实例的js代码编辑中即可预览(附连接:Examples-ApacheECharts)letmap={销售单价:[2200.0,4000.9,700.0,2003.2,2005.6,7006.7,10035.6,9602.2,3200.6,2000.0,1602.4,0],市场价:[2200.6,8005.9,900.0,2006.4,2008......
  • 绘制Cladogram的意义
    揭示亲缘关系:通过绘制cladogram,您可以了解不同根际微生物的亲缘关系,即它们之间的进化关系。这有助于确定这些微生物的共同祖先以及它们如何相互关联。群落结构:Cladogram可以帮助您理解根际微生物群落的结构和组成。您可以看到哪些微生物种类更接近于共同的祖先,以及它们如何彼此......
  • starUML用例图与活动图绘制及实例
    一.用例图1.starUML建立方法:工程区-->选择model右键-->选择AddDiagram中的UseCaseDiagram-->重命名该用例图 2.用例图四大组成:•参与者(Actor):是指外部用户或实体在系统中所扮演的角色(Role)。•用例:参与者在系统中执行的一个相关的动作序列,系统通过执行这一组动作序列为......
  • 用html 加css 绘制表格
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>/*头部样式定义*/.header{padding-bottom:10px;/*设置头部的下内边距*/......
  • Python 利用pandas 和 matplotlib绘制柱状图
    当你需要展示数据时,图表是一个非常有用的工具。Python中的pandas和matplotlib库提供了丰富的功能,可以帮助你轻松地绘制各种类型的图表。本文将介绍如何使用这两个库,绘制一个店铺销售数量的柱状图,并添加各种元素,如数据标签、图例、网格线等。准备工作在开始之前,你需要安装p......
  • [Python急救站]草莓熊的绘制
    草莓熊也是一个热门的图案,今天就用Pythonimportturtleast#设置背景颜色,窗口位置以及大小t.colormode(255)#颜色模式t.speed(0)t.screensize(850,760)t.setup(width=850,height=760,startx=None,starty=None)#绘图窗口的大小和起始坐标t.resizemode('nores......