AngularJS UI Bootstrap объединяет два индикатора выполнения

Я установил два индикатора выполнения в UI Bootstrap, однако моя цель состоит в том, чтобы объединить их в один, основной и дополнительный, который имеет только форму вертикальной полосы.

Вот код HTML для моих индикаторов выполнения:

<div>
  <h3 class="inline-block no-margin">Main</h3>
  <uib-progressbar value="95"
                   class="progress-xs no-radius"
                   type="success"></uib-progressbar>
  <h4 class="no-margin">SubCategory</h4>
  <uib-progressbar value="50"
                   class="progress-xs no-radius no-margin"
                   type="danger"></uib-progressbar>
</div>

Мой вопрос: как я могу объединить эти два, чтобы дополнительный отображался только как небольшая вертикальная полоса на основной панели?

Таким образом, основная полоса показывает 95% полосы, а подкатегория показывает только вертикальную полосу на 50%. введите здесь описание изображения
Есть аналогичный пример к этому в здесь называются ограничительные линии, но это другая старая библиотека.


person cplus    schedule 04.01.2017    source источник
comment
Если я правильно понимаю, цель второго индикатора выполнения - нарисовать вертикальную линию на первом индикаторе выполнения?   -  person Ortomala Lokni    schedule 06.01.2017
comment
@OrtomalaLokni да, вместо другого индикатора выполнения, просто вертикальная полоса, например |, которая будет перемещаться вправо и влево в соответствии со своим значением.   -  person cplus    schedule 06.01.2017


Ответы (3)


Вы можете использовать ng-style для обновления положения вертикальной линии div, чтобы решить эту проблему. Это позволит вам легко установить положение и значение вертикальной полосы. Посмотрите этот рабочий пример на plunkr.:

HTML

<uib-progressbar animate="false" value=95 type="success"><b>95%</b></uib-progressbar>
<div id="vertical-mark" ng-style="style()">&nbsp;{{mark}}%</div>

JS

$scope.mark = 50;
  $scope.style = function() {
    return {
      'left': $scope.mark + '%'
    }
  }

CSS

#vertical-mark {
  position:relative;
  border-left:1px solid #000;
  height:50px;
  top:-57px;
}

В качестве альтернативы я также добавил аналогичную реализацию с индикатором выполнения с накоплением.

person Divyanshu Maithani    schedule 07.01.2017

Я не пробовал это сам, но это то, что пришло мне в голову, когда я увидел ваш вопрос.

Вы можете изменить CSS ui-progressbars так, чтобы они накладывались друг на друга; возможно с position:absolute или что у вас есть. Это позволит всем числовым маркерам располагаться рядом друг с другом, как вы хотите.

Затем вы можете изменить CSS самих полос. Любые бары меньше максимального, возможно, присвойте им класс .no-fill или что-то в этом роде. Это было бы сложно, но таким образом вы можете иметь любые полосы меньше максимального %, чтобы они состояли только из свойства border-right, в то время как полоса максимального % была бы полосой с фоном и всеми обычными стилями индикатора выполнения.

Подвох, который может возникнуть, заключается в том, что вам также может потребоваться упорядочить столбцы z-index так, чтобы столбец с наибольшим значением находился за меньшими значениями, а их вертикальные линии отображались.

Удачи!


ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ (с plunkr)

скриншот plunkr

JS

$scope.stacked = [{
  value: 55,
  type: 'info'
}, {
  value: 95,
  type: 'success'
}];

HTML

<div class="progress-wrapper">
  <uib-progress max="100" ng-repeat="bar in stacked | orderBy:'value':true">
    <uib-bar value="bar.value" type="{{bar.type}}">
      <span class="marker" ng-hide="bar.value < 5">
          {{bar.value}}%
        </span>
    </uib-bar>
  </uib-progress>
</div>

CSS

/* wrapper to help us contain the bars and their positioning */
.progress-wrapper {
  position: relative;
  padding-top: 30px;
}

/* make all progress bars the same, no bg so they 'stack' */
.progress-wrapper .progress {
  width: 100%;
  position: absolute;
  overflow: visible;
  background: none;
}

/* first child is the background bar, give it color */
.progress-wrapper .progress:first-child {
  background: #EEE;
}

/* make all bars invisible and with a right, border;
   except the last/furthest back bar, give it color only
*/
.progress-wrapper .progress .progress-bar {
  background: none;
  border-right: solid 2px #FFF;
}
.progress-wrapper .progress:first-child .progress-bar {
  background: #0AF;
  border-right: none;
}

/* makes sure that markers behave,
   otherwise they'll fly away
*/
.progress .progress-bar {
  position: relative;
}

/* style for marker element and drop triangle */
.progress .marker {
  position: absolute;
  padding: 0 2px;
  top: -30px;
  right: -15px;
  color: #FFF;
  background: #000;
}
.progress .marker:after {
  content: '';
  width: 10px;
  height: 10px;
  background: #000;
  position: absolute;
  left: 30%;
  bottom: -5px;
  transform: rotate(45deg);
}
person coblr    schedule 06.01.2017
comment
это именно то, что я хочу! не могли бы вы сделать это с вертикальной полосой и текстовым сообщением, которое также будет отображаться в этой позиции. спасибо - person cplus; 06.01.2017
comment
У меня сейчас нет времени делать это с тегом и всем тем, что у вас было на скриншотах. Я предположил, что у вас уже есть какой-то работающий код, вы просто хотели, чтобы столбцы располагались друг над другом. Если вам нужно более полное решение, мне придется поработать над ним после работы, но тем временем plunkr должен приблизить вас или вашего разработчика пользовательского интерфейса к тому, что вам нужно. Вы также забыли спросить о моем гонораре ;) - person coblr; 06.01.2017
comment
Я буду ждать вашего полного ответа, как только у вас будет время. дайте мне знать ваш гонорар! - person cplus; 07.01.2017
comment
Ну вот! Я хотел бы отдать должное @bvakiti, потому что я использовал их plunkr, чтобы начать. Он просто переместил повтор на один элемент вверх и добавил весь соответствующий CSS. плата не требуется :). с Новым Годом! - person coblr; 07.01.2017

Вы можете использовать составную полосу прогресса с некоторыми пользовательскими стилями.

<uib-progress><uib-bar ng-repeat="bar in stacked track by $index" value="bar.value" type="{{bar.type}}"><span ng-hide="bar.value < 5">{{bar.value}}%</span></uib-bar></uib-progress>

$scope.stacked = [{
  value: 10,
  type: 'info'
}, {
  value: 35,
  type: 'success'
}];

});

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

Обратитесь к индикатору выполнения в этом https://angular-ui.github.io/bootstrap/.

Мой пример здесь https://plnkr.co/edit/9qCP1lV40BQ9DYDHvayo?p=preview

Я отредактировал код в сложенном индикаторе выполнения. Думаю, это помогает.

Вы можете добавить к этому пользовательские стили, чтобы показать значение прогресса.

person bvakiti    schedule 06.01.2017
comment
Хорошее решение. Однако ваша ссылка на plunkr не работает. Приводит вас к пустому plunkr. Вопрос: сюда добавляются 10 и 35. Похоже, что эта полоса имеет ширину около 45%. Если проценты что-то вроде 95 и 55, это решение все еще будет работать? - person coblr; 06.01.2017
comment
Да, хотя это элегантно, это показывает неправильные результаты при использовании больших чисел. Подход с накоплением, по-видимому, поддерживает несколько столбцов только тогда, когда сумма значений составляет ‹ 100%. Если мы используем два или более, равных › 100, столбики будут неточными. - person coblr; 06.01.2017
comment
Можете ли вы попробовать указать максимальный атрибут для uib-progress. plnkr.co/edit/9qCP1lV40BQ9DYDHvayo?p=preview Изменение максимального значения, кажется, работает - person bvakiti; 06.01.2017
comment
этот ответ предоставляет альтернативное решение! если никто не предложит решение по использованию вертикальной полосы, то я соглашусь. Я не возражаю против любого другого решения, использующего любую другую библиотеку или пакет. - person cplus; 06.01.2017