Грид в таблице что это

Полное визуальное руководство/шпаргалка по CSS Grid

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Сегодня мы с вами рассмотрим свойства CSS Grid (далее также — Грид), позволяющие создавать адаптивные или отзывчивые макеты веб-страниц. Я постараюсь кратко, но полно объяснить, как работает каждое свойство.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Грид — это макет для сайта (его схема, проект).

Грид-модель позволяет размещать контент сайта (располагать его определенным образом, позиционировать). Она позволяет создавать структуры, необходимые для обеспечения отзывчивости сайтов на различных устройствах. Это означает, что сайт будет одинаково хорошо смотреться на компьютере, телефоне и планшете.

Вот простой пример макета сайта, созданного с помощью Грида.

Компьютер

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Телефон

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Архитектура CSS Grid

Как же Грид работает? Элементы Грида (grid items) располагаются вдоль главной или основной (main) и поперечной (cross) оси (axis). При помощи различных свойств мы можем манипулировать элементами для создания макетов.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

К слову, если вас интересует Флекс, вот соответствующая статья.

Схема CSS Grid

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Схема содержит все возможные свойства, предоставляемые Гридом. Эти свойства делятся на:

Обратите внимание: красным цветом отмечены сокращения для свойств:

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это
Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

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

Настройка проекта

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Или вы можете просто открыть Codepen (или любую другую песочницу) и начать писать код.

Источник

Grid Layout как основа современной раскладки

В темные века верстальщики строили сайты на таблицах. Потом они освоили float и flexbox, и тьма отступила. В 2017-м наступила эпоха Просвещения с приходом CSS Grid Layout.

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

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Несмотря на всю мощь, есть маленький нюанс, который портит картину — его все еще редко используют верстальщики. Спецификация Grid есть, браузеры поддерживают, а реальных проектов мало.

Об этом расшифровка доклада Сергея Попова на Frontend Conf: про спецификацию, про то, почему верстальщики боятся Grid и как решиться применять сетку в своих проектах, чтобы «Make your website great again!».

О спикере: Сергей Попов (popovsergey) — Генеральный директор аутсорса по фронтенд-разработке Лига А. от HTML Академии, фронтенд-разработчик, организатор сообщества moscowcss, соорганизатор WSD и pitercss_conf. Пока не стал руководителем в компании, много лет занимался версткой.

За последний год появилось много курсов и докладов про Grid, про то, как их использовать и писать. Если технические доклады вам надоели, то добавлю еще один в ваш список. Шутка — поговорим про комиксы. Или нет?

Примечание: вместо длинного «CSS Grid Layout» дальше будет просто «Grid».

Что сейчас с CSS Grid Layout?

Технически, Grid — это простая двухмерная сетка.
Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Нарисовать и использовать Grid достаточно просто, но разработчики все еще его сторонятся. Я вижу две причины для этого.

Спецификация

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

Спецификация стабильна, хотя до сих пор в статусе Candidate Recommendation. Если бы я мог, то давно бы уже зарелизил, но разработчики спецификации пока не спешат, а дополняют и меняют формулировки.

Давайте применять нерекомендованную спецификацию Grid Layout — в этом нет противоречия, потому что Grid сначала была реализован, а потом описан.

Второе неверное утверждение — это то, что Grid не имеет смысла без второго уровня.

Второй уровень спецификации

Когда писали спецификацию, она оказалась слишком большой, поэтому какую-то часть выделили во второй уровень. На 2018 год спецификация второго уровня в состоянии First Public Working Draft — первая публикация рабочего черновика.

Над спецификацией активно работают и в ближайшее время она перейдет в состояние Working Draft — рабочий черновик. Разработчики ждут, пока зарелизят Grid, но это долгий процесс, который может затянуться лет на 5.

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

display: subgrid;

Не успели мы понять, что такое grid, как появился subgrid. Давайте разбираться, что это такое.

Представим такую разметку.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Все довольно просто: у нас есть сетка, в нее вложено три несемантических и один семантический элемент. Grid работает как flexbox: когда вы применяете display: grid; к обертке, он применяется только к элементам на первом уровне вложенности.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

займут место в сетке, а все, что находится внутри списка, — схлопнется. Вы потеряете все эти элементы, потому что так работает Grid.

Если хотите, чтобы эти элементы остались частью вашей сетки, то есть два варианта:

. Мы убьем семантику, но оставим сетку.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Одна проблема — subgrid не поддерживается, он где-то там за флагами, а релиза можно ждать еще долго.

display: contents;

Есть нюанс — display: contents; поддерживается не во всех браузерах.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

CSS Subgrid Emulation

Пока у display: contents; решают проблему поддержки, верстальщики придумали выход — сделали эмуляцию subgrid.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Свойства с дефисом — это кастомные свойства в CSS.

Второй уровень не нужен

Если кто-нибудь скажет не использовать Grid, пока не выйдет второй уровень — не слушайте его. Второй уровень решает определенные проблемы, которые уже решены другими способами.

Не везде нужны subgrid. Grid в связке с Flexbox иногда получается куда круче, чем с subgrid.

Поэтому не надо ждать второй уровень, смело занимайтесь первым. Тем более, что он уже есть.

Поддержка Grid в браузерах

Эту картинку можно показывать, если кто-то скажет вам, что Grid не поддерживается.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Глобально поддерживается 87% браузеров, кроме Opera Mini — она ничего не поддерживает. Я писал в CanIuse, просил убрать ее из колонки, чтобы не портить картину, но пока безрезультатно 😉

Остается проблема с IE. Как всегда, он здесь, с нами, и никуда не делся.

IE и Grid

Если ваше приложение поддерживает IE, вы возможно скажете, что не можете использовать Grid. Это не так — Grid работает в IE, так как спецификация была рождена в Microsoft, и впервые появилась именно в IE. Просто ее никто не использовал, пока не пришли нормальные люди и не переписали спецификацию.

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

Версию спецификаций для IE учить не нужно, потому что большую часть работы за вас сделает Autoprefixer — плагин, который переводит новую версию спецификации в старую. Поэтому, чтобы обеспечить поддержку Grid в IE, достаточно использовать Autoprefixer.

Остальное надо просто знать и помнить. Достаточно открыть статью «Supporting CSS Grid in Internet Explorer», прочитать какие свойства поддерживаются в IE, а какие нет, и решить, что из них вы будете использовать.

Помните про «graceful degradation», когда в старых версиях браузера пропадают элементы из новых. Например, в браузерах, в которых не поддерживается border-radius, у форм будут квадратные уголки. Верстальщиков заставляли вырезать картинки форм, вместо CSS, и в некоторых ситуациях это считалось нормальным.

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

Internet Explorer вместе с Grid работает неплохо, просто надо немного практики. Если вы не используете Grid, потому что боитесь IE, то я вынужден вас удивить — это не прокатит.

Баги и Grid

Вы можете сказать, что в Grid много багов, но это не так. Rachel Andrew нашла все ошибки в CSS Grid — всего их 14, и это все что есть. Никто не занимается Grid Layout CSS больше, чем Рейчел, поэтому ей можно доверять.

Баги довольно специфические. Мы помним, когда пришли flexbox, в них тоже были баги, но нас это не остановило. Баги в Grid нас тоже не останавливают, тем более, такие.
Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

«Некоторые HTML элементы не могут быть Grid-контейнером». Сразу идет уточнение, что кнопка не может быть Grid-контейнером, но мы и не хотели этого.
Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

«Textarea, когда она является элементом Grid, схлопывается». Проблема легко решается, если поставить ширину и высоту в процентах.

Эти баги довольно специфические и проявляются не во всех браузерах. Если ты знаешь, что баг может проявиться, то просто берешь и исправляешь — это несложно.

Технических причин не использовать Grid не так уж много. Браузеры поддерживают, а в старых браузерах применяйте «graceful degradation». Теоретических причин тоже мало, потому что материалов больше, чем по flexbox.

Теория, или маленький ликбез

Сайты уже используют Grid. Например, я зашел на сайт Russian Internet Week, и это последнее место, где я ожидал увидеть Grid. Обычно сайты бизнес-конференций собираются на Тильде.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Причем они более-менее правильно используют сетку. RIW попробовали, и у них получилось, причем без fallbacks. Они явно ориентируются на пользователей современных браузеров.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Конференции, которые рассказывают про CSS, в любом случае, пытаются применять новые инструменты. Мы на сайте pitercss_conf сделали бейджики, а у ребят из Минска половина сайта на Grid.

Russian Internet Week — это довольно узкая аудитория посетителей. New York Times читает больше людей.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Я уверен, что среди читателей есть владельцы устройств даже с IE 9, 10, 11, но половина сайта на Grid.

Я был удивлен, когда увидел, что такие крупные проекты используют Grid.

Почему Grid не используют повсеместно?

Мы поняли, что спецификация есть, ее можно использовать и никакие отговорки не сработают. Так в чем же дело?

Есть определенные причины не применять сетки:

С точки зрения дизайна

Сейчас я буду защищать дизайнеров.

Дизайн развивается медленно, по своим трендам, никак не связанным с развитием веб-технологий. Скорее наоборот — веб-технологам приходится подстраиваться под тренды дизайна. Маловероятно, чтобы верстальщики сказали: «Дизайнеры, а у нас есть Grid, можно с ним работать», а они бы ответили: «О, да!» и начали рисовать под них макеты.

Поэтому большинство сайтов выглядит так.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Абстрактный пример с простой сеткой и колонками, ничего необычного. Сайт легко собирается без flexbox, на float, даже можно обойтись табличной версткой.

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

Приходит к нам дизайнер и говорит:

Потом мы идем к менеджеру, жалуемся, и дизайнер получает по голове.

Все, дизайнер больше не рисует сложные сетки. Раньше мы действительно не могли строить сложные интерфейсы, а сейчас можем — у нас полно инструментов. Теперь дизайнер не хочет, он перестал просить сложные макеты. Дизайнер рисует интерфейс, чтобы верстальщик смог его реализовать, и часто максимально примитивно.

Приведу распространенный пример из нашего аутсорса. Дизайнер получил задачу нарисовать блог и дает волю всем своим сеточным порывам. Рисует большой блок, широкий, 3 маленьких, средний, фантазирует. Выглядит круто и современно.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Верстальщик видит макет, пишет на flexbox одну обертку, вторую, третью и получает вот такую картинку.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

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

На этом счастливая история заканчивается и мы возвращаемся к дизайнеру.

Когда дизайнер рисовал макет, то представлял и другие варианты. В вариантах был полет фантазии, а бэкендер сломал порывы в один момент. План сделать красивый блог, провалился.

Здесь есть разные варианты выхода:

Реальный кейс

На главной странице журнала «The Village» сложная сетка. Она выполнена намеренно для разных типов материалов. Я знаю про это, так как работал в издании.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

«The Village» написали огромный алгоритм, который на бэкенде генерирует сетку. Это смесь float, абсолютного позиционирования и других страшных вещей, но она работает!

Иногда ломается, но, когда это происходит, блоки просто переставляются местами и снова все работает.

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

В «The Village» заморочились, чтобы сделать как хотят, но большинство этого не делает. Поэтому мы видим заурядный веб, стандартизацию, все сводится к одному Layout. Раньше у нас был Bootstrap, который описывает большую часть кода. Сейчас уже у дизайнеров есть свои инструменты, наподобие Bootstrap, которыми они собирают сайты. Что за ерунда — где креатив?!

Наша задача состоит не в том, чтобы внутри сообщества договориться использовать Grid, а в том, чтобы мы рассказали об этом дизайнерам.

Я мечтаю выступить на конференции дизайна и сказать: «Привет! Мы стали лучше! Мы теперь снова умные», но верстальщика не пускают на дизайнерские конференции. Рассказать дизайнерам, что мы стали лучше — это не так уж сложно. Вам пришла простая сетка, вы спрашиваете: «Почему она простая, а не сложная? Я могу сделать любую!»

С точки зрения реализации

Кажется, что Grid сложно найти. Когда мне говорят: «У меня 3 колонки и я могу сделать это на flexbox. Зачем мне Grid?», то я отвечаю: «Действительно, не надо». Поэтому возникают сложности с тем, где вообще прикладывать Grid.

Grid — это не только сложная сетка

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Это и простая раскладка, которую можно сделать на Grid, причем проще, чем на flexbox, потому что не нужна дополнительная обертка. Ниже есть один пример на Grid, его тоже можно сделать на flexbox, но надо много дополнительных оберток или flow, и получится настоящая мешанина.

Grid — не для мелких элементов: либо для очень сложных мелких, либо для крупных.

Grid для раскладки

Я не знаю ни одного сайта, у которого нельзя переписать раскладку на Grid и сэкономить на этом кучу бесполезных дополнительных оберток.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Самое сложное в Grid Layout — это начертить сетку, которая вам подходит. В данном случае это не просто 6*6, а 5*8, но у каждого блока разная высота и ширина.

Мы видим задачу и компонуем контент, очень похоже на направляющие в Photoshop. Дизайнер отрисовал, а мы перевели макет на сетку. Здесь нет ни одной дополнительной обертки — только семантические элементы, которые выстраиваются в сетку с помощью Grid.

Посадочный талон можно сделать на flexbox.
Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

А можно на Grid, и в мобильной версии талон выглядит по-другому.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Grid для структуры

Вторая важная вещь, которую нужно запомнить: с помощью Grid просто менять структуру.

Есть order во flexbox, который позволяет поменять порядок всех элементов. Это сложная технология, и как с Z-индексами можно выстрелить себе в ногу, если не знать, как ей пользоваться.

С Grid все просто. В этом примере, если бы не было сетки, нам бы пришлось правую часть с QR-кодом вынести в абсолютное позиционирование. А на Grid это 13 строк кода в мобильной версии.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Чтобы начать использовать Grid, надо начать использовать Grid. Попробуйте сверстать на сетке некоторые элементы вашего интерфейса. Можно начать с маленьких, можно — с глобальных, чтобы понять, насколько это упрощает жизнь.

Никто не скажет вам: «Вот здесь используй Grid, а здесь — нет!» Вы должны сами понять и научиться, но для этого нужно набивать шишки. Если реализация задачи на Grid заняла в два раза больше времени, чем на flexbox, значит, такие задачи не надо решать на Grid.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Вот для комиксов Grid идеален.

Рассмотрим нетривиальную задачу.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Если покопаться в коде, становится понятно, как все устроено. Ребята программируют на CSS и выстраивают Grid Areas. В зависимости того амплуа игрока, он автоматически встает в нужную Area. Вертикальное и горизонтальное выравнивание создает построение. Это целое программирование на CSS. Задача решается 50 строчками CSS-кода, что гораздо проще, чем через бэкенд или JS.

Я хочу, чтобы дизайны и раскладки были прикольными, такие как эта.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Это слишком сложная верстка на Grid, потому что задача была сложная. Верстальщик не мог отрисовать раскладку на простых flexbox, только Grid. Можно было сделать меньше ячеек, но учитывая, что ячейки строит repeat, на это много времени не ушло. Главное, что они сделали это.

Сверстано замудренно, но интерфейс очень круто перестраивается в дальнейшем.

Что дальше?

Давайте перестанем говорить себе: «Я не могу» в плане Grid. Вы можете — просто не хотите. Нет ни одной объективной причины не использовать сетку, кроме лени и нежелания попробовать.

Поэтому у вас никогда не будет готового решения. Возможно, будут шаблоны, но правил, где применять Grid, а где нет — не будет.

Учитесь, смотрите примеры, развивайтесь. Нет ничего плохого в том, чтобы смотреть на примеры других людей. Я, например, так и делаю.

Несите знания в команду. Говорите, что знаете Grid, предлагайте его использовать.

Подойдите к дизайнеру и скажите: «Давай ты будешь рисовать интереснее, а я буду твои задумки реализовывать!»

Скажите менеджеру: «Мы теперь можем больше с Grid!»

Делитесь знаниями внутри команды и двигайте веб вперед. В конечном счете у нас простая цель — делать веб лучше и круче!

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Если в какой-то момент у нас все уходило в упрощение, то сейчас есть новые технологии. Не только Grid — это SVG-маски, анимации, трансформации. Проблема не в технологиях, а в том, что большинство до сих пор не использует на полную и половины из них. Мы не знаем всего или не хотим использовать, а дизайнеры не догадываются, что мы можем.

Контакты Сергея Попова: e-mail, Fb, twitter

Это доклад — один из лучших на Frontend Conf. Понравилось, и хотите больше — подпишитесь на рассылку, в которой мы собираем новые материалы и даем доступ к видео, и приходите на Frontend Conf РИТ++ в мае.

Знаете больше и готовы делиться опытом — отлично! Присылайте тезисы, прием докладов уже открыт и будет продолжаться до 27 февраля.

Источник

Гибкие таблицы на CSS Grid

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это
Просмотр списка лидов («холодных» контактов)

Поскольку мы уже запустились, я, наконец, могу рассказать о секретном проекте, над которым работал последние два года. Одна из интересных функций Teamwork CRM — просмотр списка (list view).

Это мощный компонент, который встречается в приложении семь раз. По сути, таблица на стероидах. Я мог бы много рассказать, но не хочу вас утомлять. Сосредоточусь на том, как мы реализовали подобную гибкость с помощью всего нескольких строк CSS (Grid). А именно, как мы выкладываем тяжёлые таблицы данных, как поддерживаем изменение размера столбцов и многое другое.

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

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

Абсолютно всё работает в адаптивном гибком дизайне. Мы начинаем с самого узкого варианта и настраиваем макет на основе контента, дизайна и вариантов использования (у нас нет брекпоинтов, ориентированных на устройство).

На минимальной ширине экрана столбцы штабелируются вертикально, занимая всю ширину экрана.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это

Как выглядит список на узком экране

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

Как только у нас достаточно пикселей на экране, мы переключаемся на более типичный макет, так что колонки… ну, становятся колонками. Затем в макете не происходит никаких серьёзных изменений, но мы по-прежнему хотим отображать колонки как можно удобнее для клиента.

Предположим, у нас много столбцов (позже рассмотрим, как пользователь может их настроить). Во-первых, таблица должна как минимум заполнить ширину экрана. Во-вторых, ширина столбцов должна определяться их содержимым и типом значений. Например, короткий/длинный текст, дата, номер, URL и т. д. Колонки с датой должны занимать меньше места, чем колонки длинного текста.

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

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это
Как макет зависит от ширины окна. Извините за дёрганую гифку, позже я приведу несколько интерактивных примеров

Начнём с того, что мы по максимуму используем для таблицы обычный CSS старой школы. Затем улучшаем его с помощью CSS Grid. Потом я покажу, как средствами Grid пользователи изменяют размер столбцов, что было гораздо неудобнее с обычным CSS.

Ну покажите уже CSS Grid

Я не эксперт по CSS Grid, но он мне нравится. Это чрезвычайно мощный и простой инструмент, который реализует сложные макеты с минимальным количеством кода. Здесь я пропущу введение в технологию. Можете прочесть «Новые макеты CSS» Рейчел Эндрю или «Полное руководство по Grid». Когда закончите размышления о том, где же был этот инструмент всю вашу жизнь, возвращайтесь ко мне.

Обходной путь — использовать display:contents на

,

и

. Это в основном удаляет их из макета сетки, выдвигая вперёд дочерние элементы (

и

).

Затем мы используем волшебное правило grid-template-columns для управления элементами сетки. Да, всего одна строка CSS. Например, если у нас колонка даты и колонка URL, получится примерно так:

Изменение ширины колонок с помощью Grid

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

Например, пользователь может создать для контактов настраиваемое поле (дата) под названием «Дата рождения», которое будет отслеживаться в системе для каждого контакта.

Поскольку при создании настраиваемого поля выбирается тип «Дата», система будет обрабатывать это поле с учётом такого типа. Сначала объясню, как происходит изменение ширины.

Замечательно, что достаточно обновить только один элемент в DOM, а не каждую ячейку.

Мы всегда разрабатываем UI с учётом сенсорного ввода, но в данном случае вполне нормально не поддерживать его. Это слишком точное действие. Даже если бы я хотел изменить размер столбца на тачскрине, вероятно, я ожидал бы другого взаимодействия, например, через мультитач-жест.

Колонки фиксированной ширины

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

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

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

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

Поэтому, если вы открываете приложение в первый раз, столбцы выкладываются оптимальным образом. Если изменить размер экрана, колонки тоже изменятся по тому же принципу. Как только вы касаетесь ползунка для изменения размера любого столбца, ширина всех видимых колонок фиксируется.

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это
До, во время и после изменения ширины столбца. Опять прошу прощения, что гифка немного дёргается

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

Не могу точно вспомнить, почему мы решили установить фиксированное значение в пикселях, а не адаптивный вариант. Может, для простоты. Или потому что в отсутствие поддержки Grid и display:contents происходит откат на более архаичный подход к настройке ширины столбцов.

Вероятно, адаптивный вариант в любом случае не будет соответствовать намерениям пользователя. Мы не можем предполагать, что для него самое главное — сделать все столбцы меньше, чтобы все они остались на экране. Если человек изменил ширину колонки, он хочет увидеть определённое количество содержимого в этом столбце. Если у нас адаптивный блок, а затем он сужается в окне меньшего размера, то мы игнорируем выбор человека. Ему придётся снова изменить ширину столбца, чтобы увидеть тот же контент. Вряд ли пользователь думает: «Хм, я хочу, чтобы этот столбец занимал 20% окна, даже если я его изменю». Впрочем, я слишком углубляюсь в пограничную ситуацию: на самом деле, пользователи редко изменяют размер окон.

Перемещение и удаление столбцов

Грид в таблице что это. Смотреть фото Грид в таблице что это. Смотреть картинку Грид в таблице что это. Картинка про Грид в таблице что это. Фото Грид в таблице что это
Интерфейс для настройки отображаемых столбцов

Если ширина какой-то колонки зафиксирована в localStorage, мы фиксируем ширину всех выбранных столбцов и тоже сохраняем эти значения в localStorage.

Со временем всё больше и больше столбцов сохраняют фиксированную ширину. Для пользователей единственный способ вернуться к адаптивному дизайну — сбросить колонки.

Мы также храним в localStorage массив идентификаторов столбцов, отдельно от записей о ширине.

«Почему вы просто не использовали <>?»

С библиотекой JavaScript решение будет тяжёлым, дёрганым, не обеспечит интерактивность и может даже вообще не поддерживать

. Мне также не хотелось писать что-то подобное. Я подумал: «Должен быть способ получше».

«Почему вы просто не использовали Flexbox?»

Каждая строка будет оцениваться/выводиться независимо друг от друга. Столбец может быть не выровнен относительно столбца выше из-за разного объёма содержимого.

Я мог бы переключиться на

‘ы для столбцов с вертикальной группировкой ячеек внутри. Но не хотел этого делать. Я хотел использовать

. Кроме того, мы легко могли столкнуться с другими проблемами: например, с несовпадением ячеек по высоте между столбцами.

Действительно, — удобный старый элемент. После определения столбцов с помощью стили, применённые к одному, будут эффективно применяться ко всем ячейкам в этом столбце.

Но это оказалось слишком ограниченное решение. Мы попробовали, но очень быстро от него отказались. Настолько быстро, что я уже не могу точно вспомнить, в чём были проблемы. Почти уверен, что невозможно было достичь желаемого уровня адаптивности и оно не сработало с Flexbox и Grid.

«Почему вы просто не использовали table-layout: fixed?»

Я мог бы применить на

правило table-layout: fixed и установить ширину столбцов в процентах. Но глядя на примеры и поиграв с этим правилом, создалось впечатление, что оно работает только на таблицах шириной 100%. Кроме того, изменение размера одного столбца приводит к изменению размера других столбцов для выхода на общие 100% ширины.

«Но вы могли обойтись простыми таблицами!»

Да, таблицы из коробки способны на много умных вещей, но не могут эффективно поддерживать всё, что я хотел реализовать. Не согласны? Хорошо, волшебник, научи меня.

Не переборщите с display: contents

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

Мы обнаружили странный баг display: contents с нативным драг-н-дропом в Firefox.

К счастью, скоро выйдет функция подсеток (subgrid), которая позволит дочерним элементам корректно внедряться в сетки. В нашем приложении мы хотим лишь упростить разметку, но подсетки откроют двери в дикие многомерные сеточные оргии. См. «Почему display: contents не является подсеткой CSS Grid Layout».

Наверное, я что-то забыл

Кажется, была ещё проблема с переполнением текста при изменении размера столбцов, но я уже точно не помню.

Вскоре мы собираемся реализовать массовое редактирование в представлении списка, а также экспорт кастомного представления в CSV.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *