26

Мне хотелось бы иметь круговой процентный показатель на моем сайте:

круговой процентный показатель

В этом случае, см. рисунок, он показывает 75%. Как это может быть сделано?
У меня есть желтый круг в image-file, но может быть проще, как делают это некоторые, все с помощью CSS?

Свободный перевод вопроса Circular percent progress bar от участника @dhrm.

Alexandr_TT
  • 110,146
  • 23
  • 114
  • 384
  • А вы ассоциацию в табличку на Мете добавляете? – Nick Volynkin Feb 18 '17 at 03:59
  • 1
    из этой таблички Николас берет пары и добавляет в базу. – Nick Volynkin Feb 18 '17 at 11:58
  • Другими словами, комментарий про ассоциацию обычно обозначает, что вопрос был добавлен в табличку, и его не нужно добавлять ещё раз. Если вы ставите комментарий, а в табличку не добавляете — ещё меньше шанс, что кто-то другой добавит. – Nick Volynkin Feb 18 '17 at 13:38
  • 1
    ассоциация:http://stackoverflow.com/questions/29350504/circular-percent-progress-bar/29512804#29512804 – Alexandr_TT Feb 18 '17 at 19:15

1 Answers1

21

Учитывая форму прогресс-бара (закругленный конец/начало), я хотел бы предложить, использование SVG.

DEMO: Radial progress bar

введите сюда описание изображения

В следующем примере, прогресс идет в сочетании с атрибутом stroke-dasharray , а процент числа увеличиваются с jQuery:

var count = $(('#count'));
$({ Counter: 0 }).animate({ Counter: count.text() }, {
  duration: 5000,
  easing: 'linear',
  step: function () {
    count.text(Math.ceil(this.Counter)+ "%");
  }
});
body{text-align:center;font-family: 'Open Sans', sans-serif;}
svg{width:25%;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg id="animated" viewbox="0 0 100 100">
  <circle cx="50" cy="50" r="45" fill="#FDB900"/>
  <path fill="none" stroke-linecap="round" stroke-width="5" stroke="#fff"
        stroke-dasharray="251.2,0"
        d="M50 10
           a 40 40 0 0 1 0 80
           a 40 40 0 0 1 0 -80">
    <animate attributeName="stroke-dasharray" from="0,251.2" to="251.2,0" dur="5s"/>           
  </path>
  <text id="count" x="50" y="50" text-anchor="middle" dy="7" font-size="20">100%</text>
</svg>

К сожалению, браузерIE не поддерживает SVG-анимации SMIL. Для достижения такого же результата с поддержкой IE, вы можете использовать библиотеки, такие как Snap.SVG и анимировать атрибут stroke-dasharray с JS :

var count = $(('#count'));
$({ Counter: 0 }).animate({ Counter: count.text() }, {
  duration: 5000,
  easing: 'linear',
  step: function () {
    count.text(Math.ceil(this.Counter)+ "%");
  }
});

var s = Snap('#animated'); var progress = s.select('#progress');

progress.attr({strokeDasharray: '0, 251.2'}); Snap.animate(0,251.2, function( value ) { progress.attr({ 'stroke-dasharray':value+',251.2'}); }, 5000);

body{text-align:center;font-family:sans-serif;}
svg{width:25%;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.3.0/snap.svg-min.js"></script>
<svg id="svg" viewbox="0 0 100 100">
  <circle cx="50" cy="50" r="45" fill="#FDB900"/>
  <path fill="none" stroke-linecap="round" stroke-width="5" stroke="#fff"
        stroke-dasharray="1,250.2"
        d="M50 10
           a 40 40 0 0 1 0 80
           a 40 40 0 0 1 0 -80"/>
  <text x="50" y="50" text-anchor="middle" dy="7" font-size="20">1%</text>
</svg>
<svg viewbox="0 0 100 100">
  <circle cx="50" cy="50" r="45" fill="#FDB900"/>
  <path fill="none" stroke-linecap="round" stroke-width="5" stroke="#fff"
        stroke-dasharray="125.6,125.6"
        d="M50 10
           a 40 40 0 0 1 0 80
           a 40 40 0 0 1 0 -80"/>
  <text x="50" y="50" text-anchor="middle" dy="7" font-size="20">50%</text>
</svg>

<svg id="animated" viewbox="0 0 100 100">
  <circle cx="50" cy="50" r="45" fill="#FDB900"/>
  <path id="progress" stroke-linecap="round" stroke-width="5" stroke="#fff" fill="none"
        d="M50 10
           a 40 40 0 0 1 0 80
           a 40 40 0 0 1 0 -80">
  </path>
  <text id="count" x="50" y="50" text-anchor="middle" dy="7" font-size="20">100%</text>
</svg>

Свободный перевод ответа от участника @web-tiki.

Alexandr_TT
  • 110,146
  • 23
  • 114
  • 384
  • У меня второй вариант не сработал :( – Yuri Feb 15 '17 at 17:49
  • @Yuri попробуй сейчас.... подправил – Alexandr_TT Feb 15 '17 at 17:53
  • Теперь отлично :) – Yuri Feb 15 '17 at 17:55
  • Продолжение от того же автора http://ru.stackoverflow.com/questions/628257/%d0%9a%d1%80%d1%83%d0%b3%d0%be%d0%b2%d0%be%d0%b9-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b5%d1%81%d1%81-%d0%b1%d0%b0%d1%80 – Alexandr_TT Feb 15 '17 at 18:09
  • Вопрос: в примере есть аттрибут stroke-dasharray="125.6,125.6" и stroke-dasharray="0,250.2" - Как определяется 2-е число? – Dmytro Sep 11 '19 at 09:38
  • @Дмытрык 250.2 - общая длина окружности stroke-dasharray="125.6,125.6 данная запись обозначает - черта 125.6 пробел 125.6 Может вам будет полезен мой топик Помогите с dasharray и dashoffset Всё очень подробно и надеюсь доступно – Alexandr_TT Sep 11 '19 at 09:45
  • Спасибо, почитал. Но, пока не понял, как вышло, что в Вашем примере длина окружности равна 250 или 125. У меня получается 282: r="45" * 2 * пи ... Я вынесу это в отдельный вопрос. Минут через 20 – Dmytro Sep 11 '19 at 09:56
  • разместил вопрос: https://ru.stackoverflow.com/questions/1023436/%d0%9e%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b4%d0%bb%d0%b8%d0%bd%d1%8b-%d0%be%d0%ba%d1%80%d1%83%d0%b6%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%b4%d0%bb%d1%8f-%d0%b0%d1%82%d1%82%d1%80%d0%b8%d0%b1%d1%83%d1%82%d0%b0-stroke-dasharray – Dmytro Sep 11 '19 at 10:55
  • @Дмытрык если вопрос ещё актуален, посмотрите ответ. Не мог ответить раньше, - отсутствовал на сайте с 11 сентября – Alexandr_TT Sep 18 '19 at 16:39