CSS 진행 서클 [닫힘]


112

진행률 표시 줄을 찾기 위해이 웹 사이트를 검색했지만, 내가 찾은 것은 전체 100 %로 이동하는 애니메이션 원을 보여줍니다.

아래 스크린 샷과 같이 특정 비율에서 멈추고 싶습니다. CSS 만 사용하여 할 수있는 방법이 있습니까?

원형 진행률 표시 줄


나는 스크립트를 찾는 것이 아니라 이것에 관한 CSS3 정보를 찾고 있습니다.
Adam GunShy는

8
"Css Progress Circle을 수행하는 방법"이라는 질문은 신경 쓰지 마십시오. 여전히 유효합니다. 나는 이것이 새로운 단어로 다시 열어야한다고 생각하는데,이 결과는 검색에서 처음이며 오래된 답변을 포함합니다.
Ciantic

그 스크린 샷은 어떤 웹 사이트에서 왔습니까?
MoralCode

10
이것은 '순환 진행률 표시기 CSS'에 대한 Google의 최고의 결과입니다. 부끄러운 질문이 닫혔습니다.
Gopherkhan

당신이 LESS를 사용하는 경우 당신은에 관심이있을 수 cssscript.com/pure-css-circular-percentage-bar
jchook

답변:


119

CSS3 및 LESS JavaScript 라이브러리를 사용하여 정확히 수행하는 방법에 대한 자습서를 만들었습니다. 블로그 게시물은 https://medium.com/secoya-tech/a917b80c43f9 에서 찾을 수 있습니다.

다음은 최종 결과 의 jsFiddle 입니다. 백분율은 data-progress속성을 통해 설정됩니다 . 변경 사항은 CSS 전환을 사용하여 애니메이션됩니다.

방사형 진행률 표시기의 gif


3
나는 당신이 CSS로 이것을 할 수 있다고 생각하지 못했습니다. 좋은.
Hobbes 2014 년

4
그래도 큰 성능 히트 .. 내 앱에 사용할 수 없게 만드는 = [
Hobbes

2
훌륭한 물건. Firefox (개발자 버전 41.0a2 사용)의 사소한 문제로 인해 변환 중에 날카로운 모서리가 나타납니다. 진행률을 90으로 설정하고 전환 시간을 10 초로 설정하면 쉽게 확인할 수 있습니다. 수정에 바로 추가 outline: 1px solid transparent;.mask, .fill, .shadow그룹.
luopio

5
@Hobbes, 당신은 할 수 없습니다, 포스터는 거짓말입니다. 이 답변은 LESS라는 라이브러리를 통해 많은 양의 Javascript를 사용합니다.
GetFree

6
누군가 시도해보고 싶어 할 경우를 대비하여 Sass 버전을 만들었습니다. gist.github.com/digitalbreed/84a19db69244b22519e03550ba010a25
digitalbreed

78

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 */
}

.wrapper[data-anim~=wrapper] {
  -webkit-animation-duration: 0.01s; /* Complete keyframes asap */
  -webkit-animation-delay: 3s; /* Wait half of the animation */
  -webkit-animation-name: close-wrapper; /* Keyframes name */
}

.circle[data-anim~=left] {
  -webkit-animation-duration: 6s; /* Full animation time */
  -webkit-animation-name: left-spin;
}

.circle[data-anim~=right] {
  -webkit-animation-duration: 3s; /* Half animation time */
  -webkit-animation-name: right-spin;
}
/* Rotate the right side of the progress bar from 0 to 180 degrees */
@-webkit-keyframes right-spin {
  from {
    -webkit-transform: rotate(0deg);
  }
  to {
    -webkit-transform: rotate(180deg);
  }
}
/* Rotate the left side of the progress bar from 0 to 360 degrees */
@-webkit-keyframes left-spin {
  from {
    -webkit-transform: rotate(0deg);
  }
  to {
    -webkit-transform: rotate(360deg);
  }
}
/* Set the wrapper clip to auto, effectively removing the clip */
@-webkit-keyframes close-wrapper {
  to {
    clip: rect(auto, auto, auto, auto);
  }
}
<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 전용).

@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;
}
<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>

또는 HTML5, CSS3 및 JavaScript가있는 아름다운 원형 진행률 표시 줄 .



@panos 나는 첫 번째 해결책을 시도했다. .circle 테두리가 10px 대신 6px가 필요합니다. 나는 똑같은 것을 달성했지만 50 %에 도달했습니다. 그것은 저크를주고 다시 애니메이션을 시작합니다. 그냥 밖으로 시도
Santhosh 쿠마

@ Santosh-kumar, 다른 값도 변경해야합니다
Panos Kal.

@panos 첫 번째 솔루션 진행 상황을 어떻게 변경합니까? 데이터 요소로 할 수 있습니까? 나는 애니메이션이 아니라 새로운 해요
anthonytherockjohnson

1
MDN 에 따르면 clip이제 더 이상 사용되지 않습니다.
jstaab

36

그게 어때?

HTML

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

자바 스크립트

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/

기본 코드는 Simple PIE Chart http://rendro.github.io/easy-pie-chart/ 에서 가져 왔습니다.


이것은 나에게 가장 좋은 솔루션이었습니다 (jquery도 없습니다!).
Andy B

2
나도. 애니메이션 방법은 다음과 같습니다. drawCircle ( '# efefef', options.lineWidth, 100/100); var i = 0; var int = setInterval (function () {i ++; drawCircle ( '# 555555', options.lineWidth, i / 100); span.textContent = i + "%"; if (i> = 100) {clearInterval (int);} }, 100);
marlar

1
원에 그라디언트 색상을 설정하는 방법은 무엇입니까?
yaniv14

jsFiddle은 Chrome에 막대를 표시하지 않습니다.
Esamo

10

두 개의 잘린 둥근 요소를 기반으로하는 또 다른 순수한 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)'
로코 C. Buljan

1
이것은 더 쉽고 깨끗합니다. @Maayan 예제에서 시작하여 다음을 얻었습니다. jsfiddle.net/g8z64Ler
lukart
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.