canvas在刻度直尺上实现可拖动的时间指针效果

效果图:
在这里插入图片描述
html代码:

 <style>
   .line-wrapper {
        width: 700px;
        position: relative;
        margin: 10px 0;
    }
    .line {
        position: absolute;
        padding-left: 5px;
        height: 120px;
        top: 0;
        cursor: ew-resize;
        left: 0;
        border-left: 1px solid #f00;
    }
</style>

<div class="line-wrapper">
  <canvas class="canvas-ruler" id="canvasRuler"></canvas>
  <div class="line" id="canvasLine"></div>
</div>
<div id="timeValue"></div>

思路: 用canvas实现画刻度线和文字,然后添加直线的拖动监听事件

<script type="text/javascript">
    const canvas = document.getElementById('canvasRuler');
    canvas['width'] = canvas.parentNode.clientWidth;
    canvas['height'] = canvas.parentNode.clientHeight;
    let step = 5;

    defineRulers(canvas,step);


    function defineRulers(canvas, step) {

        const ctx = canvas.getContext('2d');
        let _this = '';

        function Ruler(props){
            this.step = step || 5 // 步进
            this.width = props.width || 1000
            this.color = props.color || '#686868'
            this.seg = Math.floor(this.width / this.step) // 刻度段数
        }
        Ruler.prototype.draw = function(ctx) {
            _this = this;
            ctx.fillStyle = this.color
            ctx.strokeStyle = this.color
            ctx.lineWidth = 1
            ctx.beginPath()
            for (let i = 0; i < this.width; i += this.step) {
                ctx.moveTo(i, 0)
                if (i % this.step == 0) {
                    if (i % (this.step * 10) == 0) {
                        ctx.lineTo(i, 20)
                    } else {
                        ctx.lineTo(i, 10)
                    }
                }
            }
            ctx.closePath()
            ctx.stroke()
        }
        Ruler.prototype.drawText = function(ctx) {
            //添加体重数字
            ctx.beginPath();
            ctx.font = "14px Arial";
            ctx.fillStyle =  "#333";
            ctx.textAlign = "left";
            ctx.textBaseline = "middle";
            console.log(this.step,this.width)
            for (let i = 0; i < this.width; i += this.step) {
                ctx.moveTo(i, 0)
                if (i % this.step == 0) {
                    if (i % (this.step * 10) == 0) {
                        ctx.fillText(i/(step * 10) + 's',i,32);
                    }
                }
            }
            ctx.closePath()
            ctx.stroke()
        }
        const ruler = new Ruler({
            width: canvas.width
        })
        ruler.draw(ctx)
        ruler.drawText(ctx)
    }



    const line = document.getElementById('canvasLine');
    let offsetLeft = line.offsetLeft;
    let startX = 0;
    const mouseDownHandler = function(e) {
        startX = e.x;
        document.addEventListener('mousemove', mouseMoveHandler)
    }
    const mouseUpHandler = function(e) {
        document.removeEventListener('mousemove', mouseMoveHandler);
        document.removeEventListener('mouseup', mouseUpHandler);
        offsetLeft = line.offsetLeft;
    }
    const mouseMoveHandler = function(e) {
        let leftPx = offsetLeft + e.x - startX;
        if(leftPx > canvas['width']){
            leftPx = canvas['width'];
        }
        if(leftPx <= 0){
            leftPx = 0;
        }
        line.style.left =leftPx + 'px';
        document.getElementById('timeValue').innerHTML = leftPx / (step * 10);
        document.addEventListener('mouseup', mouseUpHandler)
    }
    line.addEventListener('mousedown', mouseDownHandler);
</script>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用中的代码,可以看出实现canvas刻度效果的步骤如下: 1. 创建一个div容器,并设置其样式为"line-wrapper",宽度为700px,相对定位,上下边距为10px。 2. 在div容器中,创建一个canvas元素,并设置其样式为"canvas-ruler",id为"canvasRuler"。 3. 在div容器中,创建一个div元素,并设置其样式为"line",id为"canvasLine"。该div元素将用于绘制刻度线。 4. 创建一个div元素,id为"timeValue",用于显示刻度值。 通过canvas绘制刻度的具体步骤如下: 1. 获取canvas的上下文对象:var ctx = canvas.getContext("2d")。 2. 设置绘制刻度时的样式,如线的颜色、宽度等:ctx.strokeStyle = "#f00"; ctx.lineWidth = 1;。 3. 使用循环结构绘制刻度线,根据需要绘制的刻度数量和间隔,计算每个刻度的位置,使用ctx.moveTo()和ctx.lineTo()方法绘制刻度线。 4. 调用ctx.stroke()方法执行绘制。 以上是实现canvas刻度效果的一种方法,可以根据具体需求进行适当的修改和调整。1 #### 引用[.reference_title] - *1* [canvas刻度直尺实现拖动时间指针效果](https://blog.csdn.net/qq_37656005/article/details/115905205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值