[CSS]シンプルなHTMLで、美しいプログレスバーを実装するスタイルシートのテクニック
Post on:2018年9月19日
フォームなどのタスク完了までの進捗状況を表示するプログレスバーを実装するスタイルシートのテクニックを紹介します。
シンプルなHTMLで実装されており、画像は一切無し、文字要素とborderとborder-radiusでビジュアル化されています。
HTML
プログレスバーはリスト要素で実装されており、現在位置には.is-activeを与えます。
1 2 3 4 5 6 7 8 9 10 11 12 |
<ol class="progress-bar"> <li class="is-active"><span>Objective & Template</span></li> <li><span>Options</span></li> <li><span>Step</span></li> <li><span>In a Nutshell</span></li> <li><span>Step</span></li> <li><span>Step</span></li> <li><span>Launch Date</span></li> <li><span>Step</span></li> <li><span>Step</span></li> <li><span>Agreement</span></li> </ol> |
CSS
カラーは変数で定義されているので、簡単に変更できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
* { box-sizing: border-box; } :root { --color-white: #fff; --color-black: #333; --color-gray: #75787b; --color-gray-light: #bbb; --color-gray-disabled: #e8e8e8; --color-green: #53a318; --color-green-dark: #383; --font-size-small: .75rem; --font-size-default: .875rem; } |
プログレスバーのスタイルシートです。
各アイテムはFlexboxでレイアウトされており、ボーダーやドットもスタイルシートで実装されています。アニメーションなどのインタラクションも含まれているのでコードは長いですが、静的に使用するのであればコードはかなり短くなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
.progress-bar { display: flex; justify-content: space-between; list-style: none; padding: 0; margin: 0 0 1rem 0; } .progress-bar li { flex: 2; position: relative; padding: 0 0 14px 0; font-size: var(--font-size-default); line-height: 1.5; color: var(--color-green); font-weight: 600; white-space: nowrap; overflow: visible; min-width: 0; text-align: center; border-bottom: 2px solid var(--color-gray-disabled); } .progress-bar li:first-child, .progress-bar li:last-child { flex: 1; } .progress-bar li:last-child { text-align: right; } .progress-bar li:before { content: ""; display: block; width: 8px; height: 8px; background-color: var(--color-gray-disabled); border-radius: 50%; border: 2px solid var(--color-white); position: absolute; left: calc(50% - 7px); bottom: -7px; z-index: 3; transition: all .2s ease-in-out; } .progress-bar li:first-child:before { left: 0; } .progress-bar li:last-child:before { right: 0; left: auto; } .progress-bar span { transition: opacity .3s ease-in-out; } .progress-bar li:not(.is-active) span { opacity: 0; } .progress-bar .is-complete:not(:first-child):after, .progress-bar .is-active:not(:first-child):after { content: ""; display: block; width: 100%; position: absolute; bottom: -2px; left: -50%; z-index: 2; border-bottom: 2px solid var(--color-green); } .progress-bar li:last-child span { width: 200%; display: inline-block; position: absolute; left: -100%; } .progress-bar .is-complete:last-child:after, .progress-bar .is-active:last-child:after { width: 200%; left: -100%; } .progress-bar .is-complete:before { background-color: var(--color-green); } .progress-bar .is-active:before, .progress-bar li:hover:before, .progress-bar .is-hovered:before { background-color: var(--color-white); border-color: var(--color-green); } .progress-bar li:hover:before, .progress-bar .is-hovered:before { transform: scale(1.33); } .progress-bar li:hover span, .progress-bar li.is-hovered span { opacity: 1; } .progress-bar:hover li:not(:hover) span { opacity: 0; } |
実際の動作は、下記ページでご覧ください。
See the Pen Progress Bar by Mike Aparicio (@peruvianidol) on CodePen.
sponsors