Заставьте дочерние элементы растягиваться на одну треть ширины родителя (в карусели) - PullRequest
0 голосов
/ 28 мая 2018

Я работаю над (своего рода) каруселью с элементами, выровненными горизонтально.

Каждый из дочерних элементов (их будет около дюжины) должен растягиваться на одну треть ширина родителя.Три элемента должны быть видны одновременно.

Я использовал Bootstrap 4 и несколько пользовательских CSS.JavaScript не требуется, карусель полагается на ручную прокрутку для отображения своих элементов.

Установка width: 33.333% для элементов списка не работает для очень малых или очень больших разрешений, как вы можете видеть.Я также хотел бы, чтобы элементы растягивались на на полную ширину при сверхмалых разрешениях .

Что такое жизнеспособная, специфичная для flex-box альтернатива?

html,
body {
  padding: 0;
  margin: 0;
  height: 100%;
}

.page-wrapper {
  min-height: 100%;
}

.hero {
  height: 100vh;
  background: #212121;
  justify-content: center;
  align-items: center;
}

#carousel {
  list-style-type: none;
  margin: 0;
  padding: 0;
  overflow-x: scroll;
  justify-content: left;
  align-items: center;
}

#carousel li {
  padding: 0 0 70px 0;
  width: 33.333%;
}

#carousel li a {
  text-decoration: none;
  color: #fff;
}

#carousel li img {
  display: block;
  width: 100%;
}

#carousel li .caption {
  padding-top: 20px;
}

#carousel li h2 {
  font-size: 20px;
  line-height: 1;
  margin: 0;
  padding: 0;
}

#carousel li p {
  font-size: 10px;
  padding: 0;
  margin: 5px 0 0 0;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" rel="stylesheet" />
<div class="page-wrapper">
  <div class="hero d-flex">
    <ul id="carousel" class="d-flex">
      <li class="col-md-4">
        <a href="#"><img src="https://placeimg.com/300/200/people" alt="">
          <div class="caption">
            <h2>Lorem ipsum dolor</h2>
            <p>A true story</p>
          </div>
        </a>
      </li>
      <li class="col-md-4">
        <a href="#"><img src="https://placeimg.com/300/200/nature" alt="">
          <div class="caption">
            <h2>Lorem</h2>
            <p>Lorem ipsum dolor sit amet, consectetur</p>
          </div>
        </a>
      </li>
      <li class="col-md-4">
        <a href="#"><img src="https://placeimg.com/300/200/arch" alt="">
          <div class="caption">
            <h2>My neighborhood</h2>
            <p>Lorm ipsum dolor</p>
          </div>
        </a>
      </li>
      <li class="col-md-4">
        <a href="#"><img src="https://placeimg.com/300/200/animals" alt="">
          <div class="caption">
            <h2>Into the wild</h2>
            <p>Lorem ipsum dolor sit amet, consectetur</p>
          </div>
        </a>
      </li>
    </ul>
  </div>
</div>

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Начальная настройка гибкого контейнера: flex-shrink: 1.Это означает, что гибкие элементы могут сжиматься, чтобы они не переполняли контейнер.Вот что вы видите в макете.

Вам необходимо отключить flex-shrink.

Вместо этого:

#carousel li {
    padding: 0 0 70px 0;
    width: 33.333%;
}

Попробуйте это:

#carousel li {
    padding: 0 0 70px 0;
    width: 33.333%;
    flex-shrink: 0;
}

Или, еще лучше (для большей эффективности), попробуйте это:

#carousel li {
    padding: 0 0 70px 0;
    flex: 0 0 33.333%; /* flex-grow, flex-shrink, flex-basis */
}
0 голосов
/ 28 мая 2018

Я смог получить точно желаемый эффект, спасибо o 2 участникам сообщества:

html,
body {
  padding: 0;
  margin: 0;
  height: 100%;
}
.page-wrapper {
  min-height: 100%;
}
.hero {
  height: 100vh;
  background: #212121;
  justify-content: center;
  align-items: center;
}
#carousel {
  display: flex;
  list-style-type: none;
  overflow-x: scroll;
  margin: 0;
  padding: 0;
  justify-content: left;
  align-items: center;
}
#carousel li {
  padding: 0 0 70px 0;
  flex-shrink: 0;
}
#carousel a {
  text-decoration: none;
  color: #fff;
}
#carousel img {
  display: block;
  width: 100%;
}
#carousel .caption {
  padding: 20px 20px 0 20px;
}
#carousel h2 {
  font-size: 20px;
  line-height: 1;
  margin: 0;
  padding: 0;
}
#carousel p {
  font-size: 10px;
  padding: 0;
  margin: 5px 0 0 0;
}
<link href="//stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" rel="stylesheet"/>
<div class="page-wrapper">
  <div class="hero d-flex">
      <ul id="carousel">
        <li class="col-xs-12 col-sm-6 col-md-4">
          <a href="#">
        <img src="https://placeimg.com/600/400/people" alt="">
        <div class="caption">
          <h2>Lorem</h2>
          <p>A true story</p>
        </div>
        </a>
        </li>
        <li class="col-xs-12 col-sm-6 col-md-4">
          <a href="#">
        <img src="https://placeimg.com/600/400/nature" alt="">
        <div class="caption">
          <h2>Lorem ipsum</h2>
          <p>Lorem ipsum. Dolor sit amet.</p>
        </div>
        </a>
        </li>
        <li class="col-xs-12 col-sm-6 col-md-4">
          <a href="#">
        <img src="https://placeimg.com/600/400/arch" alt="">
        <div class="caption">
          <h2>Lorem</h2>
          <p>Lorem ipsum. Dolor sit amet</p>
        </div>
        </a>
        </li>
        <li class="col-xs-12 col-sm-6 col-md-4">
          <a href="#">
        <img src="https://placeimg.com/600/400/animals" alt="">
        <div class="caption">
          <h2>Into the wild</h2>
          <p>Lorem ipsum dolor sit amet, consectetur</p>
        </div>
        </a>
        </li>
      </ul>
  </div>
</div>
0 голосов
/ 28 мая 2018

Добавьте col-4 класс вместо col-md-4.Это позволит сохранить ширину div на 33,3% для всех разрешений экрана

html, body {
  padding: 0;
  margin: 0;
  height: 100%;
}
.page-wrapper {
  min-height: 100%;
}
.hero {
  height: 100vh;
  background: #212121;
  justify-content: center;
  align-items: center;
}
#carousel {
  list-style-type: none;
  margin: 0;
  padding: 0;
  overflow-x: scroll;
  justify-content: left;
  align-items: center;
}
#carousel li {
  padding: 0 0 70px 0;
}
#carousel li a {
  text-decoration: none;
  color: #fff;
}
#carousel li img {
  display: block;
  width: 100%;
}
#carousel li .caption {
  padding-top: 20px;
}
#carousel li h2 {
  font-size: 20px;
  line-height: 1;
  margin: 0;
  padding: 0;
}
#carousel li p {
  font-size: 10px;
  padding: 0;
  margin: 5px 0 0 0;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" rel="stylesheet"/>
<div class="page-wrapper">
  <div class="hero d-flex">
    <ul id="carousel" class="d-flex">
      <li class="col-4">
        <a href="#"><img src="https://placeimg.com/300/200/people" alt="">
        <div class="caption">
          <h2>Lorem ipsum dolor</h2>
          <p>A true story</p>
        </div>
        </a>
      </li>
      <li class="col-4">
        <a href="#"><img src="https://placeimg.com/300/200/nature" alt="">
        <div class="caption">
          <h2>Lorem</h2>
          <p>Lorem ipsum dolor sit amet, consectetur</p>
        </div>
        </a>
      </li>
      <li class="col-4">
        <a href="#"><img src="https://placeimg.com/300/200/arch" alt="">
        <div class="caption">
          <h2>My neighborhood</h2>
          <p>Lorm ipsum dolor</p>
        </div>
        </a>
      </li>
      <li class="col-4">
        <a href="#"><img src="https://placeimg.com/300/200/animals" alt="">
        <div class="caption">
          <h2>Into the wild</h2>
          <p>Lorem ipsum dolor sit amet, consectetur</p>
        </div>
        </a>
      </li>
    </ul>
  </div>
</div>

РЕДАКТИРОВАТЬ для вопросов в комментарии (не обновляется в рабочем ответе)

Попробуйте эту разметку HTML, она должнаработать как вы ожидаете.

<div class="hero container-fluid">
    <ul id="carousel" class="row">
      <li class="col-12 col-sm-6 col-md-4">
        <a href="#"><img src="https://placeimg.com/300/200/people" alt="">
        <div class="caption">
          <h2>Lorem ipsum dolor</h2>
          <p>A true story</p>
        </div>
        </a>
      </li>
      <li class="col-12 col-sm-6 col-md-4">
        <a href="#"><img src="https://placeimg.com/300/200/nature" alt="">
        <div class="caption">
          <h2>Lorem</h2>
          <p>Lorem ipsum dolor sit amet, consectetur</p>
        </div>
        </a>
      </li>
      <li class="col-12 col-sm-6 col-md-4">
        <a href="#"><img src="https://placeimg.com/300/200/arch" alt="">
        <div class="caption">
          <h2>My neighborhood</h2>
          <p>Lorm ipsum dolor</p>
        </div>
        </a>
      </li>
      <li class="col-12 col-sm-6 col-md-4">
        <a href="#"><img src="https://placeimg.com/300/200/animals" alt="">
        <div class="caption">
          <h2>Into the wild</h2>
          <p>Lorem ipsum dolor sit amet, consectetur</p>
        </div>
        </a>
      </li>
    </ul>
  </div>
...