Vòng kết nối tiến trình CSS [đã đóng]


112

Tôi đã tìm kiếm trang web này để tìm các thanh tiến trình, nhưng những thanh mà tôi có thể tìm thấy lại hiển thị các vòng tròn hoạt hình đi đến đầy đủ 100%.

Tôi muốn nó dừng lại ở một số phần trăm nhất định như trong ảnh chụp màn hình bên dưới. Có cách nào tôi có thể làm điều đó chỉ bằng cách sử dụng CSS không?

Thanh tiến trình tròn


Tôi không tìm kiếm tập lệnh, tôi đang tìm bất kỳ thông tin CSS3 nào liên quan đến điều này.
Adam GunShy nói

8
Đừng bận tâm đến từ ngữ, câu hỏi "Làm thế nào để thực hiện Vòng tròn Tiến trình Css?" vẫn còn hợp lệ. Tôi nghĩ điều này nên được mở lại với từ ngữ mới, kết quả này xuất hiện đầu tiên trong các tìm kiếm và chứa các câu trả lời đã lỗi thời.
Ciantic

ảnh chụp màn hình đó từ trang web nào?
MoralCode

10
Đây là kết quả số một trên google về 'chỉ báo tiến trình vòng tròn css'. Thật xấu hổ khi câu hỏi được đóng lại.
Gopherkhan

Nếu bạn đang sử dụng LESS bạn có thể quan tâm đến cssscript.com/pure-css-circular-percentage-bar
jchook

Câu trả lời:


119

Tôi đã tạo một hướng dẫn về cách thực hiện chính xác điều đó với CSS3 và thư viện JavaScript LESS. Bạn có thể tìm blogpost tại đây: https://medium.com/secoya-tech/a917b80c43f9

Đây là jsFiddle của kết quả cuối cùng. Tỷ lệ phần trăm được đặt thông qua data-progressthuộc tính. Các thay đổi được làm động bằng cách sử dụng chuyển tiếp CSS.

gif của chỉ báo tiến trình xuyên tâm


3
Tôi không biết bạn có thể làm điều này với css. Đẹp.
Hobbes

4
Tuy nhiên, hiệu suất lớn đã đạt được .. khiến ứng dụng của tôi không sử dụng được = [
Hobbes

2
Công cụ tuyệt vời. Một vấn đề nhỏ trong Firefox (sử dụng phiên bản dành cho nhà phát triển 41.0a2) tạo ra các cạnh sắc nét có thể nhìn thấy trong quá trình chuyển đổi. Dễ dàng nhận thấy nếu bạn đặt tiến độ thành 90 và thời gian chuyển tiếp thành 10 giây. Để khắc phục chỉ cần thêm outline: 1px solid transparent;vào .mask, .fill, .shadownhóm.
luopio

5
@Hobbes, bạn không thể, người đăng đang nói dối. Câu trả lời này sử dụng một lượng lớn Javascript thông qua một thư viện có tên là LESS.
GetFree

6
Tôi đã tạo ra một phiên bản Sass, chỉ trong trường hợp ai đó muốn cung cấp cho nó một thử: gist.github.com/digitalbreed/84a19db69244b22519e03550ba010a25
digitalbreed

78

Tôi đã tạo một fiddle chỉ sử dụng 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>

Cũng kiểm tra fiddle này tại đây (chỉ 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>

Hoặc thanh tiến trình tròn tuyệt đẹp này với HTML5, CSS3 và JavaScript.



@panos tôi đã thử giải pháp đầu tiên của bạn. Tôi cần đường viền .circle là 6px thay vì 10px. Tôi đã đạt được điều tương tự nhưng đạt 50%. Nó cho một cú giật và một lần nữa bắt đầu hoạt ảnh. Chỉ cần thử
Santhosh Kumar

@ Santosh-kumar, bạn cũng cần thay đổi các giá trị khác
Panos Kal.

@panos Làm cách nào để thay đổi tiến độ của các giải pháp đầu tiên? nó có thể được thực hiện với một phần tử dữ liệu? Tôi khá mới mẻ với hình ảnh động
anthonytherockjohnson

1
Theo MDN clip hiện không được dùng nữa.
jstaab

36

Điều đó thì sao?

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);

và 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/

Mã cơ bản được lấy từ Biểu đồ PIE Đơn giản http://rendro.github.io/easy-pie-chart/


Đây là giải pháp tốt nhất cho tôi (không có jquery quá!).
Andy B

2
Cho tôi nữa. Đây là cách tạo hoạt ảnh cho nó: 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
Làm thế nào để đặt màu gradient cho hình tròn?
yaniv14

jsFiddle không hiển thị thanh trên Chrome.
Esamo

10

Một giải pháp dựa trên css thuần túy khác dựa trên hai phần tử làm tròn được cắt bớt mà tôi xoay để có được góc bên phải:

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

Đó là css cơ bản cho phép nó:

.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);
}

và js xoay nó theo yêu cầu.

khá dễ hiểu ..

Hy vọng nó sẽ giúp, Maayan


1
Bên trong jQuery, không có cần phải thiết lập tất cả các -vendor-prefixesbên .css()♪ Chỉ sử dụngtransform: 'rotate(' + degree + 'deg)'
Roko C. Buljan

1
Đây là cách dễ dàng hơn và dễ dàng hơn, tôi đã làm việc bắt đầu từ ví dụ @Maayan và nhận được điều này: jsfiddle.net/g8z64Ler
lukart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.