」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 自訂 Bootstrap 讀取導航 - 版本 2

自訂 Bootstrap 讀取導航 - 版本 2

發佈於2024-11-09
瀏覽:763

Custom Breadcrumbs for Bootstrap 5 framework

Abstract: We are presenting code (CSS) for custom Bootstrap 5 breadcrumbs. This is an improved version of the previously published article.

1 The need for better Breadcrumbs

Bootstrap 5 framework is coming with very basic Breadcrumbs implementation. I needed something much better, both visually and more functional. Over time, in my applications, I found it very useful to use Breadcrumbs to enable the user to go back to the higher level, after he drills into details on the particular item/object.

Very important to me was the ability to present TEXT DATA IN TWO ROWS, especially in cases where I am showing some data and ID, like an indication that is the data for some Account, and at the same time providing the Account number.

I was not satisfied with the solutions I saw on the internet, so I developed my own.

While the title says this is a “Bootstrap 5” library, it is completely independent of the Bootstrap CSS and only chosen colors were taken from the Bootstrap CSS to align with the Bootstrap 5 theme. You can use it independently from Bootstrap if you like.

1.1 Changes in this version

This version incorporates suggestions and code from [email protected] to make the code shorter. I do not necessarily agree with all the suggestions, because I think code human readability is more important than shorter code. So, I made my own new version.

Also, this version uses Bootstrap Icons [1] instead of Font Awesome Icons.

2 Final result

Here is what the final result looks like, together with the demo code that generates it. I created breadcrumbs strips in 3 sizes (large, medium, small), with optional usage of icons. Colors can be chosen at will, and the hover effect is present by default, unless explicitly disabled. The hover effect is usually disabled for the last breadcrumb because that is the current selection in effect.

Custom Bootstrap readcrumbs -Ver 2

Here is the HTML code that generates the above rendering. Any web developer should be able to read the HTML code and match it to the above picture to find the variant he/she likes.

If you want to use icons, you can install the free version of Bootstrap Icons [1], and refer to it, similar to how it is done in this example. HTML code for icon usage is a bit complicated because we needed to separate icons and text into 2 separate elements so they could be styled independently.




    
Large size, info case
Large size, info case, with no hover effect on the last button
Large size, Rainbow
Large size, icons usage
Medium size, info case
Medium size, info case, with no hover effect on the last button
Medium size, Rainbow
Medium size, icons usage
Small size, info case
Small size, info case, with no hover effect on the last button
Small size, Rainbow
Small size, icons usage

3 Breadcrumbs CSS

Here is the CSS, no JavaScript is needed. I deliberately used the class name “breadcrumbs3” to avoid name collision with the Bootstrap 5 original class.

/* breadcrumb3.css */
/* by [email protected], 
   using partly code from [email protected]  */

.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);
}

4 How CSS works

Here we will give some hints on how CSS works, although this is pretty simple CSS code and mostly is self-explanatory.

4.1 Trick to make triangles with CSS

A very popular trick on how to make triangles with CSS is used here. The point is to abuse CSS's ability to render borders and make it render a border that is of the shape of a triangle. You do that by creating a block element with zero width and height and colored border on one side that acts as an arrow, and two transparent borders on two adjacent sides.

4.2 Trick to create a border to the CSS triangle

Since the triangle itself is a border, we can not create a border on it. So, the trick to create a border on the triangle/arrow is to create 2 triangles and render one over the other with minimal offset aside. That way we create the border appearance.

You can look into CSS code into selectors (.breadcrumb3-item:after) and (.breadcrumb3-item:before) and you will see that we there create 2 triangles, one gray and one info-color over it. Look carefully into CSS rules for the first (margin-left: 1px; z-index: 2;) and for the second (margin-left: 0px; z-index: 3;). You can see a slight offset and rendering of the second triangle over the first one.

Pseudo-elements (:before, :after) have just the purpose of attaching those triangles to the .breadcrumb3-item element.

4.3 Tutorial Example

Here we will provide a tutorial example code, just to show how triangles are created. Here is a tutorial code:




    
Note how gray arrow is created from red border

Now we will change red to transparent to keep just arrow

Now we have only gray arrow, with 1 pixel offset to the right

Similarly we have blue arrow, without that offset

Now we overlap 2 arrows, to get border effect for the arrow

And here is the result of the execution:

Custom Bootstrap readcrumbs -Ver 2

Any better programmer should be able to match code samples to produced results.

5 Bootstrap Icons usage

It might look complicated to find the proper Bootstrap Icons icon for your application but is really pretty easy. Icons are indexed by keywords, so you need to search for your keyword first, then choose (in this example free) the icon of interest, and then copy its ID- class into your app. Here are screenshots showing that process.

Custom Bootstrap readcrumbs -Ver 2

Custom Bootstrap readcrumbs -Ver 2

6 References

[1] https://icons.getbootstrap.com/#install

版本聲明 本文轉載於:https://dev.to/markpelf/custom-bootstrap-5-breadcrumbs-ver-2-18mm?1如有侵犯,請洽[email protected]刪除
最新教學 更多>
  • 棘手的 Golang 面試問題 - 部分數據競賽
    棘手的 Golang 面試問題 - 部分數據競賽
    Here is another code review interview question for you. This question is more advanced than the previous ones and is targeted toward a more senior aud...
    程式設計 發佈於2024-11-09
  • 如何在 Python 中按列值對散佈圖進行顏色編碼?
    如何在 Python 中按列值對散佈圖進行顏色編碼?
    Python 中按列值對散點圖進行顏色編碼在資料視覺化中,為不同類別分配顏色可以增強清晰度並揭示模式。此功能在 R 的 ggplot2 中很容易使用,但是我們如何使用 pandas 和 matplotlib 在 Python 中實現相同的功能? 更新:Seaborn 增強功能Since 原始答案,S...
    程式設計 發佈於2024-11-09
  • 如何將日期轉換為數位格式以進行繪圖?
    如何將日期轉換為數位格式以進行繪圖?
    將日期轉換為數位格式以進行繪圖當日期以不同格式儲存時,根據日期繪製資料可能具有挑戰性,例如「1991 年1 月2 日。」本文提供了一種將日期轉換為可以輕鬆在x 軸上繪製的數位格式的解決方案。 如問題所述,使用 strftime('%Y%m%d') 轉換日期僅靠這一點可能還不夠。若要解...
    程式設計 發佈於2024-11-09
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-09
  • 在 JavaScript 中快取數組長度比直接長度存取更快嗎?
    在 JavaScript 中快取數組長度比直接長度存取更快嗎?
    優化 JavaScript 中的陣列迭代:快取長度與直接長度存取循環數組是 JavaScript 中的基本操作。但最快的方法是什麼?傳統觀點認為,快取數組的長度可以透過避免重複計算來提高效能。然而,有些人認為現代編譯器優化了直接長度存取。 爭論:快取與直接存取傳統上,建議的方法是快取陣列長度: f...
    程式設計 發佈於2024-11-09
  • 如何使用純 JavaScript 切換元素類別?
    如何使用純 JavaScript 切換元素類別?
    使用純 JavaScript 切換元素類別:綜合指南簡介在 JavaScript 中,控制元素類別對於動態 Web 開發至關重要。一項常見任務是切換類別以更改元素的外觀或功能。雖然 jQuery 讓這項任務變得簡單,但了解如何使用純 JavaScript 來完成它是至關重要的。 jQuery 解決方...
    程式設計 發佈於2024-11-09
  • 如何使用 Base64 對 OpenSearch 外掛的映像進行編碼?
    如何使用 Base64 對 OpenSearch 外掛的映像進行編碼?
    為 OpenSearch 插件編碼映像為 Firefox 或 IE 等瀏覽器開發 OpenSearch 插件時,base64 編碼對於表示映像至關重要。具體實現方法如下:方法一:線上編碼訪問線上文件編碼網站,例如[Base64 Encode](https:// /www. base64encode....
    程式設計 發佈於2024-11-09
  • 使用 Java 的 JarOutputStream 建立 JAR 檔案時如何避免意外問題?
    使用 Java 的 JarOutputStream 建立 JAR 檔案時如何避免意外問題?
    對JAR 檔案所建立的JarOutputStream 進行故障排除使用java.util.jar.JarOutputStream 以程式設計方式建立JAR 檔案看起來很簡單,但某些細微差別可能會導致意外問題。本文探討了這些未記錄的怪癖,並提供了用於建立有效 JAR 檔案的全面解決方案。 了解怪癖使用...
    程式設計 發佈於2024-11-09
  • 如何在不中斷內容流的情況下將 Div 絕對放置在右側:解決 Float:right 與 Position:absolute 的困境
    如何在不中斷內容流的情況下將 Div 絕對放置在右側:解決 Float:right 與 Position:absolute 的困境
    右浮動和絕對定位困境已解決在您追求一個div 能夠無縫地將其自身與其父級右側對齊,同時避免干擾其他內容,您偶然發現了一個障礙: float:right 和float:right的衝突行為position:absolute.Float 和Absolute 的衝突性質Float:right 透過將其他元...
    程式設計 發佈於2024-11-09
  • 如何在不修改 http.ResponseWriter 的情況下記錄 HTTP 回應?
    如何在不修改 http.ResponseWriter 的情況下記錄 HTTP 回應?
    在http.HandleFunc 中記錄HTTP 回應本文討論了一種獲取HTTP 回應以進行日誌記錄的替代方法,而無需訴諸偽造請求或修改http.ResponseWriter。我們引入了中間件連結的概念,提供了函數式實作。 中介軟體連結中介軟體連結涉及將控制權傳遞給處理程序鏈,這些處理程序在主請求執...
    程式設計 發佈於2024-11-09
  • 如何處理跨平台 Go 庫中特定於作業系統的程式碼?
    如何處理跨平台 Go 庫中特定於作業系統的程式碼?
    如何利用特定於作業系統的程式碼的建構約束開發依賴於特定於作業系統的依賴項的跨平台Go 函式庫時,有必要區分建構不同作業系統的流程。解決方法如下:例如,讓我們考慮建立一個使用 Windows 的「encoding/osheb」套件和 Linux 的「encoding/olson」套件的函式庫。為了有效...
    程式設計 發佈於2024-11-09
  • 如何在 PHP 中有效使用回呼?
    如何在 PHP 中有效使用回呼?
    在 PHP 中實作回調PHP 中的術語「回呼」包括作為函數指標操作的字串和陣列。在PHP 4 中,出現了以下語法:$cb1 = 'someGlobalFunction';$cb2 = ['ClassName', 'someStaticMethod'];...
    程式設計 發佈於2024-11-09
  • 如何檢查 Chrome 和 Firefox 中的元素?
    如何檢查 Chrome 和 Firefox 中的元素?
    您有没有想过一个制作精美的网站背后有哪些元素?了解如何检查 Chrome 和 Firefox 中的元素。  每个视觉上令人惊叹的网页都有复杂的 HTML、CSS 和 JavaScript 代码在后端运行。使用名为 Inspect Element 的便捷开发工具,您可以在流行的网络浏览器上检查 HTM...
    程式設計 發佈於2024-11-09
  • 為什麼在 C++ 中設定靜態欄位時出現「無法解析的外部符號」錯誤?
    為什麼在 C++ 中設定靜態欄位時出現「無法解析的外部符號」錯誤?
    靜態物件欄位的無法解析的外部符號本文調查了嘗試設定時遇到的錯誤訊息「error LNK2001:無法解析的外部符號”主方法中的類別中的靜態字段。 在提供的程式碼片段中,類別中靜態欄位「a」的宣告「B」出現在類別定義本身內。但是,根據 C 標準,此類聲明不被視為定義。對於靜態資料成員,正確的定義必須出...
    程式設計 發佈於2024-11-09
  • 如何在 PHP 中高效去除小數中的尾隨零​​?
    如何在 PHP 中高效去除小數中的尾隨零​​?
    在 PHP 中刪除小數中的尾隨零​​在 PHP 中,從小數中刪除尾隨零是一項常見任務。考慮以下場景:您有一組數字,例如 125.00、966.70 和 844.011,您希望顯示這些數字,但不包含不必要的零數字。 快速且優化的解決方案為了有效地完成此任務,您可以採用簡單而有效的解決方案,將數字添加到...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3