Progressbar.js граница-радиус на svg

#javascript #html #css

#javascript #HTML #css

Вопрос:

Возможно ли иметь радиус границы для progressbarjs, который заполнен на 50% точно так же, как радиус границы родительского divs?

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

HTML

 <div class="pgbar" id="pgbar"></div>
 

CSS

   .pgbar {
    height: 46px;
    margin: 0 auto 30px;
    background-color: #D8D8D8;
    border-radius: 23px;
    padding: 2px;
    svg {
      height: 100%;
      width: 100%;
      border-radius: 23px;
    }
  }
 

JS

 var bar = new ProgressBar.Line(pgbar, {
    color: '#00AFD0',
    trailWidth: 1,
    svgStyle: {borderRadius: '23px'}
});

bar.animate(0.5);
 

Ответ №1:

border-radius Не работает на переднем / правом краю загружаемого SVG, потому что SVG имеет ширину 100%, поэтому радиус границы фактически находится на крайних левых / правых краях SVG и, следовательно, не будет обрезать путь, если ширина пути не равна 100%.

Чтобы исправить это, вы можете использовать комбинацию stroke-linecap: round для округления края обводки <path> элемента и задать ширину обводки элемента programmatically. Исходя из документации, собственный размер SVG всегда 100×strokeWidth равен, поэтому вам нужно будет масштабировать холст по соотношению сторон элемента DOM для достижения округлой формы.

 var width = pgbar.clientWidth;
var height = pgbar.clientHeight;

var bar = new ProgressBar.Line(pgbar, {
  color: '#00AFD0',
  strokeWidth: height / width * 100,
  svgStyle: {
    strokeLinecap: 'round'
  }
});

bar.animate(0.5); 
 .pgbar {
  height: 46px;
  margin: 0 auto 30px;
  background-color: #D8D8D8;
  border-radius: 23px;
  padding: 2px;
}

.pgbar svg {
  height: 100%;
  width: 100%;
  border-radius: 23px;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/progressbar.js/1.1.0/progressbar.min.js"></script>
<div class="pgbar" id="pgbar"></div> 

Предостережение: если ширина элемента индикатора выполнения изменяется, что приводит к изменению его соотношения сторон, вам нужно будет найти способ изменить strokeWidth : не уверен, что API плагина действительно поддерживает это. Если вам нужно обеспечить такую гибкость, возможно, вам лучше просто написать свой собственный простой компонент для обработки анимации панели прогресса: помните, что этот <progress> элемент довольно хорошо поддерживается.