У меня есть изображения разной высоты, и я хочу разместить их в черепичной галерее, как показано на рисунке ниже:
Однако я также хочу, чтобы это было репрессивным, поэтому мой подход к этой работе был следующим:
1) Использование HTML Я создал три дивы, #grid1
, #grid2
и #grid3
. И изображения помещаются внутри этих трех сеток в div div, у которых есть класс .gridElement
который содержит изображения.
<!--Grid System-->
<div id="grid1">
<!--Grid 1-->
<div class="gridElement">
<img alt="image" src="assets/images/image.jpg">
</div>
</div>
<div id="grid2">
<!--Grid 2-->
<div class="gridElement">
<img alt="image" src="assets/images/image.jpg">
</div>
</div>
<div id="grid3">
<!--Grid 3-->
<div class="gridElement">
<img alt="image" src="assets/images/image.jpg">
</div>
</div>
<!--/Grid System-->
2) Вот CSS, используя Media Query:
/*Grid System*/
#grid1,#grid2,#grid3 {
width: 33.333%;
float: left;
}
#grid1 {
padding-right: 20px;
}
#grid2 {
padding: 0 10px;
}
#grid3 {
padding-left: 20px;
}
/*Gird Elements*/
.gridElement {
margin-bottom: 30px;
overflow: hidden;
}
#grid1 .gridElement:last-of-type,
#grid2 .gridElement:last-of-type,
#grid3 .gridElement:last-of-type {
margin-bottom: 0;
}
#grid1 img,#grid2 img,#grid3 img {
width: 100%;
}
а также
@media screen and (max-width: 1024px) {
/*Grid System*/
#grid1,#grid2,#grid3 {
width: 50%;
}
#grid3 {
display: none;
}
}
а также
@media screen and (max-width: 770px) {
/*Grid System*/
#grid1,#grid2,#grid3 {
width: 100%;
}
#grid1,#grid2,#grid3 {
padding: 0;
display: block;
}
#grid1 .gridElement:last-of-type,
#grid2 .gridElement:last-of-type {
margin-bottom: 30px;
}
а также
@media screen and (max-width: 500px) {
/*Grid System*/
.gridElement {
margin-bottom: 20px;
}
#grid1 .gridElement:last-of-type,
#grid2 .gridElement:last-of-type {
margin-bottom: 20px;
}
Они теории: когда размер экрана превышает 1024 пикселей, по умолчанию будут отображаться три сетки. Однако, когда размер экрана ниже 1024px и выше 770px с использованием CSS #grid3
скрыт и с использованием JavaScript, я пытаюсь отправить все .girdElements
которые находятся внутри # grid3, равно равно # grid1 и # grid2. Когда размер экрана ниже 770 пикселей, все вернутся в нормальное состояние, и все сетки будут показаны.
Проблема? Мне удалось получить все, работая, но JavaScript - пожалуйста, кто-нибудь может помочь мне создать функцию, которая будет отправлять все.girdElements, которые находятся внутри # grid3 одинаково, на # grid1 и # grid2, когда размер экрана ниже 1024 пикселей и выше 770 пикселей? "при загрузке и изменении размера".
Вы можете попробовать что-то вроде этого:
var toggle = true;
$('#grid3').children('.gridElement').each(function (index) {
if (toggle) {
$('#grid1').append($(this));
toggle = false;
} else {
$('#grid2').append($(this));
toggle = true;
}
Вот рабочий пример JSFiddle, сортировка
элементы внутри сеток
Вы можете использовать кладку для достижения аналогичного эффекта. Он использует абсолютное позиционирование вместо фиксированного количества столбцов. В любом случае, он выглядит одинаково и приспосабливается к ширине экрана.
Это решение лучше с jQuery, но есть способы вычислить фактическую высоту элементов.
Во-первых, вы должны пометить каждый элемент в grid1, grid2, grid3 как принадлежащий их соответствующей сетке, например, используя класс или данные. Затем это своего рода "хронология", которая хранит "порядок" для каждого элемента.
Если вы хотите, чтобы все элементы в grid3 были добавлены к grid1 и grid2, вы можете применить следующий алгоритм:
Для каждого элемента:
а. Вычислите ширину сетки 1 и сравните ее с сеткой grid2. б. Если grid2 выше, добавьте элемент в grid1. В противном случае добавьте его в grid2.
Столбец grid3 будет скрыт.
Рекомендуемый подход - использование jQuery для оценки.height() grid1 и grid2 и перемещения элементов.
Чтобы вернуться к компоновке 3-col, просто возьмите элементы с маркером grid3 и поместите их обратно в grid3, упорядоченный по хронологии.
(черт побери, все еще возиться с уценкой, пожалуйста, если редактор может мне помочь...)
Попробуйте этот пример кода (не считая факта о критериях сортировки - не гарантируется безупречность - это просто для иллюстрации идеи):
var grid1 = $("#grid1");
var grid2 = $("#grid2");
var grid3 = $("#grid3");
//compressing - distributing grid3 between grid1 and grid2
function compress()
{
grid3.hide();
$(".item-in-grid3").each(function(i, e){
//never assign "width:" to any grid (1, 2, 3) in css, so it can
//be dynamic and compute height and compare them on each iteration.
if (grid1.height() > grid2.height())
{
$(this).appendTo(grid2);
}
else
{
$(this).appendTo(grid1);
}
});
}
//return back the elements to grid3
function decompress()
{
$(".item-in-grid3").each(function(i, e){
$(this).appendTo(grid3);
});
grid3.show();
}