2013-01-08 43 views
76

我已经搜索了这个网站找到进度条,但是我已经能够找到的那些显示出完整的100%的动画圈。CSS Progress Circle

我希望它停止在某些百分比,如下面的屏幕截图。有没有什么办法可以做到这一点只使用CSS?

Circular progress bars

+0

我不是在寻找脚本,我正在寻找关于此的任何CSS3信息。 –

+5

没关系的措辞,“如何做Css进展圈?”这个问题。仍然有效。我认为这应该重新打开新的措辞,这个结果是第一次在搜索和包含过时的答案。 – Ciantic

+0

截图来自哪个网站? – DeveloperACE

回答

42

我创建使用only css小提琴。

HTML

<div class="wrapper" data-anim="base wrapper"> 
    <div class="circle" data-anim="base left"></div> 
    <div class="circle" data-anim="base right"></div> 
</div> 

CSS

.wrapper { 
    width: 100px; /* Set the size of the progress bar */ 
    height: 100px; 
    position: absolute; /* Enable clipping */ 
    clip: rect(0px, 100px, 100px, 50px); /* Hide half of the progress bar */ 
} 
/* Set the sizes of the elements that make up the progress bar */ 
.circle { 
    width: 80px; 
    height: 80px; 
    border: 10px solid green; 
    border-radius: 50px; 
    position: absolute; 
    clip: rect(0px, 50px, 100px, 0px); 
} 
/* Using the data attributes for the animation selectors. */ 
/* Base settings for all animated elements */ 
div[data-anim~=base] { 
    -webkit-animation-iteration-count: 1; /* Only run once */ 
    -webkit-animation-fill-mode: forwards; /* Hold the last keyframe */ 
    -webkit-animation-timing-function:linear; /* Linear animation */ 
} 

还要检查这个fiddle here(CSS只)

HTML

<div class="arc-container"> 
    <div class="arc-hider"></div> 
    <div class="arc-inset"> 
     o 
    </div> 
    <div class="arc-lowerInset"> 
     o 
    </div> 
    <div class="arc-overlay"> 
     35% 
    </div> 
    <div class="arc-wrapper"> 
     <div class="arc2"></div> 
     <div class="arc1"></div> 
    </div> 
</div> 

CSS

@import url(http://fonts.googleapis.com/css?family=Josefin+Sans:100,300,400); 

.arc1 { 
    width: 160px; 
    height: 160px; 
    background: #00a0db; 
    -webkit-transform-origin: -31% 61%; 
    margin-left: -30px; 
    margin-top: 20px; 
    -webkit-transform: translate(-54px,50px); 
    -moz-transform: translate(-54px,50px); 
    -o-transform: translate(-54px,50px); 
} 
.arc2 { 
    width: 160px; 
    height: 160px; 
    background: #00a0db; 
    -webkit-transform: skew(45deg,0deg); 
    -moz-transform: skew(45deg,0deg); 
    -o-transform: skew(45deg,0deg); 
    margin-left: -180px; 
    margin-top: -90px; 
    position: absolute; 
    -webkit-transition: all .5s linear; 
    -moz-transition: all .5s linear; 
    -o-transition: all .5s linear; 
} 

.arc-container:hover .arc2 { 
    margin-left: -50px; 
    -webkit-transform: skew(-20deg,0deg); 
    -moz-transform: skew(-20deg,0deg); 
    -o-transform: skew(-20deg,0deg); 
} 

.arc-wrapper { 
    width: 150px; 
    height: 150px; 
    border-radius:150px; 
    background: #424242; 
    overflow:hidden; 
    left: 50px; 
    top: 50px; 
    position: absolute; 
} 
.arc-hider { 
    width: 150px; 
    height: 150px; 
    border-radius: 150px; 
    border: 50px solid #e9e9e9; 
    position:absolute; 
    z-index:5; 
    box-shadow:inset 0px 0px 20px rgba(0,0,0,0.7); 
} 

.arc-inset { 
    font-family: "Josefin Sans"; 
    font-weight: 100; 
    position: absolute; 
    font-size: 413px; 
    margin-top: -64px; 
    z-index: 5; 
    left: 30px; 
    line-height: 327px; 
    height: 280px; 
    -webkit-mask-image: -webkit-linear-gradient(top, rgba(0,0,0,1), rgba(0,0,0,0.2)); 
} 
.arc-lowerInset { 
    font-family: "Josefin Sans"; 
    font-weight: 100; 
    position: absolute; 
    font-size: 413px; 
    margin-top: -64px; 
    z-index: 5; 
    left: 30px; 
    line-height: 327px; 
    height: 280px; 
    color: white; 
    -webkit-mask-image: -webkit-linear-gradient(top, rgba(0,0,0,0.2), rgba(0,0,0,1)); 
} 
.arc-overlay { 
    width: 100px; 
    height: 100px; 
    background-image: linear-gradient(bottom, rgb(217,217,217) 10%, rgb(245,245,245) 90%, rgb(253,253,253) 100%); 
    background-image: -o-linear-gradient(bottom, rgb(217,217,217) 10%, rgb(245,245,245) 90%, rgb(253,253,253) 100%); 
    background-image: -moz-linear-gradient(bottom, rgb(217,217,217) 10%, rgb(245,245,245) 90%, rgb(253,253,253) 100%); 
    background-image: -webkit-linear-gradient(bottom, rgb(217,217,217) 10%, rgb(245,245,245) 90%, rgb(253,253,253) 100%); 

    padding-left: 32px; 
    box-sizing: border-box; 
    -moz-box-sizing: border-box; 
    line-height: 100px; 
    font-family: sans-serif; 
    font-weight: 400; 
    text-shadow: 0 1px 0 #fff; 
    font-size: 22px; 
    border-radius: 100px; 
    position: absolute; 
    z-index: 5; 
    top: 75px; 
    left: 75px; 
    box-shadow:0px 0px 20px rgba(0,0,0,0.7); 
} 
.arc-container { 
    position: relative; 
    background: #e9e9e9; 
    height: 250px; 
    width: 250px; 
} 

或者这美丽round progress bar与HTML5,CSS3和JavaScript。

+1

http://fromanegg.com/post/41302147556/100-pure-css感兴趣-radiial-progress-bar –

+0

@panos我试过你的第一个解决方案。我需要.circle边框为6px而不是10px。我达到了同样的效果,但达到了50%。它给了一个混蛋,并再次开始动画。只需尝试 –

+0

@ Santosh-kumar,您还需要更改其他值 –

90

我创建了一个关于如何使用CSS3和LESS JavaScript库完成的教程。 你可以在这里找到这篇博文:https://medium.com/secoya-tech/a917b80c43f9

这是一个jsFiddle的最终结果。百分比通过data-progress属性设置。使用CSS转换动画更改。

gif of radial progress indicator

+3

我不知道你可以用CSS来做这件事。尼斯。 – Hobbes

+4

大性能虽然..使它无法使用我的应用程序= [ – Hobbes

+0

对不起,听到这一点。我认为这可能是文本动画的大量DOM元素,如果你杀了那个部分,它应该运行得更顺利(但是这样做当然不那么有趣......) – andsens

9

是基于两个裁剪圆的元素,我旋转到合适的角度另一纯CSS基础的解决方案:

http://jsfiddle.net/maayan/byT76/

这是基本的CSS,这使得它:

.clip1 { 
    position:absolute; 
    top:0;left:0; 
    width:200px; 
    height:200px; 
    clip:rect(0px,200px,200px,100px); 
} 
.slice1 { 
    position:absolute; 
    width:200px; 
    height:200px; 
    clip:rect(0px,100px,200px,0px); 
    -moz-border-radius:100px; 
    -webkit-border-radius:100px; 
    border-radius:100px; 
    background-color:#f7e5e1; 
    border-color:#f7e5e1; 
    -moz-transform:rotate(0); 
    -webkit-transform:rotate(0); 
    -o-transform:rotate(0); 
    transform:rotate(0); 
} 

.clip2 
{ 
    position:absolute; 
    top:0;left:0; 
    width:200px; 
    height:200px; 
    clip:rect(0,100px,200px,0px); 
} 

.slice2 
{ 
    position:absolute; 
    width:200px; 
    height:200px; 
    clip:rect(0px,200px,200px,100px); 
    -moz-border-radius:100px; 
    -webkit-border-radius:100px; 
    border-radius:100px; 
    background-color:#f7e5e1; 
    border-color:#f7e5e1; 
    -moz-transform:rotate(0); 
    -webkit-transform:rotate(0); 
    -o-transform:rotate(0); 
    transform:rotate(0); 
} 

并且js根据需要旋转它。

很容易理解..

希望它能帮助, Maayan

+1

在jQuery里面,不需要在里面设置所有'-vendor-prefixes' '.css()'♪只使用'transform:'rotate('+ degree +'deg)'' –

+1

这是比较容易的和清晰的,我从@Maayan的例子开始工作,得到这个: http:// jsfiddle.net/g8z64Ler/ – lukart

30

怎么样?

HTML

<div class="chart" id="graph" data-percent="88"></div> 

的Javascript

var el = document.getElementById('graph'); // get canvas 

var options = { 
    percent: el.getAttribute('data-percent') || 25, 
    size: el.getAttribute('data-size') || 220, 
    lineWidth: el.getAttribute('data-line') || 15, 
    rotate: el.getAttribute('data-rotate') || 0 
} 

var canvas = document.createElement('canvas'); 
var span = document.createElement('span'); 
span.textContent = options.percent + '%'; 

if (typeof(G_vmlCanvasManager) !== 'undefined') { 
    G_vmlCanvasManager.initElement(canvas); 
} 

var ctx = canvas.getContext('2d'); 
canvas.width = canvas.height = options.size; 

el.appendChild(span); 
el.appendChild(canvas); 

ctx.translate(options.size/2, options.size/2); // change center 
ctx.rotate((-1/2 + options.rotate/180) * Math.PI); // rotate -90 deg 

//imd = ctx.getImageData(0, 0, 240, 240); 
var radius = (options.size - options.lineWidth)/2; 

var drawCircle = function(color, lineWidth, percent) { 
     percent = Math.min(Math.max(0, percent || 1), 1); 
     ctx.beginPath(); 
     ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); 
     ctx.strokeStyle = color; 
     ctx.lineCap = 'round'; // butt, round or square 
     ctx.lineWidth = lineWidth 
     ctx.stroke(); 
}; 

drawCircle('#efefef', options.lineWidth, 100/100); 
drawCircle('#555555', options.lineWidth, options.percent/100); 

和CSS

div { 
    position:relative; 
    margin:80px; 
    width:220px; height:220px; 
} 
canvas { 
    display: block; 
    position:absolute; 
    top:0; 
    left:0; 
} 
span { 
    color:#555; 
    display:block; 
    line-height:220px; 
    text-align:center; 
    width:220px; 
    font-family:sans-serif; 
    font-size:40px; 
    font-weight:100; 
    margin-left:5px; 
} 

http://jsfiddle.net/Aapn8/3410/

Basic代码是从简单的饼图采取

+0

这对我来说是最好的解决方案(没有jquery呢!)。 –

+2

对我来说也是。这里是如何动画: drawCircle('#efefef',options.lineWidth,100/100); var i = 0; VAR INT =的setInterval(函数(){ 我++; 画圆( '#555555',options.lineWidth,I/100); span.textContent = I + “%”;如果 (ⅰ> = 100){ clearInterval(int); } },100); – marlar

+0

如何将渐变色设置为圆形? – yaniv14