Intereting Posts
Как получить предыдущий url с помощью PHP Почему каждый раз, когда я использую scandir (), я получаю периоды в начале массива? Открытая ошибка zipArchive в PHP Как глобально изменить значение пользовательских измерений для идентификатора клиента? json_decode () не работает с этой допустимой строкой JSON Префикс MySQL таблиц или многих баз данных MySQL? Не удается найти массив в PHP in_array для наличия нескольких игл как переписывать Url для совместного размещения вспомогательных папок godaddy PHP: mail () vs SendMail Динамическое заполнение выпадающего списка с использованием данных JSON Получить координаты широты / долготы с карты Google с помощью маркера страница карты становится пустой после вставки php-кода Не удалось выполнить запрос php curl с номером порта Как объединить значения из нескольких строк с одним и тем же идентификатором в запятую, разделенные уникальным идентификатором PHP Force Загрузить удаленный файл

Равномерно распределять изображения по столбцам в галерее

Краткое объяснение

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

Изображения для столбцов собираются из каталога и помещаются в массив с использованием функции PHP glob() . Это легкая часть…

Пример того, как выглядит галерея:

Основной дизайн галереи

Проблема

Поскольку эти изображения загружаются и помещаются в столбцы динамически, существует вероятность того, что столбцы могут сильно отличаться по высоте.

Например, если в колонке 1 были помещены две портретные фотографии, а две колонковые фотографии были помещены в колонку 2, столбцы были бы очень неравномерными:

Проблема с этим дизайном

Весьма маловероятно, что столбцы будут когда-либо соответствовать по высоте, но я бы хотел, чтобы они были как можно ближе к данным изображениям и поэтому хотели бы составить алгоритм, который будет смотреть на полученные изображения и поместить их в столбцы, чтобы верните три столбца, которые как можно ближе к высоте.

Так, например, скрипт исправил бы вышеупомянутую проблему, повторно отсортировав изображения и разместив их так:

Результат сортировки изображений

Я могу написать это, если у меня есть правильный алгоритм, я просто не могу придумать, как это сделать. Может ли кто-нибудь предложить какие-либо шаги?

Возможное решение

Один из методов, о которых я думал (я думаю, что будут лучшие способы, поскольку я думаю, что это испорчено):

  1. Добавьте высоту всех объединенных изображений и разделите их на количество столбцов (3). Это даст нам высоту для
  2. Распределите изображения в массиве столбцов и превысите высоту столбца, переполнив следующий столбец.
  3. Поместите любые изображения слева в первый столбец, затем второй столбец и т. Д. …

заранее спасибо

Я бы предложил что-то следующее:

  1. Закажите свои изображения в массив от самых высоких до самых коротких (если ваша ширина будет постоянной)
  2. Добавить изображение в первый массив столбцов
  3. Добавление изображений в следующий массив столбцов до тех пор, пока общая высота не будет равна или больше, чем предыдущий массив столбцов
  4. Повторяйте шаги 2 и 3 до тех пор, пока не будут использованы все изображения (вы даже можете чередовать заполнение столбцов в порядке возрастания и убывания, чтобы помочь даже разобраться)
  5. Перемешать массивы изображений, чтобы линии сетки отображались случайными, прежде чем добавлять изображения в столбцы
  6. Отрегулируйте вертикальные поля на изображениях для более коротких столбцов, чтобы они соответствовали общей высоте самого высокого столбца (вертикальное выравнивание по высоте)

Надеюсь это поможет!

Вы можете попробовать что-то подобное. Создать массив:

 $totalHeight = array( 1 => 0, //Column 1 2 => 0, //Column 2 3 => 0 //Column 3 ); 

Добавьте изображение в столбец с наименьшим значением $ totalHeigth и увеличьте высоту этого столбца с добавленной высотой изображения.

Так что если в каком-то цикле у вас есть массив вроде этого:

 $totalHeight = array( 1 => 2500, //Column 1 2 => 1950, //Column 2 3 => 2450 //Column 3 ); 

вы узнаете, что изображение нужно добавить в колонку 2.