レスポンシブスクエアのグリッド


170

レスポンシブな正方形のレイアウトを作成するにはどうすればよいのでしょうか。各正方形には、垂直方向と水平方向に配置されたコンテンツがあります。具体的な例を以下に示します...

コンテンツを含むレスポンシブな正方形


私は、Stackoverflowがどうあるべきかについて本当に知識豊富な見方をしている人々によって、すばらしい答えのある質問がランダムに閉じられる方法が嫌いです。彼らが良い、受け入れられた、賛成された答えを持っているなら...なぜそれを閉じるのですか?混乱はどこにありますか?確かに、それ自体では「応答性の高い正方形のグリッド」について説明する必要があるかもしれませんが、これは7年前の160以上の質問と400以上の回答です。私は再開を投票しています。
leinaD_natipaC

回答:


416

CSSのみを使用して、垂直方向と水平方向に中央揃えされたコンテンツを持つ正方形のレスポンシブグリッドを作成できます。手順を追って手順を説明しますが、最初に達成できることの2つのデモを示します。

レスポンシブ3x3正方形グリッド 3x3グリッドのレスポンシブな正方形の画像

これらの派手なレスポンシブスクエアを作成する方法を見てみましょう!



1.レスポンシブな正方形を作る:

要素を正方形(または他のアスペクト比)に保つ秘訣は、パーセントを使用することpadding-bottomです。
補足:上パディングまたは上/下マージンも使用できますが、要素の背景は表示されません。

上部パディングは親要素の幅に応じて計算されるため(参照についてはMDNを参照)、要素の高さはその幅に応じて変化します。これで、幅に応じてアスペクト比を維持できます。
この時点で、次のようにコーディングできます。

HTML

 <div></div>

CSS

div {
    width: 30%;
    padding-bottom: 30%; /* = width for a square aspect ratio */
}

ここで、簡単なレイアウト例上記のコードを使用して、3×3の正方形グリッドの。

この手法を使用すると、他のアスペクト比を作成できます。次の表は、アスペクト比と30%の幅に応じて、下のパディングの値を示しています。

 Aspect ratio  |  padding-bottom  |  for 30% width
------------------------------------------------
    1:1        |  = width         |    30%
    1:2        |  width x 2       |    60%
    2:1        |  width x 0.5     |    15%
    4:3        |  width x 0.75    |    22.5%
    16:9       |  width x 0.5625  |    16.875%




2.正方形の中にコンテンツを追加する

正方形の中に直接コンテンツを追加することはできないため(正方形の高さは拡張され、正方形は正方形ではなくなります)、子要素(この例ではdivを使用しています)を作成しposition: absolute;、その中にコンテンツを配置する必要があります。これにより、フローからコンテンツが取り出され、正方形のサイズが維持されます。

position:relative;絶対子が親に対して相対的に配置/サイズ設定されるように、親div を追加することを忘れないでください

3x3の正方形のグリッドにコンテンツを追加してみましょう。

HTML

<div class="square">
    <div class="content">
        .. CONTENT HERE ..
    </div>
</div>
... and so on 9 times for 9 squares ...

CSS

.square {
    float:left;
    position: relative;
    width: 30%;
    padding-bottom: 30%; /* = width for a 1:1 aspect ratio */
    margin:1.66%;
    overflow:hidden;
}

.content {
    position:absolute;
    height:80%; /* = 100% - 2*10% padding */
    width:90%; /* = 100% - 2*5% padding */
    padding: 10% 5%;
}

結果 <-それをきれいにするためにいくつかのフォーマットを使って!



3.コンテンツの中央揃え

水平方向:

これは非常に簡単で、に追加text-align:centerするだけです.content
結果

垂直方向の配置

これは大変です!トリックは使用することです

display:table;
/* and */
display:table-cell;
vertical-align:middle;

しかし、我々は使用できないdisplay:table;.square.content、それはと競合するためのdiv position:absolute;我々は内部の2人の子供を作成する必要があるので、.contentdivを。コードは次のように更新されます。

HTML

<div class="square">
    <div class="content">
        <div class="table">
            <div class="table-cell">
                ... CONTENT HERE ...
            </div>
        </div>
    </div>
</div>
... and so on 9 times for 9 squares ...

CSS:

.square {
    float:left;
    position: relative;
    width: 30%;
    padding-bottom : 30%; /* = width for a 1:1 aspect ratio */
    margin:1.66%;
    overflow:hidden;
}

.content {
    position:absolute;
    height:80%; /* = 100% - 2*10% padding */
    width:90%; /* = 100% - 2*5% padding */
    padding: 10% 5%;
}
.table{
    display:table;
    height:100%;
    width:100%;
}
.table-cell{
    display:table-cell;
    vertical-align:middle;
    height:100%;
    width:100%;
}




これで完了です。結果をここで確認できます。

LIVE FULLSCREEN RESULT

ここで編集可能なフィドル



2
@ d.raevはい。パーセンテージのパディングとマージンは、親の幅に従って計算されます。パディングについては、ここを確認してくださいdeveloper.mozilla.org/en-US/docs/Web/CSS/padding
web-tiki

4
これは素晴らしい。他の人への注意:使用している* { box-sizing: border-box; }場合は、.content divの高さと幅を100%に調整する必要があります。:)
Rob Flaherty、2014年

2
マージン値の背後にある計算は何ですか?グリッドを5x5に設定したい場合はどうなりますか?
kiwi1342 2016年

2
@ kiwi1342 行のすべてのマージン+すべての幅の合計は100%でなければなりません。したがって、5x5グリッドの場合は、要素の両側に18%の幅と1%のマージンを使用できます。
web-tiki 2016年

1
素晴らしい。ちょうど前向き:水平方向と垂直方向の中央に配置するには、.contentをフレックスボックスに設定しますjustify-content: center; align-items: center; flex-flow: column nowrap;
NonameSL

14

画面の幅に応じて正方形を反応させるvw(ビュー幅)単位を使用できます。

これの簡単なモックアップは次のようになります:

html,
body {
  margin: 0;
  padding: 0;
}
div {
  height: 25vw;
  width: 25vw;
  background: tomato;
  display: inline-block;
  text-align: center;
  line-height: 25vw;
  font-size: 20vw;
  margin-right: -4px;
  position: relative;
}
/*demo only*/

div:before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  height: inherit;
  width: inherit;
  background: rgba(200, 200, 200, 0.6);
  transition: all 0.4s;
}
div:hover:before {
  background: rgba(200, 200, 200, 0);
}
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>


4
useはmargin-left: -4px;使用しないでくださいmargin-right:-4px。むしろ、mincharspaceの不整合を台無しにするのではなく、ラッパーの親font-sizeを0に設定し、子要素の場合は1rem(relative-em)にリセットする
Roko C. Buljan

9

受け入れられた答えは素晴らしいですが、これはで行うことができますflexbox

これは、行ごとに1〜10列を表示できるBEM構文で記述されたグリッドシステムです。

最後の行が不完全な場合(たとえば、行ごとに5つのセルを表示するように選択し、7つのアイテムがある場合)、後続のアイテムは水平方向の中央に配置されます。後続項目の水平方向の配置を制御するには、クラスのjustify-contentプロパティを変更するだけ.square-gridです。

.square-grid {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

.square-grid__cell {
  background-color: rgba(0, 0, 0, 0.03);
  box-shadow: 0 0 0 1px black;
  overflow: hidden;
  position: relative;
}

.square-grid__content {
  left: 0;
  position: absolute;
  top: 0;
}

.square-grid__cell:after {
  content: '';
  display: block;
  padding-bottom: 100%;
}

// Sizes  Number of cells per row

.square-grid__cell--10 {
  flex-basis: 10%;
}

.square-grid__cell--9 {
  flex-basis: 11.1111111%;
}

.square-grid__cell--8 {
  flex-basis: 12.5%;
}

.square-grid__cell--7 {
  flex-basis: 14.2857143%;
}

.square-grid__cell--6 {
  flex-basis: 16.6666667%;
}

.square-grid__cell--5 {
  flex-basis: 20%;
}

.square-grid__cell--4 {
  flex-basis: 25%;
}

.square-grid__cell--3 {
  flex-basis: 33.333%;
}

.square-grid__cell--2 {
  flex-basis: 50%;
}

.square-grid__cell--1 {
  flex-basis: 100%;
}

フィドル:https : //jsfiddle.net/patrickberkeley/noLm1r45/3/

これはFFとChromeでテストされています。


3
それでも、高さを修正するためにpadding-bottomを使用しているので、実際には、受け入れられたのと同じ答えです。唯一の違いは、グリッドの作成方法であり、正方形のグリッドではありません。
extempl 2017

0

このソリューションは、さまざまな配給のレスポンシブボックスに使用します。

HTML:

<div class="box ratio1_1">
  <div class="box-content">
            ... CONTENT HERE ...
  </div>
</div>

CSS:

.box-content {
  width: 100%; height: 100%;
  top: 0;right: 0;bottom: 0;left: 0;
  position: absolute;
}
.box {
  position: relative;
  width: 100%;
}
.box::before {
    content: "";
    display: block;
    padding-top: 100%; /*square for no ratio*/
}
.ratio1_1::before { padding-top: 100%; }
.ratio1_2::before { padding-top: 200%; }
.ratio2_1::before { padding-top: 50%; }
.ratio4_3::before { padding-top: 75%; }
.ratio16_9::before { padding-top: 56.25%; }

JSfiddle.netでデモを見る


2
それはあなたがあなたの答えについて詳しく説明している場合に有益で...あるいはJSFiddle含まれるであろう
Wavesailor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.