2016-08-28 3 views
6

Мы использовали чистый индикатор прогресса css.Использование css calc() с шагом

Основная часть css, как показано ниже.

.container { 
    width: 600px; 
    margin: 20px auto; 
} 

.progressbar { 
    margin: 0; 
    padding: 0; 
    counter-reset: step; 
} 

.progressbar li { 
    list-style-type: none; 
    width: 25%; 
    float: left; 
    font-size: 12px; 
    position: relative; 
    text-align: center; 
    text-transform: uppercase; 
    color: #7d7d7d; 
} 

.progressbar li:before { 
    width: 30px; 
    height: 30px; 
    content: counter(step); 
    counter-increment: step; 
    line-height: 30px; 
    border: 2px solid #7d7d7d; 
    display: block; 
    text-align: center; 
    margin: 0 auto 10px auto; 
    border-radius: 50%; 
    background-color: white; 
} 

.progressbar li:after { 
    width: 100%; 
    height: 2px; 
    content: ''; 
    position: absolute; 
    background-color: #7d7d7d; 
    top: 15px; 
    left: -50%; 
    z-index: -1; 
} 

............... 

HTML-

<div class="container"> 
    <ul class="progressbar"> 
    <li class="active">login</li> 
    <li>choose interest</li> 
    ........ 

Полный образец можно найти на сайте https://jsfiddle.net/wbj7e79p/.

Как вы можете видеть, это беспорядок на семь шагов. Причина в том, что .progressbar li width, который зафиксирован на 25%, мы хотели сделать его динамической базой по количеству шагов.

Итак, мы попробовали ширину: calc (100%/steps) или calc (100%/counter(steps)), но никто из них не работал. Есть идеи !


Пожалуйста, обратите внимание, что мы строим компонент, построить индикатор на лету, поэтому мы не можем найти фактическое количество шагов

+0

Дизайнер предложение: первый элемент должен быть всегда активным (потому что это первый шаг), но не должны иметь цветную правильную линию. Только на втором шаге вы окрашиваете линию, соединяющую эти два шага, и так далее ... –

ответ

5

вы считаете ли Flexbox?

body { 
 
    font-family: 'Alegreya Sans', sans-serif; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 
.container { 
 
    margin: 20px auto; 
 
} 
 
.progressbar { 
 
    margin: 0; 
 
    padding: 0; 
 
    counter-reset: step; 
 
    display: flex; 
 
} 
 
.progressbar li { 
 
    list-style-type: none; 
 
    flex: 1; 
 
    font-size: 12px; 
 
    position: relative; 
 
    text-align: center; 
 
    text-transform: uppercase; 
 
    color: #7d7d7d; 
 
} 
 
.progressbar li:before { 
 
    width: 30px; 
 
    height: 30px; 
 
    content: counter(step); 
 
    counter-increment: step; 
 
    line-height: 30px; 
 
    border: 2px solid #7d7d7d; 
 
    display: block; 
 
    text-align: center; 
 
    margin: 0 auto 10px auto; 
 
    border-radius: 50%; 
 
    background-color: white; 
 
} 
 
.progressbar li:after { 
 
    width: 100%; 
 
    height: 2px; 
 
    content: ''; 
 
    position: absolute; 
 
    background-color: #7d7d7d; 
 
    top: 15px; 
 
    left: -50%; 
 
    z-index: -1; 
 
} 
 
.progressbar li:first-child:after { 
 
    content: none; 
 
} 
 
.progressbar li.active { 
 
    color: green; 
 
} 
 
.progressbar li.active:before { 
 
    border-color: #55b776; 
 
} 
 
.progressbar li.active + li:after { 
 
    background-color: #55b776; 
 
}
<h1>Four Steps</h1> 
 
<div class="container"> 
 
    <ul class="progressbar"> 
 
    <li class="active">login</li> 
 
    <li>choose interest</li> 
 
    <li>add friends</li> 
 
    <li>View map</li> 
 
    </ul> 
 
</div> 
 
<h1> Seven Steps</h1> 
 

 
<div class="container"> 
 
    <ul class="progressbar"> 
 
    <li class="active">login</li> 
 
    <li>choose interest</li> 
 
    <li>add friends</li> 
 
    <li>remove</li> 
 
    <li>fix users</li> 
 
    <li>review</li> 
 
    <li>save all</li> 
 
    </ul> 
 
</div>

+0

Уважаемый @Paulie_D спасибо, он работает отлично. Я отметил это как правильный ответ. Но у меня есть крошечная проблема и ценю ваш комментарий. Если я установил направление страницы на 'rtl', первый шаг и последние шаги будут неправильными. См. Https://jsfiddle.net/kq2qdvm5/. Любые комментарии? –

+0

Похоже, у вас есть основа для другого вопроса. –