Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Выравнивание <div> (https://javascript.ru/forum/dom-window/46686-vyravnivanie-div.html)

airy 19.04.2014 15:07

Выравнивание <div>
 
Вложений: 2
Здравствуйте. Только начал. Изучать html, css и т.д.

Возможно задача уже решена и является тривиальной.

Есть много однотипных блоков
<div class="bg">
<div class="product"> </div>
<div class="product"> </div>
<div class="product"> </div>
<div class="product"> </div>
<div class="product"> </div>
<div class="product"> </div>
</div>
(см. картинки)
с содержимым разного количества.

Как сделать чтобы блоки выстроились в таблицу, при этом высота строк таблицы?
была бы равна высоте максимального элемента в строке

как есть

http://javascript.ru/forum/attachmen...d=139790530 3

как хотелось бы

http://javascript.ru/forum/attachmen...d=139790530 7

Прошу хотя бы натолкнуть на мысль, какие функции по изучать
Или может какая-нибудь готовая функция jquery и т.д.
Заранее благодарен

p.s. если не тот раздел, прошу перекинуть

airy 19.04.2014 16:23

Что помню из института:

1) Пробежать с 0 по 2 элемент, найти Hmax
2) Присвоить H0=Hmax, H1=Hmax, H2=Hmax,
3) Берем следующие 3 элемента и повторяем цикл

:-) а вот с синтаксисом буду большие проблемы

p.s. возможно есть и более элегантное решение

jsnb 19.04.2014 18:05

Так? http://learn.javascript.ru/play/hPVOrc
Ну, или приведите конкретную верстку, а там посмотрим.

airy 19.04.2014 21:07

Да, спасибо. Это то что нужно. Все работает.
Вынес скрипт в отдельный файл:

function lineIt(massiv) {
var divs = $(massiv);
while (divs.length > 0) {
var row = $(divs.splice(0, 3));
var rowHeightArr = row.map(function(){ return $(this).outerHeight(); }).get();
var maxHeight = Math.max.apply(0, rowHeightArr);
row.height(maxHeight);
}
}
$(document).ready(function() {
lineIt($(".box-product > div"));
});

Это будет наглостью :) но спрошу,
как подправить функцию чтобы, передавать в нее не сами блоки,
над которыми совершаются действия, а их родительский блок?
У меня это ".box-content"

Aetae 19.04.2014 21:37

http://chikuyonok.ru/2011/04/inline-vertical-align/
И никакого js.

airy 20.04.2014 00:08

И это тоже работает, спасибо.
В первую очередь искал именно такой способ, без js.
(Правда придётся под него сейчас несколько шаблонов править.)

Спасибо еще раз.

jsnb 20.04.2014 03:43

Цитата:

Сообщение от airy (Сообщение 308443)
как подправить функцию чтобы, передавать в нее не сами блоки, над которыми совершаются действия, а их родительский блок?
У меня это ".box-content"

Так? http://learn.javascript.ru/play/oly3Tb
Или имеется ввиду что таких .box-content несколько на странице и для каждого надо сделать выравнивание?

airy 20.04.2014 09:48

Да, .box-content несколько на странице. В каждом может быть разное (не кратное 3) выравниваемых блоков.

И у .box-content нет дополнительных уникальных идентификаторов.

Второй вариант вашей функции отлично справляется, но как вы уже поняли, она выравнивает каждые три встречающихся на странице блока, в независимости в одном ли .box-content эти блоки расположены.

Спасибо, что помогаете :)

jsnb 20.04.2014 10:22

Цитата:

Сообщение от airy (Сообщение 308482)
Второй вариант вашей функции отлично справляется, но как вы уже поняли, она выравнивает каждые три встречающихся на странице блока, в независимости в одном ли .box-content эти блоки расположены.)

Ну так прогнать функцию для каждого .box-content по отдельности:
Что-то типо этого:
$('.box-content').each( function() { lineIt( $(this) ) } )

airy 20.04.2014 15:10

Да, все заработало, спасибо.
Вы очень помогли :)


Часовой пояс GMT +3, время: 12:20.