41

How to ensure that each cell of table should become square without using fixed sizes? And be responsive when they change width.

table {
  width: 90%;
}
td {
  width: 30%;
}
tr {
  /** what should go here? **/
}
<table>
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
  </tr>
  <tr>
    <td>4</td>
    <td>5</td>
    <td>6</td>
  </tr>
  <tr>
    <td>7</td>
    <td>8</td>
    <td>9</td>
  </tr>
<table>

4 Answers 4

66

New answer :

To make the table cells square, you can use the aspect-ratio property on a div inside the td element. Like this :

table {
  width: 90%;
}
td {
  width: 33.33%;
  position: relative;
}
td .content {
  aspect-ratio: 1 / 1 ;
  background: gold;
}
<table>
  <tr>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
  </tr>
  <tr>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
  </tr>
  <tr>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
  </tr>
</table>


Previous answer :

You can use the technique described in: Grid of responsive squares.

Adapted to your usecase with a table and square table cells, it would look like this:

table {
  width: 90%;
}
td {
  width: 33.33%;
  position: relative;
}
td:after {
  content: '';
  display: block;
  margin-top: 100%;
}
td .content {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: gold;
}
<table>
  <tr>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
  </tr>
  <tr>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
  </tr>
  <tr>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
    <td><div class="content">1</div></td>
  </tr>
</table>

FIDDLE demo

Sign up to request clarification or add additional context in comments.

7 Comments

Could both downvoters explain the reason pls I'm ok with that but it isn't very constructive without explanation.
this solution doesn't work on android <4.3 stock browsers. Still cool though :)
how to vertical-align:middle the content ?
@BradKent there is a technique described here : stackoverflow.com/a/20457076/1811992 (see 3.Centering the content). You can also have a look at this stackoverflow.com/questions/8865458/…
Before align the text firstly you have to add " width: 100%; height: 100%;" to the "td .content {...}" and after you can align the text simple
|
7

Here is my code: http://jsfiddle.net/vRLBY/1/

The key is to use:

td { width: 33%; padding-bottom: 33%; height: 0; }
td div { position: absolute }

because padding-bottom is defined in terms of the width. More information: http://absolide.tumblr.com/post/7317210512/full-css-fluid-squares

Note: Previously I posted a not working code (see here). Thanks to @web-tiki for reporting the bug ;-)

5 Comments

well this has a pretty wierd effect in this fiddle : jsfiddle.net/webtiki/cM3yb
@web-tiki: For we it worked fine in fiddle. Can you describe the weired effect you are seeing?
Never used jFiddle before, so I cannot say when it looks okay and when weird... ;-) I would suggest, that you have to delete the body { ... } from the CSS....
well fiddle is very handy, you can edit it and save it to show us your technique working. It basicaly is like a webpage taht everyone can edit, save and share...
@tampis I just checked with firefox and it is better but the tds aren't square. I'll make a screenshot to show you.
1

If someone's looking for a solution that does not require fixed width property (even in percentage), here's what I came up with based on above answers and the link from approved answer:

td {
    height: 0;

    &:after, &:before {
        content: '';

        display: block;
        padding-bottom: calc(50% - 0.5em);
    }
}

It's kinda lame but it kills two birds with one stone:

  • does the trick
  • makes content aligned vertically

1 Comment

this is Sass/Less code rather than plain css
0

For me the solution is to divide 100% per number of cells you have.

For example, if you have 7 cells:

100% / 7 = 14.28%

So 14.28% is the size for each cell.

<td style="height=14.28%; width=14.28%;" >...</td>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.