2017-08-04 295 views
0

我试图用大点创建带有进度条的svg路径。我如何使用纯粹的基于html5/css的解决方案来实现它?用箭头填充带有箭头的svg路径作为头

enter image description here

这是我到目前为止有:https://jsfiddle.net/fldeveloper/rLh2sr7u/

相关的代码是:

<div class="wrapper"> 
         <div class="progress progress1" value="8" style="position: relative;"><svg viewBox="0 0 100 100" style="display: block; width: 100%;"><path d="M 50,50 m 0,-48.5 a 48.5,48.5 0 1 1 0,97 a 48.5,48.5 0 1 1 0,-97" stroke="#eee" stroke-width="1" fill-opacity="0"/><path d="M 50,50 m 0,-48.5 a 48.5,48.5 0 1 1 0,97 a 48.5,48.5 0 1 1 0,-97" stroke="#55b9e6" stroke-width="3" fill-opacity="0" style="stroke-dasharray: 304.777, 304.777; stroke-dashoffset: 60.9554; stroke-linecap: round;"/></svg><div class="progressbar-text" style="position: absolute; left: 50%; top: 50%; padding: 0px; margin: 0px; transform: translate(-50%, -50%); color: rgb(85, 185, 230);">8/10</div></div> 

         </div> 
+0

你的问题有点混乱。如果你不使用Javascript,你将如何更新进度条? 也许你的意思是它是在服务器上生成的纯粹静态的进度条?如果是这样的话,那么为什么你不能在你需要的地方绘制一个蓝色圆圈到SVG? –

+0

@PaulLeBeau你说得对,它不能纯粹是HTML5/CSS,但也需要JavaScript。我正在使用progressbarjs来绘制一些动画进度条。我唯一的问题是我无法在盘旋线上画点。由于它不在其发展范围之内,我认为它必须用SVG图形来完成。我认为我可以在SO上得到一些关于这方面的指导。 – user869375

回答

1

Herre是一个CSS的解决方案,转一圈到正确的地方,有一个CSS transition用于动画目的。我将动态部分链接到单选按钮状态,但这不仅仅是概念验证的诡计。

请注意,我已经加宽了一点以适应圆圈标记的大小。

.progress { 
 
    position: relative; 
 
} 
 

 
.progressbar-back { 
 
    stroke: #eee; 
 
    stroke-width: 1; 
 
    fill: none; 
 
} 
 
.progressbar-line { 
 
    stroke: #55b9e6; 
 
    stroke-width: 3; 
 
    fill: none; 
 
    stroke-linecap: round; 
 
    transform: rotate(-90deg); 
 
    transform-origin: 50px 50px; 
 
    stroke-dasharray: 304.777px, 304.777px; 
 
    stroke-dashoffset: 304.777px; 
 
    transition: stroke-dashoffset 1s ease; 
 
} 
 
.progressbar-marker { 
 
    fill: #55b9e6; 
 
    transform-origin: 50px 50px; 
 
    transform: rotate(0deg); 
 
    transition: transform 1s ease 
 
} 
 
.progressbar-text { 
 
    position: absolute; 
 
    width: 200px; 
 
    text-align: center; 
 
    top: 90px; 
 
    font-size: 20px; 
 
    color: rgb(85, 185, 230); 
 
} 
 

 
input#r1:checked ~ .progress .progressbar-marker { transform: rotate(0deg) } 
 
input#r2:checked ~ .progress .progressbar-marker { transform: rotate(90deg) } 
 
input#r3:checked ~ .progress .progressbar-marker { transform: rotate(180deg) } 
 
input#r4:checked ~ .progress .progressbar-marker { transform: rotate(270deg) } 
 
input#r5:checked ~ .progress .progressbar-marker { transform: rotate(360deg) } 
 

 
input#r1:checked ~ .progress .progressbar-line { stroke-dashoffset: 304.777px } 
 
input#r2:checked ~ .progress .progressbar-line { stroke-dashoffset: 228.582px } 
 
input#r3:checked ~ .progress .progressbar-line { stroke-dashoffset: 152.388px } 
 
input#r4:checked ~ .progress .progressbar-line { stroke-dashoffset: 76.194px } 
 
input#r5:checked ~ .progress .progressbar-line { stroke-dashoffset: 0px } 
 

 
input#r1:checked ~ .progress .progressbar-text::before { content: "0" } 
 
input#r2:checked ~ .progress .progressbar-text::before { content: "1" } 
 
input#r3:checked ~ .progress .progressbar-text::before { content: "2" } 
 
input#r4:checked ~ .progress .progressbar-text::before { content: "3" } 
 
input#r5:checked ~ .progress .progressbar-text::before { content: "4" }
<div class="wrapper"> 
 
    <input id="r1" type="radio" name="progress" checked> 0/4 
 
    <input id="r2" type="radio" name="progress"> 1/4 
 
    <input id="r3" type="radio" name="progress"> 2/4 
 
    <input id="r4" type="radio" name="progress"> 3/4 
 
    <input id="r5" type="radio" name="progress"> 4/4 
 
    <div class="progress progress1" value="8"> 
 
     <svg viewBox="-5 -5 110 110" width="200px"> 
 
      <circle class="progressbar-back" r="48.5" cx="50" cy ="50"/> 
 
      <circle class="progressbar-line" r="48.5" cx="50" cy ="50" /> 
 
      <circle class="progressbar-marker" r="6" cx="50" cy="1.5" /> 
 
     </svg> 
 
     <div class="progressbar-text">/4</div> 
 
    </div> 
 
</div>

在现实生活你可能会设置在支持JavaScript的各元素的style属性。动画本身不需要脚本,只需设置值即可。

var full = 4 

function setProgress (value) { 
    document.querySelector('.progress .progressbar-marker') 
     .style.transform = 'rotate(' + (360 * value/full) + 'deg)'; 
    document.querySelector('.progress .progressbar-line') 
     .style['stroke-dashoffset'] = 'rotate(' + (304.777 * (1 - value/full)) + 'px'; 
    document.querySelector('.progress .progressbar-text') 
     .innerHTML = value + "/" + full; 
} 
+0

它看起来非常好,几乎通过我想要的一半。你能告诉我怎样才能在这个循环的进度条上加点圆点? – user869375

+0

完成,假定需要动画的是浏览器中目标值的变化 – ccprog