Например, как в ВК при загрузке фотографий. Речь идет о таком отображении:
UPD:
Возможно, для вывода изображения используется алгоритм TreeMap. Но не ясно, как задавать "веса" изображениям.
Ответ
Алгоритм с сохранением порядка следования картинок.
Определяем количество строк как sqrt( сумма отношений сторон всех картинок / отношение сторон блока ), где отношение сторон определяется как ширина делённая на высоту.
Определяем высоту строки как высоту блока делённую на число строк.
Определяем общую длину всех картинок масштабированных к высоте строки.
Заполняем строки так чтобы ширина строки была максимально приближена к ширине оставшихся картинок делённой на количество оставшихся строк.
Перераспределяем высоты строк. Для этого для каждой строки считаем новую высоту так, чтобы ширина строки стала равной ширине блока. разности между новыми и старыми высотами строк суммируем отдельно по переполненным и недозаполненным строкам. В зависимости от того какая разность больше пропорционально уменьшаем изменения высот в одной из этих групп, чтобы эти суммы сравнялись. (Галочка в примере отменяет последнее выравнивание, что позволяет сохранить соотношения сторон картинок, но нарушает высоту блока).
Для строк у которых осталось свободное пространство (до ширины блока) масштабируем картинки так, чтобы занять всю ширину блока, после чего обрезаем их по высоте с центрированием по вертикали.
В строках, где нет свободного пространства масштабируем картинки так, чтобы их высота была равна высоте строки, и обрезаем их по ширине с центрированием по горизонтали пропорционально их отношению сторон так, чтобы общая ширина строки была равна ширине блока.
var iimgs=document.getElementById("iimgs").childNodes;
var c=document.getElementById("c");
var images=[];
function packimgs(freeH) {
var padding = 5;
var divWidth = 510+padding;
var divHeight = 350+padding;
var w=0;
for(var i=0;i
Алгоритм с изменением порядка картинок.
Определяем количество строк как sqrt( сумма отношений сторон всех картинок / отношение сторон блока ), где отношение сторон определяется как ширина делённая на высоту. Определяем высоту строки как высоту блока делённую на число строк. Сортируем картинки по соотношению сторон, ставя в начало самые широкие. Распределяем картинки по строкам, помещая очередную картинку в строку с наибольшим свободным пространством, которое определяется как ширина блока минус сумма ширин картинок смасштабированных так, чтобы их высота была равна высоте строки Для строк у которых осталось свободное пространство (до ширины блока) масштабируем картинки так, чтобы занять всю ширину блока, после чего обрезаем их по высоте с центрированием по вертикали. В строках, где нет свободного пространства масштабируем картинки так, чтобы их высота была равна высоте строки, и обрезаем их по ширине с центрированием по горизонтали пропорционально их отношению сторон так, чтобы общая ширина строки была равна ширине блока.
var iimgs=document.getElementById("iimgs").childNodes; var c=document.getElementById("c"); var images=[]; function packimgs() { var divWidth = 510; var divHeight = 350; var padding = 5; var w=0; for(var i=0;i
Комментариев нет:
Отправить комментарий