CommentOut

CSSだけで『流れ』を綺麗にレスポンシブに表現したい CSSだけで『流れ』を綺麗にレスポンシブに表現したい

CSSだけで『流れ』を綺麗にレスポンシブに表現したい

公開日:  最終更新日:

ワークフローや流れの説明をCSSで作る時、まだ画像で作っていませんか?
画像だと拡大縮小した時にボケるし、文字がどんどん小さくなっていって、潰れて読めなくなってしまいますよね。

そんな時に、CSSを使ってレスポンシブに表現する方法があります。

ワークフローにはリスト(ul, ol)を使おう

今回作るのは、以下のような画面幅が変わると、それに合わせて線が伸びるワークフローです。

上のサンプルでは、リスト(ol > li)に疑似要素を使って、実装しています。
ここから、各スタイルの部分で何をしているのか手順ごとに解説します。

手順1:リストのスタイルを消し、疑似要素を表示する

通常、リストには「list-style」が設定されていますから、これを消します。

ol {
    list-style-type: none;
}

そして、list-styleを消した後、olタグのカウンターをリセットして、疑似要素に番号を表示します。

ol {
  	counter-reset: item;
}

ol > li::before {
		counter-increment: item;
		content: counter(item);
}

手順2:番号を修飾

手順1で疑似要素に番号を表示できるようになったら、番号を装飾します。

ol > li::before {
			display: flex;            // display: block;ではなく、flex;下のalign-itemsとjustify-contentで上下中央寄せにするため
			width: 40px;
			height: 40px;
			align-items: center;      // display: flex;の時、上下中央に配置
			justify-content: center;  // display: flex;の時、左右中央に配置
			font-size: 22px;
			font-weight: bold;
			background: lightgray;
			border-radius: 50%;       // 50%で丸になる
}

手順3:線を引く

今まで画像で「ワークフロー」を表現していた人は、画面幅によって行数が変わるので、線が切れてしまうじゃないかと考えているはずです。
しかし、li要素のborderを利用すれば、行数に応じて伸縮する線を引くことができます。

ol > li {
    border-left: 1px solid black;
}

手順4:番号の位置を整える

最後に番号の場所を整えます。

ol > li {
    position: relative;
}
ol > li::before {
    position: absolute;
    top: 0px;
    left: -20px;
}

positionで場所を整えてあげてもいいですし

ol > li::before {
			transform: translate(-53%, 0%);
}

transformで移動させてもいいです。

注意点

ol > li:last-of-type {
    border: none;
}

リストの最後には線をつけませんが、単純にborder: none;をすると、最後の要素だけborder-width分位置がずれる可能性があります。
そこで、簡単な方法として色だけ透明する方法があります。

ol > li:last-of-type {
    border-color: transparent;
}

あとはそもそもbox-sizing: border-box;に設定しておけばずれないのかな?(未検証)

宣伝
WordPressサイトのテンプレート編集やトラブル対応、バグ修正、簡単なJavascriptの作成(カルーセルやバリデーション等)など、小規模なスポット対応を受け付けております。
もしお困りごとがありましたら、お問い合わせフォームよりご相談ください。

この記事を書いた人

uilou

uilou

プログラマー

基本的に、自分自身の備忘録のつもりでブログを書いています。 自分と同じ所で詰まった人の助けになれば良いかなと思います。 システムのリファクタリングを得意としており、バックエンド、フロントエンド、アプリケーション、SQLなど幅広い知識と経験があります。 広いだけでなく、知識をもっと深堀りしていきたいですね。