没有画布的HTML线条画(只是JS)

Cra*_*man 13 javascript html5

我正在尝试使用HTML并在页面上绘制一条线.

从我读过的所有内容建议HTML5 canvas标签是最好用的,但是我需要连接到页面上不在canvas标签中的东西的行,所以画布对我不好(想要/需要使用原生JS) .

我写了(从我发现的东西)一个功能,它做我需要的但问题是一旦出现线,页面的其他一切都消失了.

我发现每次我改变JavaScript的风格,但形状都会消失.

删除"document.write"结束时没有任何消失.

function draw(ax, ay, bx, by) {
    var n, widthLine, i, x, y;
    widthLine = 1;
    if (Math.abs(ax - bx) > Math.abs(ay - by)) {
        if (ax > bx) {
            n = ax;
            ax = bx;
            bx = n;

            n = ay;
            ay = by;
            by = n;
        }
        n = (by - ay) / (bx - ax);

        for (i = ax; i <= bx; i++) {
            x = i;
            y = Math.round(ay + m * (x - ax));
            document.write("<div style='height:" + lineWidth + "px;width:" + widthLine + "px;background-color:black;position:absolute;top:" + y + "px;left:" + x + "px;'></div>");
        }
    } else {
        if (ay > by) {
            n = ax;
            ax = bx;
            bx = n;

            n = ay;
            ay = by;
            by = n;
        }
        n = (bx - ax) / (by - ay);

        for (i = ay; i <= by; i++) {
            y = i;
            x = Math.round(ax + n * (y - ay));
            document.write("<div style='height:" + lineWidth + "px;width:" + lineWidth + "px;background-color:black;position:absolute;top:" + y + "px;left:" + x + "px;'></div>");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Cra*_*aub 16

快速解决.

下面的函数获取该行的坐标,然后绘制它.

它的工作原理是使用细长的div元素.计算旋转角度和长度.

应该适用于所有浏览器(希望甚至是IE).

function linedraw(ax,ay,bx,by)
{
    if(ay>by)
    {
        bx=ax+bx;  
        ax=bx-ax;
        bx=bx-ax;
        by=ay+by;  
        ay=by-ay;  
        by=by-ay;
    }
    var calc=Math.atan((ay-by)/(bx-ax));
    calc=calc*180/Math.PI;
    var length=Math.sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
    document.body.innerHTML += "<div id='line' style='height:" + length + "px;width:1px;background-color:black;position:absolute;top:" + (ay) + "px;left:" + (ax) + "px;transform:rotate(" + calc + "deg);-ms-transform:rotate(" + calc + "deg);transform-origin:0% 0%;-moz-transform:rotate(" + calc + "deg);-moz-transform-origin:0% 0%;-webkit-transform:rotate(" + calc  + "deg);-webkit-transform-origin:0% 0%;-o-transform:rotate(" + calc + "deg);-o-transform-origin:0% 0%;'></div>"
}
Run Code Online (Sandbox Code Playgroud)

  • 调用你的方法两次将导致两个div具有相同的id (7认同)
  • 这样做的一个问题是,如果您尝试创建从左下角到右上角的行,则会生成错误的行.是的,我会将id更改为class.如果你也需要一个id,你可以很容易地在运行时给它一个动态id,由时间戳或你想要识别它的任何其他东西生成.我应该是独一无二的. (2认同)

Dav*_*ide 7

我刚刚开发了用纯 js + html 代码画线的版本。
首先,tan 函数定义在 0 到 180 度之间。如果 x2 大于 x1,我们将反转这些点(x2 变为 x1,x1 变为 x2)。
之后,我们检查这条线的长度(毕达哥拉斯定理)并测量斜率。通过斜率,我们可以计算辐射度。要转换为度数,我们将结果相乘,然后除以 3.14。
最后我们可以绘制一个高度为1px、宽度为lineLength的div。我们根据计算出的 div 旋转该 div。

function linedraw(x1, y1, x2, y2) {
    if (x2 < x1) {
        var tmp;
        tmp = x2 ; x2 = x1 ; x1 = tmp;
        tmp = y2 ; y2 = y1 ; y1 = tmp;
    }

    var lineLength = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
    var m = (y2 - y1) / (x2 - x1);

    var degree = Math.atan(m) * 180 / Math.PI;

    document.body.innerHTML += "<div class='line' style='transform-origin: top left; transform: rotate(" + degree + "deg); width: " + lineLength + "px; height: 1px; background: black; position: absolute; top: " + y1 + "px; left: " + x1 + "px;'></div>";
}
Run Code Online (Sandbox Code Playgroud)