Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Display list of elements as table with CSS only?

Tags:

css

flexbox

Display list as a table with 3 columns, with the items evenly spread, and having 10px margin from every sides and between rows.

.item { width: 10px; height: 10px; background: black; }
.grid { background: #eee; }

<div class="grid">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

Should be rendered as

enter image description here

It is possible to achieve that with flex layout, but it would require more complicated HTML, see example below.

.item { width: 10px; height: 10px; background: black; }

.grid { background: #eee; padding: 10px 10px 0 10px; }
.row { display: flex; justify-content: space-between; padding: 0 0 10px 0;  }
<div class="grid">
  <div class="row">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
  </div>
  <div class="row">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
  </div>
 </div>

I wonder if it would be possible to do with pure CSS, without adding any additional HTML elements. The size of .items shouldn't be changed, and it's unknown.

like image 266
Alex Craft Avatar asked Jan 20 '19 14:01

Alex Craft


People also ask

How do you display items in a list in CSS?

#display: list-item. The only HTML elements displayed as list-item are the (unsurprisingly) list items <li> but also the definition descriptions <dd> . A list item is rendered with a bullet point (if in an unordered list <ul> ) or with a incremental number (if within an ordered list <ol> ).

Can you use CSS to style a table?

CSS provides a number of attributes for styling tables. These attributes allow you to—among other things—separate cells in a table, specify table borders, and specify the width and height of a table. This tutorial will discuss, with examples, how to style a table using CSS.

What does display table do in CSS?

Setting display to table makes the element behave like a table. So you can make a replica of an HTML table without using the table element and corresponding elements such as tr and td . For example, in HTML, you can make a table with the <table> element and also a <div> , or any container of your choice.


Video Answer


2 Answers

You can do this with flexbox by adding a hidden element between the first and last row that will be width:100% thus you will avoid changing the html:

.item {
  width: 10px;
  height: 10px;
  background: black;
}

.row {
  display: flex;
  justify-content: space-between;
  padding: 10px;
  background: #eee;
  flex-wrap: wrap;
}

.row:after {
  content: "";
  width: 100%;
  height: 10px;
}

.row :nth-child(n + 4) {
  order: 1;
}
<div class="row">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

If the number of element is unknown you can consider CSS grid:

.item {
  width: 10px;
  height: 10px;
  background: black;
}
.row {
  display: grid;
  grid-template-columns: repeat(3,1fr);
  grid-gap: 10px;
  padding:10px;
  background: #eee;
}
.row :nth-child(3n + 2) {
  margin:auto;
}
.row :nth-child(3n + 3) {
  margin-left:auto;
}
<div class="row">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>
like image 173
Temani Afif Avatar answered Nov 15 '22 05:11

Temani Afif


Temani Afif has written a good answer. The flexbox one will work only for 2 to 3 rows but the grid version will work for more items.

The grid CSS can be simplified further by using space-between, thus getting rid of margins and n-th child selectors.

.item {
   width: 10px;
   height: 10px;
   background: black;
}
   
.row {
   display: grid;
   grid-template-columns: repeat(3,10px); /*change this*/
   grid-gap: 10px;
   padding:10px;
   background: #eee;
   justify-content: space-between;  /*add this*/
 }
  
<div class="row">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>
like image 40
Siddhesh Rane Avatar answered Nov 15 '22 04:11

Siddhesh Rane