Адаптивні таблиці з застосуванням flexbox

Таблиці є основною частиною лендингів та сайтів, на яких пропонують цифрові або інші платні послуги. Хоч вони і мають свій якийсь шаблонний вигляд - можливостей для їх оформлення дуже багато...

Епоха мобільних пристроїв диктує свої правила. Якщо раніше таблиці html, як правило, бачили користувачі персональних комп'ютерів, то зараз, в першу чергу, потрібно подбати про те, щоб ці таблиці відображалися коректно і на смартфонах і планшетах.

Приклад реалізації  адаптивних таблиць за допомогою списків  з застосуванням Flexbox

Розмітка HTML

Розмітка максимально чиста та мінімалістична. у пркладі використано зовнішній основний елемент DIV, а потім серію списків UL для відображення кожного «рядка» вмісту в таблиці порівняння:

Важливою є порівняльна таблиця, що складається з кількох UL, поставлених один проти одного. Викорстано flex box CSS, щоб зробити їх однаковими по ширині, а також розширити та стиснути з однаковою швидкістю, щоб вони вели себе так само, як і рядки в таблиці.

<div class="comparisontable">

<ul class="row">
    <li class="legend">Office Chairs</li>
    <li><img src="Eurotech-chair.jpg" /><br />Eurotech</li>
    <li><img src="Hbada-chair.jpg" /><br />Hbada</li>
    <li><img src="Zenith-chair.jpg" /><br />Zenith</li>
    <li><img src="amazonbasics-chair.jpg" /><br />Amazonbasics</li>
</ul>

<ul class="row">
    <li class="legend">Weight</li>
    <li>25kg</li>
    <li>13kg</li>
    <li>17kg</li>
    <li>28kg</li>
</ul>

<ul class="row">
    <li class="legend">Cost</li>
    <li>$$</li>
    <li>$</li>
    <li>$$</li>
    <li>$</li>
</ul>

<ul class="row">
    <li class="legend">Delivery</li>
    <li>Domestic</li>
    <li>International</li>
    <li>International</li>
    <li>Domestic</li>
</ul>

<ul class="row">
    <li class="legend">Verdict</li>
    <li>Best Chair for Back Pain</li>
    <li>Best budget chair</li>
    <li>All Mesh for Cooling</li>
    <li>Only Chair with Top Grain Leather</li>
</ul>

<ul class="row">
    <li class="legend"></li>
    <li><a href="" class="calltoaction">Buy Now</a></li>
    <li><a href="" class="calltoaction">Buy Now</a></li>
    <li><a href="" class="calltoaction">Buy Now</a></li>
    <li><a href="" class="calltoaction">Buy Now</a></li>
</ul>

</div>

Першим елементом li в кожній ul є функція/легенда. Щоб легко ізолювати та стилізувати їх інакше, ніж решту пакета, цим елементам присвоєно li клас CSS .legend

CSS:

Далі потрібно перетворити розмітку в порівняльну таблицю. Використовуючи CSS Flexbox, відносно легко трансформувати елементи UL, щоб вони були горизонтальними в макеті, згинаючись і розтягуючи разом, щоб вони вели себе як клітинки таблиці.

Деякі непотрібні рядки видалені, щоб можна було зосередитися на важливих частинах нижче:

div.comparisontable{
display: flex;
flex-direction: column; /* turn children ul elements into stacked rows */
}

div.comparisontable ul.row{
list-style: none;
display: flex; /* turn children li elements into flex children */
flex: 1;
flex-wrap: wrap;
}

div.comparisontable ul.row li{
background: #c9f4ca;
flex: 1;
padding: 10px;
border-bottom: 1px solid gray;
}

/* the legend column (first li within each row) */
div.comparisontable ul.row li.legend{
background: #6640d8;
color: white;
border: none;
width: 200px;
border-bottom: 1px solid white;
}

/* very first row */
div.comparisontable ul.row:first-of-type li{
text-align: center;
}

/* very last row */
div.comparisontable ul.row:last-of-type li{
text-align: center;
border-bottom: none;
box-shadow: 0 6px 6px rgba(0,0,0,0.23);
}

/* first and last cell within legend column */
div.comparisontable ul.row:first-of-type li.legend.legend,
div.comparisontable ul.row:last-of-type li.legend{
background: transparent;
box-shadow: none;
}

"Список функцій" або стовпець легенди є першим елементом li кожного рядка. Він має явну ширину 200 пікселів, на відміну від інших елементів li, які мають гнучку ширину (flex: 1).

Наступне  завдання зробити таблицю  адаптивною, тому що  «стовпці» в кожному рядку залишаються поруч, навіть якщо розмір екрана стає дуже малим.

У flex box CSS можна легко змінити порядок відображення дочірніх елементів flex з поведінки за замовчуванням «рядок» на «колонку», встановивши властивість flex-direction з «row» на « column".

У даній таблиці порівняння самі елементи ul стоять в один ряд, хоча дочірні елементи li з’являються поруч, як клітинки в таблиці. Їх потрібно змінити так, щоб вони також складалися, коли екран стане досить малим:

@media screen and (max-width:650px){

div.comparisontable ul.row{
flex-direction: column;
}

div.comparisontable img{
width: auto;
height: auto;
}

div.comparisontable ul.row li{
margin-right: 0;
width: auto;
flex: auto;
}

/* first and last cell within legend column */
div.comparisontable ul.row:first-of-type li.legend.legend,
div.comparisontable ul.row:last-of-type li.legend{
display: none;
}

div.comparisontable ul.row li.legend{
width: auto;
}
}

Тепер, при зменшенні розміру вікна, таблиця  згортається, і кожна «комірка» з’являється в окремому рядку:

 Існує невелика проблема з таблицею: при зміні  розміру, на певних розмірах екрану, ширина деяких li стає дещо несинхронізованою:


See the Pen Responsive Comparison Table using CSS Flexbox by georgec (@georgec) on CodePen.

Приклад реалізації адаптивної таблиці за допомогою тега <table> з застосуванням Flexbox

See the Pen Responsive Table Flexbox by Bruno Santos (@brnms) on CodePen.

v

Нові Старіші