Ответ 1
Вы должны использовать .clearfix
, как описано в разделе сбрасываемых сбрасыванием Grid документации Bootstrap: https://getbootstrap.com/docs/3.3/css/#grid-responsive-resets
Я пытаюсь создать сетку эскизов, где у каждого эскиза есть изображение и метка. Он отлично работает, если все метки имеют одинаковую длину, потому что тогда все миниатюры имеют одинаковую высоту:
http://www.bootply.com/iSqwWyx5ms
Однако, если я сокращу самый правый текст эскиза, часть строки ниже попадает в новую строку, как показано ниже:
http://www.bootply.com/Wqd021aaeM
Я бы хотел, чтобы вторая строка начиналась с самой нижней точки, в которой закончилась первая строка.
Я знаю, что я могу решить это с помощью JavaScript - найти самый длинный миниатюру в каждой строке и установить другие эскизы для этой высоты. Вопрос в том, есть ли у меня какой-либо способ сделать это или что-то еще, что может решить мою проблему, используя только CSS?
Обновление: я не знаю заранее, сколько элементов у меня есть в одной строке. Например, на маленьком экране у меня было бы 2 элемента подряд, а на большем экране - 3, поэтому решения, которые устанавливаются при запуске новой строки, не подходят для меня.
Вы должны использовать .clearfix
, как описано в разделе сбрасываемых сбрасыванием Grid документации Bootstrap: https://getbootstrap.com/docs/3.3/css/#grid-responsive-resets
Если вы не знаете, сколько столбцов у вас есть, вы можете сделать:
.row.fix {
display: flex;
flex-wrap: wrap;
width:100%; /*not always necessary*/
}
Рабочая скрипта: https://jsfiddle.net/wqdm1jjt/
Автор: Хуан Мигель
Я думаю, что лучше использовать несколько строк js
. С CSS у вас может быть только новая "строка" с использованием класса clearfix
(как было сказано ранее), но каждый div будет иметь разную высоту.
Если вы хотите установить одну и ту же высоту для каждого динамического div, я думаю, вы могли бы сделать это только через js.
$(document).ready(function() {
var maxHeight = 0;
$(".equalize").each(function(){
if ($(this).height() > maxHeight) { maxHeight = $(this).height(); }
});
$(".equalize").height(maxHeight);
});
Ниже приведена рабочая демонстрация на основе вашего кода.
Все, что вам нужно сделать, это предоставить один и тот же класс для каждого основного div
внутри col--, а затем запустить функцию each()
в js, которая дает им ту же высоту (max-one).
Ваша структура HTML должна выглядеть так:
<div class="container">
<div class="col-md-4">
<div class="thumbnail equalize">
<!-- your HTML content -->
</div> <!-- /.thumbnail equalize -->
</div> <!-- /.col-md-4 -->
</div> <!-- /.container -->
Вы можете использовать тот же трюк, который я описал в этом ..
В вашем случае вы должны изменить медиа-запросы, чтобы они выглядели следующим образом:
@media (min-width: 768px) and (max-width: 991px) {
.portfolio>.clear:nth-child(4n+4)::before {
content: '';
display: table;
clear: both;
}
}
@media (min-width: 992px) {
.portfolio>.clear:nth-child(6n+6)::before {
content: '';
display: table;
clear: both;
}
}
768px - 991px - это размер sm, у вас есть col-sm-2, поэтому вы хотите, чтобы каждый четвёртый div очищался. 992px и выше относится к размеру md, где у вас есть col-md-3, поэтому вы хотите, чтобы каждый 6-й div очищался от такого размера. Это проще, чем использование откликов, хотя оно основано на той же самой посылке.
P.S. Я добавил div с классом строк внутри вашего контейнера (потому что вам нужен один внутри контейнера, иначе у вас будет двойное заполнение снаружи), и я также дал ему класс портфеля для легкого таргетинга. Здесь ваш обновленный Bootply.
вы можете использовать clear: left
и применять его для каждого первого дочернего элемента в строке. Например, если у вас есть 4 элемента в строке, вы можете использовать:
.my-row>:nth-child(3n+1) {
clear:left;
background-color: red; // just to see if the first item in row is matched
}
Если вы знаете, сколько эскизов широко используется, вы можете использовать <div class="row"></div>
для обертки эскизов группами из трех (или N).
В противном случае обходным путем было бы установить фиксированную высоту для элемента эскиза. На вашем примере
.thumbnail {
height:420px;
}
Однако, если высота вашего эскиза и текст могут сильно различаться, это будет либо выглядеть неудобно, либо скрывать часть img/label.
Вы также можете сделать только clearfix для CSS. Просто добавьте auto-clear
в row
.
@media (min-width:1200px){
.auto-clear .col-lg-1:nth-child(12n+1){clear:left;}
.auto-clear .col-lg-2:nth-child(6n+1){clear:left;}
.auto-clear .col-lg-3:nth-child(4n+1){clear:left;}
.auto-clear .col-lg-4:nth-child(3n+1){clear:left;}
.auto-clear .col-lg-6:nth-child(odd){clear:left;}
}
@media (min-width:992px) and (max-width:1199px){
.auto-clear .col-md-1:nth-child(12n+1){clear:left;}
.auto-clear .col-md-2:nth-child(6n+1){clear:left;}
.auto-clear .col-md-3:nth-child(4n+1){clear:left;}
.auto-clear .col-md-4:nth-child(3n+1){clear:left;}
.auto-clear .col-md-6:nth-child(odd){clear:left;}
}
@media (min-width:768px) and (max-width:991px){
.auto-clear .col-sm-1:nth-child(12n+1){clear:left;}
.auto-clear .col-sm-2:nth-child(6n+1){clear:left;}
.auto-clear .col-sm-3:nth-child(4n+1){clear:left;}
.auto-clear .col-sm-4:nth-child(3n+1){clear:left;}
.auto-clear .col-sm-6:nth-child(odd){clear:left;}
}
@media (max-width:767px){
.auto-clear .col-xs-1:nth-child(12n+1){clear:left;}
.auto-clear .col-xs-2:nth-child(6n+1){clear:left;}
.auto-clear .col-xs-3:nth-child(4n+1){clear:left;}
.auto-clear .col-xs-4:nth-child(3n+1){clear:left;}
.auto-clear .col-xs-6:nth-child(odd){clear:left;}
}
Почему вы не используете <div class="row"></div>
Посмотрите на это http://www.bootply.com/6bIZkSGcA1
Это то, что вы хотели.
P.S. Это напрямую ограничит границы для строки.