如何创建SVG径向线

用户10043909

带有径向线和数字范围的简单 SVG 仪表我正在尝试使用范围为 0-100 的径向线和数字创建比例尺。这是我的代码:

<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<head>
    <title>SVG Gauge</title>
</head>
<style>
    #wrapper {
        position: relative;  
        margin: auto;
    }

    #meter {
        width: 100%; 
        height: 100%;
        transform: rotateX(180deg);
    }

    .circle {
        fill: none;
    }

    #mask {
        stroke: #404040; 
        stroke-width: 60;
    }

    .blackie {
        fill:none;
        stroke: #000000;
        stroke-width: 30;
    }

    .range { 
        stroke-width: 60; 
    }

    .scale {
        stroke: #cccccc;
    }

    #slider, #lbl {
        position: absolute;
    }

    #slider {
        cursor: pointer;
        left: 0;
        margin: auto;
        right: 0;
        top: 58%;
        width: 94%;
    }

    #lbl {
        background-color: #4B4C51; 
        border-radius: 2px;
        color: white;   
        font-family: 'courier new';
        font-size: 15pt;
        font-weight: bold;
        padding: 4px 4px 2px 4px;
        right: -48px;
        top: 57%;
    }

    #meter_needle {
        height: 40%;
        left: 0;
        margin: auto;
        position: absolute;
        right: 0;
        top: 10%;
        transform-origin: bottom center;
        transform: rotate(270deg);
    }

</style>

<body>
    <div id="wrapper">
        <svg id="meter">
            <g class="scale">
                <defs>
                    <linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="0%">
                        <stop offset="0%" style="stop-color:rgb(102, 102, 255);stop-opacity:1" />
                        <stop offset="100%" style="stop-color:rgb(204, 204, 255);stop-opacity:1" />
                    </linearGradient>
                </defs>
                <circle id="high" class="circle range" cx="50%" cy="50%" stroke="url(#grad)">
                </circle>
                <circle id="mask" class="circle" cx="50%" cy="50%">
                </circle>
                <circle id="low" class="blackie" cx="50%" cy="50%" r="360">
                </circle>
                <circle id="outline_ends" class="circle outline" cx="50%" cy="50%">
                </circle>
            </g>
        </svg>
        <img id="meter_needle" src="gauge-needle.svg" alt="">
        <input id="slider" type="range" min="0" max="100" value="0" />
        <label id="lbl" id="value" for="">0%</label>
    </div>
    <script>
        var r = 400;
        var circles = document.querySelectorAll('.circle');
        var total_circles = circles.length;
        for (var i = 0; i < total_circles; i++) {
            circles[i].setAttribute('r', r);
        }
        var meter_dimension = (r * 2) + 100;
        var wrapper = document.querySelector('#wrapper');
        wrapper.style.width = meter_dimension + 'px';
        wrapper.style.height = meter_dimension + 'px';

        var cf = 2 * Math.PI * r;
        var semi_cf = cf / 2;
        var z = 40 * Math.PI;

        document.querySelector('#outline_ends')
            .setAttribute('stroke-dasharray', 2 + ',' + (semi_cf - 2));
        document.querySelector('#high')
            .setAttribute('stroke-dasharray', semi_cf + ',' + cf);
        document.querySelector('#mask')
            .setAttribute('stroke-dasharray', semi_cf + ',' + cf);
        document.querySelector('#low')
            .setAttribute('stroke-dasharray', semi_cf - z + ',' + cf);

        var slider = document.querySelector('#slider');
        var lbl = document.querySelector("#lbl");
        var svg = document.querySelector('#meter');
        var high = document.querySelector('#high');
        var mask = document.querySelector('#mask');
        var low = document.querySelector('#low');
        var meter_needle = document.querySelector('#meter_needle');

        function range_change_event() {
            var percent = slider.value;
            var meter_value = semi_cf - ((percent * semi_cf) / 100);
            mask.setAttribute('stroke-dasharray', meter_value + ',' + cf);
            meter_needle.style.transform = 'rotate(' + (270 + ((percent * 180) / 100)) + 'deg)';
            lbl.textContent = percent + '%';
        }
        slider.addEventListener('input', range_change_event);
    </script>
</body>

</html>

我在网上找到了很多很好的例子,包括 HTML 画布和 D3js,但没有基于 SVG 的。我想创建一个元素“线”并将它添加到黑色弧线上。创建数字刻度的最简单方法是什么?

海安会

干得好:

    <svg xmlns="http://www.w3.org/2000/svg" viewBox="-250 -250 500 500" width="500" height="500" id="svg">
      <defs>
        <style>
            line {
                stroke: black;
                stroke-width: 1px;
            }

            text {
                fill: red;
                text-anchor: middle;
                font-size: 16px;
                font-family: sans-serif;
            }

            rect {
                fill: transparent;
            }

            #id {
                display: none;
            }

            .origin {
                fill: green;
            }

            .outer {
                fill: none;
                stroke: black;
            }
        </style>
      </defs>

        <circle r="5" cx="0" cy="0" class="origin"/>
        <path d="M-180,0 a1,1 0 0,1 360,0" class="outer"/>

        <g id="gauge" transform="rotate(-90)">
            <g id="noon">
                <rect x="-10" y="-220" width="20" height="100"/>
                <line x1="0" y1="-190" x2="0" y2="-180"/>
                <text x="0" y="-200"></text>
            </g>
        </g>

    </svg>

    <script>
        for (i=0; i<=180; i = i + 18) {
            var new_tick = noon.cloneNode(true);
            new_tick.getElementsByTagName('text')[0].textContent = i/180 * 100;
            new_tick.removeAttribute("id");
            new_tick.setAttribute("transform", "rotate(" + i + " 0 0)");
            gauge.appendChild(new_tick);
        }
    </script>

我认为这是不言自明的。(例如,RECT 只是一个指南,您可以打开它 - 通过更改填充 - 如果您想更好地可视化每个 G 中的内容。)

如果您有任何后续问题,请告诉我。

这是一个 Codepen,如果有帮助的话:https ://codepen.io/MSCAU/pen/OoQMdV

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift - 按下时为按钮创建径向线

来自分类Dev

尝试创建具有6个径向线的圆形菜单

来自分类Dev

用径向线画一个圆

来自分类Dev

在SVG中创建线

来自分类Dev

如何在边界中创建径向渐变?

来自分类Dev

如何使用python创建透明的径向渐变?

来自分类Dev

如何描述从中心点径向向外移动的线?

来自分类Dev

如何描述从中心点径向向外移动的线?

来自分类Dev

如何使SVG线响应

来自分类Dev

无法创建 svg 线,但创建 svg 圆可以正常工作

来自分类Dev

Swift-如何创建非像素化的径向渐变?

来自分类Dev

如何用雅典创建线?

来自分类Dev

如何动态更改svg线的宽度

来自分类Dev

如何清除SVG线留下的痕迹?

来自分类Dev

如何摆脱重叠的svg形状的发际线

来自分类Dev

JavaFX创建透明的径向渐变

来自分类Dev

使用 CSS 创建径向图像

来自分类Dev

如何从节点和链接列表创建d3径向树?

来自分类Dev

ggplot如何创建成对的误差线

来自分类Dev

SVG径向渐变-移动焦点(中心)

来自分类Dev

如何制作径向技巧吧

来自分类Dev

如何使径向CCProgressTimer显示精灵

来自分类Dev

如何制作垂直的径向渐变

来自分类Dev

如何创建AngularJs svg指令

来自分类Dev

CSS3径向渐变显示为线

来自分类Dev

如何创建表面图的切片以创建线?(Matlab)

来自分类Dev

仅使用 javascript 创建径向菜单

来自分类Dev

创建 Canvas 径向(非从内到外)渐变

来自分类Dev

如何将linearGradient添加到垂直SVG线