Шаговый индикатор - отзывчивый css - PullRequest
0 голосов
/ 15 апреля 2020

Я хотел бы сделать адаптивный шагер, где линии между степперами соединены с каждым шагом. В настоящее время работает только с 4 шагами, он перестает отвечать на запросы, если он больше или меньше 4 шагов.

Вот jsfiddle , работающий в настоящее время с 4 шагами.

  .bullet.completed::after {
      content: '';
      position: absolute;
      bottom: 10px;
      height: 1px;
      width: calc(133% - 21px);
      background-color: #000;
      margin-left: 7px;  
  }

Я пытался изменить эту часть, но она не работает. Спасибо за продвижение!

#stepProgressBar {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  width: 90%;
  margin: 0 auto;
  margin-bottom: 40px;
}

.step {
  text-align: center;
  width: 20%;
  position: relative;
}

.step-text {
  margin-bottom: 10px;
  color: #000;
}

.bullet {
  border: 1px solid #000;
  height: 20px;
  width: 20px;
  color: #000;
  display: inline-block;
  transition: background-color 500ms;
  line-height: 20px;
}

.bullet.completed {
  color: white;
  background-color: #000;
}

.bullet.completed::after {
  content: '';
  position: absolute;
  bottom: 10px;
  height: 1px;
  width: calc(133% - 21px);
  background-color: #000;
  margin-left: 7px;  
}


/* Base styles and helper stuff */

.hidden {
  display: none;
}

button {
  padding: 5px 10px;
  border: 1px solid black;
  transition: 250ms background-color;
}

button:hover {
  cursor: pointer;
  background-color: black;
  color: white;
}

button:disabled:hover {
  opacity: 0.6;
  cursor: not-allowed;
}

.text-center {
  text-align: center;
}

.container {
  max-width: 100%;
  margin: 0 auto;
  margin-top: 20px;
  padding: 40px;
}
<div class="container">
  <div id="stepProgressBar">
    <div class="step">
      <p class="step-text">Super Duper Long Title</p>
      <div class="bullet completed">1</div>
    </div>
    <div class="step">
      <p class="step-text">Long Long Title</p>
      <div class="bullet completed">2</div>
    </div>
    <div class="step">
      <p class="step-text">Loooong Title</p>
      <div class="bullet completed">3</div>
    </div>
    <div class="step">
      <p class="step-text">Loooong Title</p>
      <div class="bullet">4</div>
    </div>
  </div>
</div>

1 Ответ

0 голосов
/ 15 апреля 2020

Измените ваш .bullet.completed::after на display:flex и установите его width на 100% минус измененное значение margin-left, равное ширине .bullet (20px):

.bullet.completed::after {
  content: '';
  position: absolute;
  bottom: 10px;
  height: 1px;
  display:flex;            /* Added */
  width:calc(100% - 20px); /* Modified */
  background-color: #000;
  margin-left: 20px;       /* Modified */
}

Вот оно с семью шагами:

const previousBtn = document.getElementById('previousBtn');
const nextBtn = document.getElementById('nextBtn');
const finishBtn = document.getElementById('finishBtn');
const content = document.getElementById('content');
const bullets = [...document.querySelectorAll('.bullet')];

const MAX_STEPS = 7;
let currentStep = 1;

nextBtn.addEventListener('click', () => {
  bullets[currentStep - 1].classList.add('completed');
  currentStep += 1;
  previousBtn.disabled = false;
  if (currentStep === MAX_STEPS) {
    nextBtn.disabled = true;
    finishBtn.disabled = false;
  }
  content.innerText = `Step Number ${currentStep}`;
});


previousBtn.addEventListener('click', () => {
  bullets[currentStep - 2].classList.remove('completed');
  currentStep -= 1;
  nextBtn.disabled = false;
  finishBtn.disabled = true;
  if (currentStep === 1) {
    previousBtn.disabled = true;
  }
  content.innerText = `Step Number ${currentStep}`;
});

finishBtn.addEventListener('click', () => {
  location.reload();
});
#stepProgressBar {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  width: 90%;
  margin: 0 auto;
  margin-bottom: 40px;
}

.step {
  text-align: center;
  width: 20%;
  position: relative;
}

.step-text {
  margin-bottom: 10px;
  color: #000;
}

.bullet {
  border: 1px solid #000;
  height: 20px;
  width: 20px;
  color: #000;
  display: inline-block;
  transition: background-color 500ms;
  line-height: 20px;
}

.bullet.completed {
  color: white;
  background-color: #000;
}

.bullet.completed::after {
  content: '';
  position: absolute;
  bottom: 10px;
  height: 1px;
  width:calc(100% - 20px);
  display:flex;
  background-color: #000;
  margin-left: 20px;  
}


/* Base styles and helper stuff */

.hidden {
  display: none;
}

button {
  padding: 5px 10px;
  border: 1px solid black;
  transition: 250ms background-color;
}

button:hover {
  cursor: pointer;
  background-color: black;
  color: white;
}

button:disabled:hover {
  opacity: 0.6;
  cursor: not-allowed;
}

.text-center {
  text-align: center;
}

.container {
  max-width: 100%;
  margin: 0 auto;
  margin-top: 20px;
  padding: 40px;
}
<div class="container">
  <div id="stepProgressBar">
    <div class="step">
      <p class="step-text">Super Duper Long Title</p>
      <div class="bullet">1</div>
    </div>
    <div class="step">
      <p class="step-text">Long Long Title</p>
      <div class="bullet">2</div>
    </div>
    <div class="step">
      <p class="step-text">Loooong Title</p>
      <div class="bullet">3</div>
    </div>
    <div class="step">
      <p class="step-text">Title</p>
      <div class="bullet ">4</div>
    </div>
    <div class="step">
      <p class="step-text">Title</p>
      <div class="bullet ">5</div>
    </div>
    <div class="step">
      <p class="step-text">Title</p>
      <div class="bullet ">6</div>
    </div>
    <div class="step">
      <p class="step-text">Title</p>
      <div class="bullet ">7</div>
    </div>
  </div>
  <div id="main">
    <p id="content" class="text-center">Step Number 1</p>
    <button id="previousBtn" class="hidden"></button>
    <button id="nextBtn">Next</button>
    <button id="finishBtn" class="hidden">Finish</button>
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...