Bootstrap 5 フレームワークのカスタム ブレッドクラム
要約: カスタム Bootstrap 5 ブレッドクラムのコード (CSS) を紹介します。これは、以前に公開された記事の改良版です。
Bootstrap 5 フレームワークには、非常に基本的なブレッドクラム実装が付属しています。視覚的にも機能的にも、より優れたものが必要でした。時間が経つにつれて、私のアプリケーションでは、ユーザーが特定のアイテム/オブジェクトの詳細を調べた後に、ブレッドクラムを使用して上位レベルに戻ることができるようにすることが非常に便利であることがわかりました。
私にとって非常に重要だったのは、テキスト データを 2 行 で表示できることです。特に、あるアカウントのデータであることを示すようなデータと ID を表示すると同時に、口座番号。
インターネットで見た解決策に満足できなかったので、独自の解決策を開発しました。
タイトルにはこれが「Bootstrap 5」ライブラリであると書かれていますが、これは Bootstrap CSS から完全に独立しており、Bootstrap 5 テーマに合わせて選択された色のみが Bootstrap CSS から取得されています。必要に応じて、Bootstrap から独立して使用することもできます。
このバージョンには、コードを短くするために Graeme_Grant@codeproject.com からの提案とコードが組み込まれています。私は必ずしもすべての提案に同意するわけではありません。なぜなら、コードは短いコードよりも人間が読みやすいコードの方が重要だと考えているからです。そこで、独自の新しいバージョンを作成しました。
また、このバージョンでは、Font Awesome Icons の代わりに Bootstrap Icons [1] が使用されます。
最終結果とそれを生成するデモ コードを次に示します。 3 つのサイズ (大、中、小) でブレッドクラム ストリップを作成し、オプションでアイコンを使用しました。色は自由に選択でき、明示的に無効にしない限り、ホバー効果はデフォルトで存在します。通常、最後のパンくずリストが現在選択されているため、ホバー効果は無効になります。
上記のレンダリングを生成する HTML コードは次のとおりです。 Web 開発者は誰でも、HTML コードを読んで上の図と照合して、好みのバリエーションを見つけることができるはずです。
アイコンを使用したい場合は、この例と同様に、Bootstrap Icons [1] の無料バージョンをインストールして参照できます。アイコンを使用するための HTML コードは、アイコンとテキストを 2 つの別個の要素に分離して、個別にスタイル設定できるようにする必要があるため、少し複雑です。
<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="breadcrumb3.css" /> <!-- Download bootstrap icons from https://icons.getbootstrap.com/#install and install --> <link rel="stylesheet" href="bootstrap-icons-1.11.3\font\bootstrap-icons.min.css" /> </head> <body> <!--Large size ---------------------------------------------------------------> <H5>Large size, info case</H5> <div class="breadcrumb3-lg "> <a href="#" class="breadcrumb3-item info">Accounts</a> <a href="#" class="breadcrumb3-item info">Account number</br>123456</a> <a href="#" class="breadcrumb3-item primary">Details</a> </div> <H5>Large size, info case, with no hover effect on the last button</H5> <div class="breadcrumb3-lg "> <a href="#" class="breadcrumb3-item info">Contracts</a> <a href="#" class="breadcrumb3-item info">Contract number</br>99999-2024</a> <a href="#" class="breadcrumb3-item primary no-hover-effect">Contract Info</a> </div> <H5>Large size, Rainbow</H5> <div class="breadcrumb3-lg "> <a href="#" class="breadcrumb3-item info ">Breadcrumb</br>info</a> <a href="#" class="breadcrumb3-item primary ">Breadcrumb</br>primary</a> <a href="#" class="breadcrumb3-item warning ">Breadcrumb</br>warning</a> <a href="#" class="breadcrumb3-item success ">Breadcrumb</br>success</a> <a href="#" class="breadcrumb3-item secondary ">Breadcrumb</br>secondary</a> <a href="#" class="breadcrumb3-item light ">Breadcrumb</br>light</a> <a href="#" class="breadcrumb3-item danger ">Breadcrumb</br>danger</a> </div> <H5>Large size, icons usage</H5> <div class="breadcrumb3-lg "> <a href="#" class="breadcrumb3-item info"> <span class="breadcrumb3-icon" ><i class="bi bi-people-fill"></i></span> <span class="breadcrumb3-text" >Users</span> </a> <a href="#" class="breadcrumb3-item info"> <span class="breadcrumb3-icon" ><i class="bi bi-person-fill"></i></span> <span class="breadcrumb3-text" >User number</br>123456</span> </a> <a href="#" class="breadcrumb3-item primary"> <span class="breadcrumb3-icon" ><i class="bi bi-info-circle-fill"></i></span> <span class="breadcrumb3-text" >Details</span> </a> </div> <!--Medium size ---------------------------------------------------------------> <H5>Medium size, info case</H5> <div class="breadcrumb3-md "> <a href="#" class="breadcrumb3-item info">Accounts</a> <a href="#" class="breadcrumb3-item info">Account number</br>123456</a> <a href="#" class="breadcrumb3-item primary">Details</a> </div> <H5>Medium size, info case, with no hover effect on the last button</H5> <div class="breadcrumb3-md "> <a href="#" class="breadcrumb3-item info">Contracts</a> <a href="#" class="breadcrumb3-item info">Contract number</br>99999-2024</a> <a href="#" class="breadcrumb3-item primary no-hover-effect">Contract Info</a> </div> <H5>Medium size, Rainbow</H5> <div class="breadcrumb3-md "> <a href="#" class="breadcrumb3-item info ">Breadcrumb</br>info</a> <a href="#" class="breadcrumb3-item primary ">Breadcrumb</br>primary</a> <a href="#" class="breadcrumb3-item warning ">Breadcrumb</br>warning</a> <a href="#" class="breadcrumb3-item success ">Breadcrumb</br>success</a> <a href="#" class="breadcrumb3-item secondary ">Breadcrumb</br>secondary</a> <a href="#" class="breadcrumb3-item light ">Breadcrumb</br>light</a> <a href="#" class="breadcrumb3-item danger ">Breadcrumb</br>danger</a> </div> <H5>Medium size, icons usage</H5> <div class="breadcrumb3-md "> <a href="#" class="breadcrumb3-item info"> <span class="breadcrumb3-icon" ><i class="bi bi-people-fill"></i></span> <span class="breadcrumb3-text" >Users</span> </a> <a href="#" class="breadcrumb3-item info"> <span class="breadcrumb3-icon" ><i class="bi bi-person-fill"></i></span> <span class="breadcrumb3-text" >User number</br>123456</span> </a> <a href="#" class="breadcrumb3-item primary"> <span class="breadcrumb3-icon" ><i class="bi bi-info-circle-fill"></i></span> <span class="breadcrumb3-text" >Details</span> </a> </div> <!--Small size ---------------------------------------------------------------> <H5>Small size, info case</H5> <div class="breadcrumb3-sm "> <a href="#" class="breadcrumb3-item info">Accounts</a> <a href="#" class="breadcrumb3-item info">Account number</br>123456</a> <a href="#" class="breadcrumb3-item primary">Details</a> </div> <H5>Small size, info case, with no hover effect on the last button</H5> <div class="breadcrumb3-sm "> <a href="#" class="breadcrumb3-item info">Contracts</a> <a href="#" class="breadcrumb3-item info">Contract number</br>99999-2024</a> <a href="#" class="breadcrumb3-item primary no-hover-effect">Contract Info</a> </div> <H5>Small size, Rainbow</H5> <div class="breadcrumb3-sm "> <a href="#" class="breadcrumb3-item info ">Breadcrumb</br>info</a> <a href="#" class="breadcrumb3-item primary ">Breadcrumb</br>primary</a> <a href="#" class="breadcrumb3-item warning ">Breadcrumb</br>warning</a> <a href="#" class="breadcrumb3-item success ">Breadcrumb</br>success</a> <a href="#" class="breadcrumb3-item secondary ">Breadcrumb</br>secondary</a> <a href="#" class="breadcrumb3-item light ">Breadcrumb</br>light</a> <a href="#" class="breadcrumb3-item danger ">Breadcrumb</br>danger</a> </div> <H5>Small size, icons usage</H5> <div class="breadcrumb3-sm "> <a href="#" class="breadcrumb3-item info"> <span class="breadcrumb3-icon" ><i class="bi bi-people-fill"></i></span> <span class="breadcrumb3-text" >Users</span> </a> <a href="#" class="breadcrumb3-item info"> <span class="breadcrumb3-icon" ><i class="bi bi-person-fill"></i></span> <span class="breadcrumb3-text" >User number</br>123456</span> </a> <a href="#" class="breadcrumb3-item primary"> <span class="breadcrumb3-icon" ><i class="bi bi-info-circle-fill"></i></span> <span class="breadcrumb3-text" >Details</span> </a> </div> </body> </html>
これは CSS です。JavaScript は必要ありません。 Bootstrap 5 の元のクラスとの名前の衝突を避けるために、クラス名 “breadcrumbs3” を意図的に使用しました。
/* breadcrumb3.css */ /* by Mark.Pelf@Codeproject.com, using partly code from Graeme_Grant@codeproject.com */ .breadcrumb3-lg, .breadcrumb3-md, .breadcrumb3-sm{ /* colors taken from bootstrap.css Bootstrap v5.1.0 */ --bs-primary: #0d6efd; --bs-secondary: #6c757d; --bs-success: #198754; --bs-info: #0dcaf0; --bs-warning: #ffc107; --bs-danger: #dc3545; --bs-light: #f8f9fa; --bs-dark: #212529; --bs-gray: #6c757d; --bs-white: white; --bs-black: black; /* changeable colors */ --_bgcolor: var(--bs-info); --_color: var(--bs-black); --_arrowbordercolor: var(--bs-gray); --_hover-bgcolor: var(--bs-primary); --_hover-color: var(--bs-white); } @media (max-width: 767px) { /* making it responsive, using CSS Flexbox with column (vertical) direction*/ .breadcrumb3-lg, .breadcrumb3-md, .breadcrumb3-sm { display: flex; flex-direction: column; } .breadcrumb3-lg .breadcrumb3-item { width: 80% ; border-radius: 4px 0 0 4px; padding-left: 25px ; } .breadcrumb3-md .breadcrumb3-item { width: 80% ; border-radius: 3px 0 0 3px; padding-left: 20px ; } .breadcrumb3-sm .breadcrumb3-item { width: 80% ; border-radius: 3px 0 0 3px; padding-left: 18px ; } } /* large size breadcrumb3-item -----------------------------------*/ .breadcrumb3-item { position: relative; display: table-cell; vertical-align: middle; color: var(--_color); background-color: var(--_bgcolor); height: 40px; line-height: 18px; font-size: 18px; text-align: center; padding-right: 10px; padding-left: 25px; text-decoration: none; } .breadcrumb3-text { display: table-cell; vertical-align: middle; text-align: center; } .breadcrumb3-icon { display: table-cell; text-align: center; line-height: 25px; font-size: 25px; padding-right: 10px; vertical-align: middle; } .breadcrumb3-item:first-child { border-radius: 4px 0 0 4px; padding-left: 15px; } .breadcrumb3-item:before, .breadcrumb3-item:after { content: ""; display: block; width: 0; height: 0; border-top: 20px solid transparent; position: absolute; margin-top: -20px; border-bottom: 20px solid transparent; left: 100%; top: 50%; } /* all this to create edge on arrow, creating gray arrow in background */ .breadcrumb3-item:after { border-left: 15px solid var(--_arrowbordercolor); margin-left: 1px; z-index: 2; } /* this is arrow itself, overwriting gray arrow */ .breadcrumb3-item:before { border-left: 15px solid var(--_bgcolor); margin-left: 0px; z-index: 3; } .breadcrumb3-item:hover:not(.no-hover-effect) , .breadcrumb3-item:focus:not(.no-hover-effect){ background-color: var(--_hover-bgcolor); color: var(--_hover-color); } .breadcrumb3-item:hover:not(.no-hover-effect):before, .breadcrumb3-item:focus:not(.no-hover-effect):before { border-left-color: var(--_hover-bgcolor); } /* remove keyboard navigation focus rectangle */ .breadcrumb3-item:focus-visible { outline: none; } /* medium size breadcrumb3-item -----------------------------------*/ .breadcrumb3-md .breadcrumb3-item { height: 32px; line-height: 15px; font-size: 15px; padding-left: 20px; } .breadcrumb3-md .breadcrumb3-icon { line-height: 20px; font-size: 20px; padding-right: 7px; } .breadcrumb3-md .breadcrumb3-item:first-child { border-radius: 3px 0 0 3px; padding-left: 12px; } /* all this to create edge on arrow, creating gray arrow in background */ .breadcrumb3-md .breadcrumb3-item:after { border-top: 16px solid transparent; border-bottom: 16px solid transparent; border-left: 12px solid var(--_arrowbordercolor); margin-top: -16px; margin-left: 1px; } /* this is arrow itself, overwriting gray arrow */ .breadcrumb3-md .breadcrumb3-item:before { border-top: 16px solid transparent; border-bottom: 16px solid transparent; border-left: 12px solid var(--_bgcolor); margin-top: -16px; } /* small size breadcrumb3-item-sm -----------------------------------*/ .breadcrumb3-sm .breadcrumb3-item { height: 24px; line-height: 11px; font-size: 11px; padding-right: 8px; padding-left: 18px; } .breadcrumb3-sm .breadcrumb3-icon { line-height: 16px; font-size: 16px; padding-right: 5px; } .breadcrumb3-sm .breadcrumb3-item:first-child { border-radius: 3px 0 0 3px; padding-left: 10px; } /* all this to create edge on arrow, creating gray arrow in background */ .breadcrumb3-sm .breadcrumb3-item:after { border-top: 12px solid transparent; border-bottom: 12px solid transparent; border-left: 8px solid var(--_arrowbordercolor); margin-top: -12px; margin-left: 1px; } /* this is arrow itself, overwriting gray arrow */ .breadcrumb3-sm .breadcrumb3-item:before { border-top: 12px solid transparent; border-bottom: 12px solid transparent; border-left: 8px solid var(--_bgcolor); margin-top: -12px; } /*breadcrumb3-item colors ------------------------------------------*/ /* we like specificity, to avoid namespace collisions */ .breadcrumb3-lg .info, .breadcrumb3-md .info, .breadcrumb3-sm .info { --_color: var(--bs-black); --_bgcolor: var(--bs-info); --_arrowbordercolor: var(--bs-gray); --_hover-bgcolor: var(--bs-primary); --_hover-color: var(--bs-white); } .breadcrumb3-lg .primary , .breadcrumb3-md .primary , .breadcrumb3-sm .primary { --_color: var(--bs-white); --_bgcolor: var(--bs-primary); --_arrowbordercolor: var(--bs-gray); --_hover-bgcolor: var(--bs-success); --_hover-color: var(--bs-white); } .breadcrumb3-lg .warning, .breadcrumb3-md .warning, .breadcrumb3-sm .warning { --_color: var(--bs-black); --_bgcolor: var(--bs-warning); --_arrowbordercolor: var(--bs-gray); --_hover-bgcolor: var(--bs-primary); --_hover-color: var(--bs-white); } .breadcrumb3-lg .success, .breadcrumb3-md .success, .breadcrumb3-sm .success { --_color: var(--bs-black); --_bgcolor: var(--bs-success); --_arrowbordercolor: var(--bs-gray); --_hover-bgcolor: var(--bs-primary); --_hover-color: var(--bs-white); } .breadcrumb3-lg .secondary, .breadcrumb3-md .secondary, .breadcrumb3-sm .secondary { --_color: var(--bs-white); --_bgcolor: var(--bs-secondary); --_arrowbordercolor: var(--bs-gray); --_hover-bgcolor: var(--bs-primary); --_hover-color: var(--bs-white); } .breadcrumb3-lg .light, .breadcrumb3-md .light, .breadcrumb3-sm .light { --_color: var(--bs-black); --_bgcolor: var(--bs-light); --_arrowbordercolor: var(--bs-gray); --_hover-bgcolor: var(--bs-primary); --_hover-color: var(--bs-white); } .breadcrumb3-lg .danger, .breadcrumb3-md .danger, .breadcrumb3-sm .danger { --_color: var(--bs-white); --_bgcolor: var(--bs-danger); --_arrowbordercolor: var(--bs-gray); --_hover-bgcolor: var(--bs-primary); --_hover-color: var(--bs-white); }
ここでは、CSS がどのように機能するかについていくつかのヒントを示します。ただし、これは非常に単純な CSS コードであり、ほとんどの部分は一目瞭然です。
ここでは、CSS で三角形を作成する非常に人気のあるトリックが使用されています。ポイントは、CSS の境界線をレンダリングする機能を悪用し、三角形の形の境界線をレンダリングさせることです。これを行うには、幅と高さがゼロで、片側に矢印として機能する色付きの境界線を備えたブロック要素を作成し、隣接する 2 つの側面に 2 つの透明な境界線を作成します。
三角形自体が境界線であるため、その上に境界線を作成することはできません。したがって、三角形/矢印に境界線を作成するコツは、2 つの三角形を作成し、最小限のオフセットを確保して一方を他方の上にレンダリングすることです。このようにして、境界線の外観を作成します。
CSS コードのセレクター (.breadcrumb3-item:after) と (.breadcrumb3-item:before) を調べると、2 つの三角形 (1 つは灰色、もう 1 つは情報色) がその上に作成されていることがわかります。最初の CSS ルール (margin-left: 1px; z-index: 2;) と 2 番目の CSS ルール (margin-left: 0px; z-index: 3;) を注意深く調べてください。最初の三角形の上に 2 番目の三角形がわずかにオフセットしてレンダリングされているのがわかります。
疑似要素 (:before、:after) は、これらの三角形を .breadcrumb3-item 要素に付加することだけを目的としています。
ここでは、三角形がどのように作成されるかを示すためだけに、チュートリアルのサンプル コードを提供します。チュートリアルのコードは次のとおりです:
<!DOCTYPE html> <html> <head> <style> .test1 { position: relative; display: table-cell; vertical-align: middle; color: blue; background-color: yellow; height: 40px; line-height: 18px; font-size: 18px; text-align: center; padding-right: 10px; padding-left: 25px; text-decoration: none; } .test1:after { content: ""; display: block; width: 0; height: 0; border-top: 20px solid red; position: absolute; margin-top: -20px; border-bottom: 20px solid red; left: 100%; top: 50%; border-left: 15px solid gray; margin-left: 1px; z-index: 2; } .test2 { position: relative; display: table-cell; vertical-align: middle; color: blue; background-color: yellow; height: 40px; line-height: 18px; font-size: 18px; text-align: center; padding-right: 10px; padding-left: 25px; text-decoration: none; } .test2:after { content: ""; display: block; width: 0; height: 0; border-top: 20px solid transparent; position: absolute; margin-top: -20px; border-bottom: 20px solid transparent; left: 100%; top: 50%; border-left: 15px solid gray; margin-left: 1px; z-index: 2; } .test3 { position: relative; display: table-cell; vertical-align: middle; color: blue; background-color: yellow; height: 40px; line-height: 18px; font-size: 18px; text-align: center; padding-right: 10px; padding-left: 25px; text-decoration: none; } .test3:before { content: ""; display: block; width: 0; height: 0; border-top: 20px solid transparent; position: absolute; margin-top: -20px; border-bottom: 20px solid transparent; left: 100%; top: 50%; border-left: 15px solid blue; margin-left: 0px; z-index: 3; } </style> </head> <body> <div class="test1"> Note how gray arrow is created from red border </div> <br/> <div > Now we will change red to transparent to keep just arrow </div> <br/> <div class="test2"> Now we have only gray arrow, with 1 pixel offset to the right </div> <br/> <div class="test3"> Similarly we have blue arrow, without that offset </div> <br/> <div class="test2 test3"> Now we overlap 2 arrows, to get border effect for the arrow </div> </body> </html>
実行結果は次のとおりです:
優れたプログラマーであれば、コードサンプルと生成された結果を一致させることができるはずです。
アプリケーションに適切なブートストラップ アイコンを見つけるのは複雑に見えるかもしれませんが、実際は非常に簡単です。アイコンはキーワードによってインデックス付けされているため、最初にキーワードを検索し、次に目的のアイコン (この例では無料) を選択し、その ID クラスをアプリにコピーする必要があります。以下はそのプロセスを示すスクリーンショットです。
[1] https://icons.getbootstrap.com/#install
以上がカスタム ブートストラップの読み取りクラム - Ver 2の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。