用箭头填充带有箭头的svg路径作为头
问题描述:
我试图用大点创建带有进度条的svg路径。我如何使用纯粹的基于html5/css的解决方案来实现它?用箭头填充带有箭头的svg路径作为头
这是我到目前为止有: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>
答
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
你的问题有点混乱。如果你不使用Javascript,你将如何更新进度条? 也许你的意思是它是在服务器上生成的纯粹静态的进度条?如果是这样的话,那么为什么你不能在你需要的地方绘制一个蓝色圆圈到SVG? –
@PaulLeBeau你说得对,它不能纯粹是HTML5/CSS,但也需要JavaScript。我正在使用progressbarjs来绘制一些动画进度条。我唯一的问题是我无法在盘旋线上画点。由于它不在其发展范围之内,我认为它必须用SVG图形来完成。我认为我可以在SO上得到一些关于这方面的指导。 – user869375