Представляем сетки изображений в постах

Если в посте Discourse много изображений, теперь их можно автоматически расположить в аккуратную сетку. Всё, что нужно сделать, — обернуть их в теги [grid] ... [/grid], и изображения будут красиво упорядочены. Это базовая функция, доступная с момента этого коммита, и она включена во всех экземплярах Discourse.

Вот пример работы этой функции:

Эта функция похожа на несколько тематических компонентов (Masonry Image Gallery, Tiles Image Gallery). Главное отличие заключается в том, что расположение изображений в сетке выравнивается как по верхнему, так и по нижнему краю элемента. Вот несколько дополнительных технических замечаний:

  • на мобильных устройствах сетка по умолчанию имеет 2 колонки, на настольных компьютерах — 3
  • если в сетке ровно 4 элемента, изображения будут расположены в 2 колонки
  • также можно использовать не только изображения (например, видео), но тогда выравнивание может быть не идеальным
  • элементы в сетке располагаются так, чтобы высота колонок была максимально близкой друг к другу, поэтому порядок изображений не всегда сохраняется

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

Изображения, использованные в этом посте, взяты с unsplash.com

81 лайк

Очень круто. Мне это нравится. Спасибо @pmusaraj :slight_smile:

6 лайков

Мы уже используем галерею изображений Masonry. Совместима ли эта новая функция, или существующие сетки исчезнут?

6 лайков

Хороший вопрос. Эта новая базовая функция не конфликтует с компонентом темы Masonry Image Gallery, то есть они могут работать одновременно.

Если вы хотите перенести публикации с подхода Masonry на новый базовый подход, вам нужно запустить скрипт, который обновит raw-содержимое публикаций с

<div data-masonry-gallery>

![example|690x395](upload://d48GblQ7LzoqPax2TN8xyuWhzyJ.png)
![example2|690x413](upload://usFTgK3JCDlQXDaiIcAy9ZUSyt9.png)

</div>

на

[grid]
![example|690x395](upload://d48GblQ7LzoqPax2TN8xyuWhzyJ.png)
![example2|690x413](upload://usFTgK3JCDlQXDaiIcAy9ZUSyt9.png)
[/grid]

А затем пересобрать эти публикации.

6 лайков

Отлично! Это большой шаг вперёд — изображения в постах выглядят ещё лучше.

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

6 лайков

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

6 лайков

У меня есть импорт, где изображения представлены просто URL-адресами к ведру S3, например:

[grid]

https://urlsite/pic.jpg

https://urlsite/pic.jpg

[/grid]

Но отображается только [grid], затем сами изображения и [/grid].

Полагаю, это работает только после того, как эти URL-адреса будут загружены и преобразованы в обычные изображения?

7 лайков

Хм, да, в композере это сейчас работает только с загрузками. (То есть вставка URL изображения и его обертка в теги [grid] в композере тоже не работает.)

8 лайков

Круто. Хорошо, что я пока не добавил этот код в скрипт импорта. :slight_smile:

5 лайков

Это отличная функция, спасибо.

Будет ли сетка работать с опубликованными страницами?

1 лайк

К сожалению, нет, это не работает с опубликованными страницами. Аналогичные функции постов на основе JavaScript (лайтбоксы, опросы, оглавление) также не работают с опубликованными страницами.

3 лайка

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

1 лайк

Привет, Барт :wave:

Это должно сработать. Конечно, сделай резервную копию и внимательно проверь предыдущие посты с использованием Masonry на предмет нежелательных результатов… :slight_smile:

posts = Post.where('raw LIKE ?', '%<div data-masonry-gallery>%')

posts.each do |p|
    p.update!(raw: p.raw.gsub(/<div data-masonry-gallery>(.*?)<\/div>/m, '[grid]\1[/grid]'))
    p.rebake!
end
7 лайков

Спасибо, выглядит отлично :slightly_smiling_face:

Я также использую компонент Masonry Image Gallery

Screenshot 2023-06-22 at 10.38.14

При включённой настройке авто-генерации… В исходном тексте нет <div data-masonry-gallery>, поэтому скрипт, думаю, не сработает. Но в данном случае они не конфликтуют друг с другом.


Планируется ли сделать сетки автоматическими? Если это произойдёт, я смогу просто пересобрать сообщения и сохранить макет сетки. До тех пор, думаю, я могу скрыть кнопку сетки и безопасно использовать компонент темы.

4 лайка

Есть ли кто-то в CDCK, кто может повлиять на разработчиков Chrome? Поддержка CSS Masonry для Grid?

Masonry уже должна быть частью CSS. Это один из немногих макетов, который позволяет красиво учитывать разные соотношения сторон наборов изображений (или, в общем, любого содержимого элементов).

Очень расточительно и бессмысленно запускать это повсюду через JavaScript…

(и, как вы знаете, это уже возможно в Firefox (за флагом) и входит в техническую предварительную версию Safari: "masonry" | Can I use... Support tables for HTML5, CSS3, etc)

Кстати, все, пожалуйста, поставьте :star: эту проблему:

https://bugs.chromium.org/p/chromium/issues/detail?id=1076027&q=masonry&can=2

:drum: Теперь поддержка CSS Masonry для Chrome и Edge! :drum:

4 лайка

Насколько мне известно, нет.

Я рад, что Safari поддерживает Masonry — у них лучшая история перехода функций от черновика к экспериментальной версии и далее к полной поддержке. Поддержка Masonry в Firefox уже более двух лет скрыта за флагом. Скорее всего, поддержка в Safari станет главным фактором, подталкивающим Chrome к обновлению.

Готово!

4 лайка

Да, но не без тегов [grid]. Автоматическое преобразование изображений в сетку без тегов нарушило бы спецификацию CommonMark, и мы очень не хотим этого допускать. (В моей первой внутренней черновике этой функции я действительно начинал с автоматической сетки.)

Вместо этого следующим шагом, который я обдумываю, является возможность автоматически добавлять обёртки [grid] к загрузкам нескольких изображений, вероятно, 3 и более. Это было бы особенно полезно для загрузок с мобильных устройств, так как ручное добавление тегов на телефоне неудобно, и если вы загружаете 3+ изображения одновременно со своего телефона, скорее всего, это фотографии, которые хорошо подходят для макета сетки.

У нас пока нет планов по срокам добавления этой функции, но это определённо то, что мы хотели бы реализовать.

9 лайков

Тем не менее, должно быть возможно генерировать статический HTML из JavaScript и публиковать «обработанный» DOM, чтобы включить ряд полезных функций, таких как эта сетка и оглавление.

1 лайк

Только скомпилированный HTML недостаточен. Сетка, оглавление и аналогичные функции также требуют JavaScript, который взаимодействует с HTML для реализации этих возможностей. Этот JavaScript находится внутри приложения Ember, и его сложно извлечь для опубликованных страниц, не использующих Ember.

2 лайка

Вчера я немного поэкспериментировал с этим и мне посоветовал оставить свои отзывы и мысли здесь, в этой теме…

  • Мне нравится, что это «автоматически» — оно само устанавливает сетку.
  • Было бы здорово добавить возможность упорядочивать изображения, не копируя и не вставляя их заново в списке — возможно, просто добавляя цифры в начало имени каждого изображения?
  • Мне нравится, что в режиме предпросмотра можно легко отключить сетку, но чтобы вернуть её, нужно снова добавить код. Это область, где можно улучшить опыт: например, показывать значок сетки, когда добавлено более одного изображения, чтобы можно было включать/выключать её по мере необходимости.
  • И ещё одна возможная будущая функция — возможность выбрать конкретное изображение для «выделения» или акцента в сетке, чтобы оно отображалось крупнее остальных или как-то иначе выделялось.

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

5 лайков