今日は、前回実装したカードレイアウトのバリエーションを作成します。縦並び → 横向きにしてみます。
こんにちは。Webコーダーのはるです。
前回から書き始めた、FLOCSSで考えるカードレイアウトの記事 vol.2です。
前回は、カードレイアウトの実装について書きました。
もしよろしければ、下記リンクからご覧ください。
【FLOCSS / コンポーネント】カードレイアウトの実装、マークアップからリンクの付け方
今回は、前回作ったカードレイアウトのバリエーション(※)を作成してみます。
※FLOCSSでは正しくはModifierですが、わかりやすいようにバリエーションという言葉を使用しています。
【FLOCSS / コンポーネント】カードレイアウトのバリエーション実装
前回のカードレイアウトは下図です。
今回は、ここからバリエーションを作成して、下図のような横向きのレイアウトにしてみます。
※今回、PCのみ横レイアウトで表示し、SPでは見づらくなるため縦レイアウトを採用しています。
恐れ入りますが、PCからご覧ください。
HTML
<!DOCTYPE html>
<html lang="jn">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>card layout</title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<div class="c-card c-card--row">
<div class="c-card__contents">
<h2 class="c-card__title"><a class="c-card__link" href="#">タイトル</a></h2>
<!-- /.c-card__title -->
<p class="c-card__text">本文。サンプルテキストです。サンプルテキストです。サンプルテキストです。サンプルテキストです。サンプルテキストです。サンプルテキストです。サンプルテキストです。</p>
<!-- /.c-card__text -->
<div class="c-card__thumbnail"><img class="c-card__thumbnail-pict" src="thumbnail.jpg" alt="画像のキャプション"></div>
<!-- /.c-card__thumbnail -->
<ul class="c-card__info">
<li class="c-card__info-item"><time datetime="2021-01-01">2021.01.01</time></li>
<li class="c-card__info-item"><a class="c-card__category" href="#">HTMLカテゴリ</a></li>
</ul>
<!-- /.c-card__info -->
</div>
<!-- /.c-card__contents -->
</div>
<!-- /.c-card -->
</body>
</html>
- <div class=”c-card c-card–row“>
→ ここで「.c-card–row」というバリエーション用のクラスを付与。 - そのほかのHTMLは、.c-cardの時と変わらず。バリエーション作成時にHTMLの構造が変わらないのが理想。
CSS
/* 基本のカード */
.c-card {
position: relative;
width: 100%;
max-width: 400px;
border: 2px solid #ccc;
}
.c-card__contents {
display: flex;
flex-direction: column;
}
.c-card__title {
font-weight: bold;
font-size: 2rem;
margin: 1.5rem 1rem 1rem;
order: 2;
}
.c-card__link {
text-decoration: none;
color: currentColor;
}
.c-card__link:before {
display: block;
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.c-card__text {
font-size: 1.2rem;
padding: 0;
margin: 0 1rem;
order: 3;
}
.c-card__thumbnail {
order: 1;
}
.c-card__thumbnail-pict {
display: block;
width: 100%;
height: auto;
}
.c-card__info {
display: flex;
align-items: center;
list-style: none;
margin: 1.5rem 1rem;
padding: 0;
order: 4;
}
.c-card__category {
display: inline-flex;
align-items: center;
justify-content: center;
position: relative;
z-index: 1;
text-decoration: none;
padding: 0.3rem 0.8rem;
margin-left: 1.2rem;
color: #fff;
background-color: #ccc;
transition: opacity 0.5s ease-in-out;
}
.c-card__category:focus,
.c-card__category:hover {
opacity: 0.7;
}
/* c-card--row */
@media screen and (min-width: 768px) {
.c-card.c-card--row {
max-width: 680px;
border: none;
}
.c-card.c-card--row .c-card__contents {
display: grid;
grid-template-columns: auto auto;
grid-template-rows: auto auto auto;
gap: 0 20px;
grid-template-areas:
"pict title"
"pict text"
"pict info";
}
.c-card.c-card--row .c-card__thumbnail {
grid-area: pict;
}
.c-card.c-card--row .c-card__title {
grid-area: title;
margin: 0.3rem 0 0 0;
font-size: 1.4rem;
}
.c-card.c-card--row .c-card__text {
grid-area: text;
margin: 0;
font-size: 0.9rem;
}
.c-card.c-card--row .c-card__info {
grid-area: info;
margin: 0 0 0.3rem 0;
font-size: 0.9rem;
}
}
コードが長く見えますが、
– 上部:前回のブログで解説した基本のカードレイアウト
– 下部:今回作成したバリエーション
です。
・HTMLの.c-cardクラスに .c-card–rowクラスが並列でつくと、バリエーションで作ったスタイルになります。
・今回は、768px以上の場合だけ横向き、767px以下は前回作った縦積みレイアウトに戻るようにしました。
以下、解説します。
.c-card.c-card--row .c-card__contents {
display: grid;
grid-template-columns: auto auto;
grid-template-rows: auto auto auto;
gap: 0 20px;
grid-template-areas:
"pict title"
"pict text"
"pict info";
}
(↑)元々の縦積みカードでは、display: flex; を指定していた部分です。
HTMLの構造を変えずに横並びのレイアウトにするには、flexboxは使用できないため、gridを使用します。 grid-template-areasで、以下のようなgridのエリア分けをしました。
.c-card.c-card--row .c-card__thumbnail {
grid-area: pict;
}
.c-card.c-card--row .c-card__title {
grid-area: title;
margin: 0.3rem 0 0 0;
font-size: 1.4rem;
}
.c-card.c-card--row .c-card__text {
grid-area: text;
margin: 0;
font-size: 0.9rem;
}
.c-card.c-card--row .c-card__info {
grid-area: info;
margin: 0 0 0.3rem 0;
font-size: 0.9rem;
}
(↑).c-text__thumbnail には、grid-area: pict; など、それぞれのクラス名にグリッドエリア名を指定します。
gridは、下記の記事が大変わかりやすくお世話になりました。ありがとうございます。
また、gridを試しに組む時に下記のサイトを利用しました。制作パートナーさんに教えていただきました。ありがとうございます。
今回は、カードを囲んでいたborderもなくしてみました。一見、全然別のレイアウトに見えるコンポーネントでも、元のスタイルを継承したまま新しいコンポーネントを作ることができるので、バリエーションは便利です。
カード全体をクリックできるhoverや、.c-card__contents内の要素(labelのスタイル)などは、元のスタイルを継承しているので、とても楽にバリエーション作成ができました。
簡単なデモを、CodeSandboxで用意しました。
※横レイアウトはスマホから確認ができません。PCでご覧ください。
あとがき
日頃、時間を割いてフィードバックをくださる制作パートナーさんに感謝します。
そんなバリエーションですが、デザインカンプを見て共通項を探し、上手にバリエーション化できるように訓練していきたいです。
今回は、HTMLの構造を変えずに、バリエーション用のCSSも少なくできたと思います。
できるだけシンプルな構造で作成できるように意識します。
今日は以上です。