虚线圆棒与百分比 [英] Dashed Circular Bar with Percentage
问题描述
我正在尝试制作一个带有虚线的圆形进度栏.我以编程方式创建stroke-dasharray
和stroke-dashoffset
来绘制一个带有百分比的圆.
I am trying to make a circular progress bar with dashed line. I programmatically create stroke-dasharray
and stroke-dashoffset
to draw a circle with percentage.
我需要绘制一个如下所示的虚线圆,而不是实心圆:
Instead of solid circle, I need to draw dashed circle which looks like this:
我无法将实心圆更改为虚线.我是否缺少某些东西?还是需要更改逻辑以绘制虚线圆圈?
I couldn't change solid circle to dashed one. Am I missing something or do I need to change my logic to draw dashed circle?
https://jsfiddle.net/6mu97jyL/
class CircularProgressBar extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
// Size of the enclosing square
const sqSize = this.props.sqSize;
// SVG centers the stroke width on the radius, subtract out so circle fits in square
const radius = (this.props.sqSize - this.props.strokeWidth) / 2;
// Enclose cicle in a circumscribing square
const viewBox = `0 0 ${sqSize} ${sqSize}`;
// Arc length at 100% coverage is the circle circumference
const dashArray = radius * Math.PI * 2;
// Scale 100% coverage overlay with the actual percent
const dashOffset = dashArray - dashArray * this.props.percentage / 100;
return (
<svg
width={this.props.sqSize}
height={this.props.sqSize}
viewBox={viewBox}>
<circle
className="circle-background"
cx={this.props.sqSize / 2}
cy={this.props.sqSize / 2}
r={radius}
strokeWidth={`${this.props.strokeWidth}px`} />
<circle
className="circle-progress"
cx={this.props.sqSize / 2}
cy={this.props.sqSize / 2}
r={radius}
strokeWidth={`${this.props.strokeWidth}px`}
transform={`rotate(-90 ${this.props.sqSize / 2} ${this.props.sqSize / 2})`}
style={{
strokeDasharray: dashArray,
strokeDashoffset: dashOffset
}} />
</svg>
);
}
}
CircularProgressBar.defaultProps = {
sqSize: 200,
percentage: 25,
strokeWidth: 10
};
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
percentage: 25
};
this.handleChangeEvent = this.handleChangeEvent.bind(this);
}
handleChangeEvent(event) {
this.setState({
percentage: event.target.value
});
}
render() {
return (
<div>
<CircularProgressBar
strokeWidth="10"
sqSize="200"
percentage={this.state.percentage}/>
<div>
<input
id="progressInput"
type="range"
min="0"
max="100"
step="1"
value={this.state.percentage}
onChange={this.handleChangeEvent}/>
</div>
</div>
);
}
}
ReactDOM.render(<App/>, document.getElementById('app'));
#app {
margin-top: 40px;
margin-left: 50px;
}
#progressInput {
margin: 20px auto;
width: 30%;
}
.circle-background,
.circle-progress {
fill: none;
}
.circle-background {
stroke: #ddd;
}
.circle-progress {
stroke: #F99123;
stroke-linecap: round;
stroke-linejoin: round;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.0/umd/react-dom.production.min.js"></script>
<div class="container">
<div class="text-center" id="app">
</div>
</div>
推荐答案
不确定这是否在您要查找的范围内. (下面的完整代码段/演示)
Not sure if this is somewhat in the range of what you are looking for. ( full snippet / demo below)
我不是该主题的专家,因此可能还有另一种选择(例如两个具有不同样式的半圆)-但这里要做的基本上是在实心圆上放置另一个圆,并确保它具有与页面相同的笔触颜色.然后,这将掩盖后面的圆的间隙(基本上隐藏了圆的一部分).
Im not an expert on this subject, so there might be another option (like two half circles with different styling) - but what is basically done here is to lay another circle on top of the solid circle, and make sure it has the same stroke color as the page. This will then mask over gaps of the circle behind, (basically hide parts of the circle).
<circle
className="circle-dashes"
cx={this.props.sqSize / 2}
cy={this.props.sqSize / 2}
r={radius}
strokeWidth={`${this.props.strokeWidth}px`}
style={{
strokeDasharray: "5 10" // Adjust the spacing here
}} />
css:
.circle-dashes {
stroke: #FFF;
fill: none;
}
并删除
stroke-linecap: round;
stroke-linejoin: round;
一些小的调整就可以满足您的需求,希望您能做到!
A few minor tweaks to fit your need, and hopefully you got it!
如果您以另一种背景色查看该应用程序,则更改可能会更加明显.
If you take a look at the app with another background color, the changes might be more obvious.
class CircularProgressBar extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
// Size of the enclosing square
const sqSize = this.props.sqSize;
// SVG centers the stroke width on the radius, subtract out so circle fits in square
const radius = (this.props.sqSize - this.props.strokeWidth) / 2;
// Enclose cicle in a circumscribing square
const viewBox = `0 0 ${sqSize} ${sqSize}`;
// Arc length at 100% coverage is the circle circumference
const dashArray = radius * Math.PI * 2;
// Scale 100% coverage overlay with the actual percent
const dashOffset = dashArray - dashArray * this.props.percentage / 100;
return (
<svg
width={this.props.sqSize}
height={this.props.sqSize}
viewBox={viewBox}>
<circle
className="circle-background"
cx={this.props.sqSize / 2}
cy={this.props.sqSize / 2}
r={radius}
strokeWidth={`${this.props.strokeWidth}px`} />
<circle
className="circle-progress"
cx={this.props.sqSize / 2}
cy={this.props.sqSize / 2}
r={radius}
strokeWidth={`${this.props.strokeWidth}px`}
// Start progress marker at 12 O'Clock
transform={`rotate(-90 ${this.props.sqSize / 2} ${this.props.sqSize / 2})`}
style={{
strokeDasharray: dashArray,
strokeDashoffset: dashOffset
}} />
<circle
className="circle-dashes"
cx={this.props.sqSize / 2}
cy={this.props.sqSize / 2}
r={radius}
strokeWidth={`${this.props.strokeWidth}px`}
style={{
strokeDasharray: "5 10"
}} />
</svg>
);
}
}
CircularProgressBar.defaultProps = {
sqSize: 200,
percentage: 25,
strokeWidth: 10
};
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
percentage: 25
};
this.handleChangeEvent = this.handleChangeEvent.bind(this);
}
handleChangeEvent(event) {
this.setState({
percentage: event.target.value
});
}
render() {
return (
<div>
<CircularProgressBar
strokeWidth="10"
sqSize="200"
percentage={this.state.percentage}/>
<div>
<input
id="progressInput"
type="range"
min="0"
max="100"
step="1"
value={this.state.percentage}
onChange={this.handleChangeEvent}/>
</div>
</div>
);
}
}
ReactDOM.render(
<App/>,
document.getElementById('app')
);
#app {
margin-top: 40px;
margin-left: 50px;
}
#progressInput {
margin: 20px auto;
width: 30%;
}
.circle-background,
.circle-progress {
fill: none;
}
.circle-background {
stroke: #ddd;
}
.circle-dashes {
stroke: #fff;
fill: none;
}
.circle-progress {
stroke: #F99123;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div class="container">
<div class="text-center" id="app">
</div>
</div>
这篇关于虚线圆棒与百分比的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!