《 12:22 公開/更新》
画像と文章をセットにしたボックスを複数個並べるようなとき、奇数番目と偶数番目とで画像と文章の配置を左右逆転させて、ジグザグに配置するデザインを作りたい場合があります。CSSのnth-child疑似クラスを使って偶数番目か奇数番目かを判断し、flex-directionプロパティを使ってフレックスボックスの配置を変化させる書き方なら、HTMLで配置を調整することなくCSSだけでジグザグな配置を作れます。HTMLソース上で配置を固定してしまうと、後から並び替えたいときに修正の手間が掛かりすぎて大変なので、CSSで配置を変化させる方法がおすすめです。
まずは、画像と文章を1つずつ掲載したボックスを複数個並べ、そのボックス内で文章と画像の左右配置を1個ずつ逆転させるジグザグ配置の表示例をご紹介しておきます。
この1つ目(奇数番目)の文章は左側に配置されています。
この2つ目(偶数番目)の文章は右側に配置されています。
この3つ目(奇数番目)の文章は左側に配置されています。
この4つ目(偶数番目)の文章は右側に配置されています。
この5つ目(奇数番目)の文章は左側に配置されています。
上記の表示例では、1つのボックス内にある「画像と文章の左右配置」が、ボックスごとに逆転しています。
このような左右の配置を、HTMLソースの段階で固定してしまうと、途中にボックスを追加したくなった際の修正作業がとても面倒になってしまいます。文章と画像のどちらを左側(または右側)にするかに関係なくHTMLソースは固定しておき、CSSだけを使って左右の配置を入れ替える方法を採用すれば、更新時の手間が省けてとても楽に作れます。
先程の表示サンプルでは、下図右側に掲載したように、どの項目もHTMLソース内では「文章ボックスが先で画像ボックスが後」という記述順序になっています。この状態で、実際に画像を右側に配置するか左側に配置するかは、CSSだけで調整しています。
この方法なら、ボックスの順序を入れ替えたり、新しいボックスを途中に挿入したりしても、左右のジグザグ配置は自動的に調整されるため、見た目を再調整する手間が不要でとても楽です。
まずは、HTMLソースを記述しましょう。ボックス内部で画像と文章のどちらを左側にしたい場合でも関係なく、HTMLソース内では文章を先に、画像を後に書いておきます。(順序は逆でも構いませんから、画像を先にして文章を後にしても問題ありません。どちらかに統一しておいて下さい。)
HTMLソース
<div> <div class="complexBox"> <p class="text">表示上の配置に関係なく、文章ボックスを先に書きます。</p> <p class="photo"><img src="photo1.jpg" alt="写真1"></p> </div> <div class="complexBox"> <p class="text">表示上の配置に関係なく、文章ボックスを先に書きます。</p> <p class="photo"><img src="photo2.jpg" alt="写真2"></p> </div> <div class="complexBox"> <p class="text">表示上の配置に関係なく、文章ボックスを先に書きます。</p> <p class="photo"><img src="photo3.jpg" alt="写真3"></p> </div> : : : (必要なだけ繰り返して記述して下さい) : : : </div>
※CSSで「何番目の子要素か」を判定することによって左右の配置を入れ替えますので、全体の外側に1つ適当なブロック要素が必要です。ここでは単にdiv要素で囲んでいます。
次に、CSSで偶数番目か非数番目かを判断し、それに応じて左右の配置を決める装飾を記述します。
次に、CSSソースを記述しましょう。まずは、偶数番目のボックスと奇数番目のボックスで装飾を分ける書き方を紹介しておきます。
CSSソース(説明用)
.complexBox:nth-child(2n+1) { /* 奇数番目 */ } .complexBox:nth-child(2n ) { /* 偶数番目 */ }
ここで重要なのは、nth-child疑似クラスです。これは、対象の要素が「親要素に含まれている子要素の中で、何番目の子要素なのか」を示せる疑似クラスです。丸括弧の中に「何番目なのか」を示す式を記述して使います。
ここでは偶数番目と奇数番目を判別できれば良いので、以下のように記述します。
ここでは詳しくは触れませんが、例えば「3n」と書けば『3の倍数』番目になり、「3n+1」と書けば『3の倍数+1』番目、「3n+2」と書けば『3の倍数+2』番目を示せますから、3種類の装飾を順番に繰り返し登場させることもできます。
ブロックとブロックの間に例えば <br> などを入れてしまうと、そのbr要素も1つの要素としてカウントされるため、奇数番目・偶数番目の解釈がズレてしまう点に注意して下さい。そのような、カウント対象外にしたい要素が中間に含まれる場合には、nth-child疑似クラスの代わりにnth-of-type疑似クラスを使う方が良いかも知れません。nth-childが「何番目の子要素か」を示すのに対して、nth-of-typeは「指定の要素の中で何番目か」を示します。
あとは、奇数番目・偶数番目それぞれの場合で、ボックス内部の横並びの配置を左右逆転させるような装飾を書けば済みます。
複数個並んでいるボックス(ここでは文章ボックスと画像ボックスの2つ)の横並び順序を変更するには、
という方法を使うと簡単です。
この方法なら、flex-directionプロパティの値を変化させるだけで、左右の配置を入れ替えられますから。
必要なCSSソースは以下の通りです。
CSSソース
.complexBox { display: flex; /* 中身をflexboxとして配置する */ margin: 5px 0; /* 外側の余白量(上下に5px・左右にゼロ) */ } .complexBox:nth-child(2n+1) { flex-direction: row; } /* 奇数番目は左から右へ並べる */ .complexBox:nth-child(2n ) { flex-direction: row-reverse; } /* 偶数番目は右から左へ並べる */
上記CSSソースの2行目で、displayプロパティの値に「flex」を指定しています。こうすると、その内部のボックスをフレックスボックスとして配置できます。
フレックスボックスでは、何も指定しなければ「横並び」で「左側から右方向へ」並べられます(※)が、flex-directionプロパティを使えば並べる方向を指定できます。
そこで、5行目と6行目では、
このため、
CSSだけでこのように左右の配置が入れ替わるため、HTMLソースの記述を入れ替える必要はありません。
※厳密には「左から右」だと決まっているわけではなく「書字方向と同じ」です。文字を左から右へ向かって書く環境では、ボックスも左から右へ並びます。もし、文字を右から左へ向かって書く環境(アラビア語環境など)で表示される場合はボックスも右から左へ向かって並びます。
ボックスの左右の位置関係を入れ替えるためにHTMLソースの修正が不要だということは、複数のボックスの中間に新たなボックスを追加しても、ジグザグ配置の構成は崩れないということです。
下記(左側)は、冒頭でもご紹介した5つのボックスの並びですが、ここで、上から3番目にボックスを1つ追加して下図右側のようにしても、文章ボックスと画像ボックスの左右関係は自動的に調整されて、正しい(意図通りの)ジグザグ配置が維持されます。
▼ボックス5つの並び
HTMLソースでは、画像と文章の左右関係を気にせずに記述。
HTMLソースでは、画像と文章の左右関係を気にせずに記述。
HTMLソースでは、画像と文章の左右関係を気にせずに記述。
HTMLソースでは、画像と文章の左右関係を気にせずに記述。
HTMLソースでは、画像と文章の左右関係を気にせずに記述。
▼1個挿入して、ボックス6つの並び
HTMLソースでは、画像と文章の左右関係を気にせずに記述。
HTMLソースでは、画像と文章の左右関係を気にせずに記述。
これは、新たに挿入したボックスです。
HTMLソースでは、画像と文章の左右関係を気にせずに記述。
HTMLソースでは、画像と文章の左右関係を気にせずに記述。
HTMLソースでは、画像と文章の左右関係を気にせずに記述。
最後に、上記でご紹介したHTML+CSSソースをまとめて再掲しておきます(まとめないといけない程に長くはありませんけども)。コピー&ペーストして使ってみたい場合にご活用下さい。
HTMLソースまとめ
<div> <div class="complexBox"> <p class="text">表示上の位置関係に関係なく、文章ボックスを先に書きます。</p> <p class="photo"><img src="photo1.jpg" alt="写真1"></p> </div> <div class="complexBox"> <p class="text">表示上の位置関係に関係なく、文章ボックスを先に書きます。</p> <p class="photo"><img src="photo2.jpg" alt="写真2"></p> </div> <div class="complexBox"> <p class="text">表示上の位置関係に関係なく、文章ボックスを先に書きます。</p> <p class="photo"><img src="photo3.jpg" alt="写真3"></p> </div> <div class="complexBox"> <p class="text">表示上の位置関係に関係なく、文章ボックスを先に書きます。</p> <p class="photo"><img src="photo4.jpg" alt="写真4"></p> </div> <div class="complexBox"> <p class="text">表示上の位置関係に関係なく、文章ボックスを先に書きます。</p> <p class="photo"><img src="photo5.jpg" alt="写真5"></p> </div> </div>
CSSソースまとめ
.complexBox { display: flex; /* 中身をflexboxとして配置する */ margin: 5px 0; /* 外側の余白量(上下に5px・左右にゼロ) */ } .complexBox:nth-child(2n+1) { flex-direction: row; } /* 奇数番目は左から右へ並べる */ .complexBox:nth-child(2n ) { flex-direction: row-reverse; } /* 偶数番目は右から左へ並べる */
以上、偶数番目か奇数番目かで画像の配置を左右逆転させるボックス構造の作り方でした。
ぜひ、使ってみて下さい。
()
(前の記事) « 最後の要素の後には区切り線を引かないCSS (ブロック間にだけ線を引くCSS)
前後のスタイルシート TIPS
< 旧 / 新 >
▼当サイト内外で関連しそうな記事などが自動表示されています。(たぶん)