---
# System prepended metadata

title: 12. 後台管理 - 功能性為導向的介面規劃
tags: [Bootstrap5網頁切版整合術]

---

---
tags: Bootstrap5網頁切版整合術
---
# 12. 後台管理 - 功能性為導向的介面規劃

## 後台管理章節說明
後台管理的功能較多，主要會由內部人員或特定人員來操作，所以不一定要符合rwd
![](https://i.imgur.com/lrlH0yv.png)

## 結構規劃
1. 桌機版左側選單為開啟，行動版為收合，右側上`<a>`標籤按鈕，可展開收合左側的sidebar選單

2. 左側選單縮小視窗時或空間不足時，選單內容會加上垂直卷軸滾動

3. 右側.main依瀏覽器剩餘寬度


### 建立結構
1. 新增資料夾components>_sidebar.scss，在all.scss匯入
2. 左側定義變數`$sidebar-width: 280px;`
3. 右側.main的寬度用calc來計算，
這裡變數會被視為字串，所以要再加上`#{}`才能運算    
4. 右側上方按鈕: `<a>`設定.d-inline-block就不會占滿整個空間 ; 在bs icon搜尋expand，加入icon

```html
<div class="d-flex">
    <aside class="sidebar vh-100 border-end">
    </aside>
    <main class="main">
        <div class="bg-white border-bottom w-100">
            <a href="#" class="py-3 px-4 d-inline-block border-end">
                <i class="bi bi-arrows-angle-expand"></i>
            </a>
        </div>
    </main>
</div>
``` 

```css
$sidebar-width: 280px;

.sidebar{
    width: $sidebar-width;
}

.main{
    width: calc(100vw - #{$sidebar-width});
}
```




## 可收合側欄選單sidebar <small>:star: :star: :star:</small>
![](https://i.imgur.com/Julln2i.png)


**_sidebar.scss:**

1. 先前套用up的中斷點都是使用class方式套用，這裡用scss方式，文件>排版>斷點，找到最小寬度`media-breakpoint-up(lg)`，lg以上尺寸才會套用。
![](https://i.imgur.com/NVv3CZ7.png)

2. 複製語法media-breakpoint-up(lg){}，將剛才建立的結構，內容移到裡面


3. 行動版(預設): 
(1)sidebar寬為 sidebar-width;
margin-left: -$sidebar-width; 用負值將選單位移到畫面外，位移速度建議快一點; 
(2)main為滿寬100%

4. 桌機版: sidebar寬為$sidebar-width，因受到行動版margin-left負值影響，需要再將sidebar移回來，所以要設定margin-left:0;


```_sidebar.scss
$sidebar-width: 280px;

//行動版(預設) 
.sidebar{
    width: $sidebar-width;
    margin-left: -$sidebar-width;    
    transition: margin-left .25s;
}
.main{
    width: 100%;
}

//桌機版(up) 
@include media-breakpoint-up(lg) {    
    .sidebar{
            margin-left: 0;
            width: $sidebar-width;
        }    
    .main {
          width: calc(100vw - #{$sidebar-width});
     }
}
```

<small>這裡實作時一直出現編譯錯誤"找不到這個mixin"，原來是 @import順序 出錯了，自訂的要放在後面
    
```css
    @import "./node_modules/bootstrap/scss/functions";
    @import "./node_modules/bootstrap/scss/bootstrap";
    @import "./helpers/variables";
    @import "./components/sidebar";
```

</small>


### 選單收合: 
![](https://i.imgur.com/fBr8Ztx.jpg)

<small>-在這裡先把樣式寫好，下一節會用js，點擊按鈕後在body加入或移除.sidebar-toggled 
-測試的時候可以先用開發者工具，手動在body加上.sidebar-toggled
</small>


1. 新增class名稱為.sidebar-toggled 作為展開sidebar用

2. 行動版 將選單移回來(按下按鈕後)
    ```css
    .sidebar-toggled{
        .sidebar{
            margin-left:0;        
        }
    }
    ```

3. 桌機版 選單往外移(按下按鈕後)

    ```css
    .sidebar-toggled {
         .sidebar {
              margin-left: -$sidebar-width;
         }
         .main{
              width: 100%;   
              margin-left: 0;   
          }
        }
    ```

### JS效果 點擊按鈕展開收合選單
1. 在`<a>`加上id="toggle-btn"，js選取用
2. 新增javascripts資料夾，新增all.js檔，再到html body結尾之前匯入
3. 點擊`<a>`標籤切換樣式.sidebar-toggled
![](https://i.imgur.com/artarD0.png)
<small>(這裡不懂js沒關係先略過)</small>

## 側欄選單內容
![](https://i.imgur.com/Tav5Ufc.png)

sidebar: 縮小視窗時或空間不足時，選單會加上垂直卷軸滾動
1. 先將sidebar選單加上.d-flex.flex-column方向垂直
2. 內層分為後台名稱、選單、登出按鈕三個結構，
登出按鈕加上.mt-auto把按鈕推到最下面，
中間選單內容加上.overflow-auto 

3. 在_sidebar.scss新增.sidebar-link、.sidebar-link.active的設定
首頁按鈕加上.sidebar-link.active
登出按鈕加上.sidebar-link
![](https://i.imgur.com/boxEUEE.png)

4. 選單
![](https://i.imgur.com/ZcOVl2v.png)


5. 選單下拉內容加上.collapse、加上id="menu-order"
6. 到文件>摺疊>在要折疊的外層`<a>`標籤加上.data-bs-toggle="collapse" ，href="#menu-order"連結到要收合的內容
![](https://i.imgur.com/0wEQdnX.png)


    ![](https://i.imgur.com/57gPRO3.png)


## 版型整理、固定左側選單、固定上方導覽列
1. 版型整理:
將index.html改名為layout.html，這基本的版型其他頁面也會用到，所以拉出layout來管理共用的版型 (後端會使用template language、前端用vue或react)

2. 固定左側選單:
.sidebar寫position: fixed;  top:0; 固定在左側 
.main要再位移回來    
![](https://i.imgur.com/lkB3GM0.png)

    手機版:展開sidebar要加入margin-left:$sidebar-width;
按鈕就不會被擋住
![](https://i.imgur.com/O21k51N.png)

3. 固定上方導覽列:
在導覽列加上.sticky-top，滾動內容時，選單會在內容的上方
![](https://i.imgur.com/pwPEKWA.png)


## 卡片區塊結構+動態圖表範例程式碼
![](https://i.imgur.com/LZDK2p3.png)

1. 將layout.html另存為home.html

2. 到_variables調整圓角
* bordre-radius 會調整到所有的圓角，這裡不需要調整全部
* 可新增變數或調整bordre-radius-lg:0.75rem;//.3rem!default

* 卡片圓角也要修改 $card-border-radius: $border-radius-lg;
![](https://i.imgur.com/XPVQtRI.png)

    <small>官方變數檔裡面有新增xl、2xl、pill</small>

3. 建立三欄卡片.row>col*3>.card>.card-body
![](https://i.imgur.com/qIgFEYk.png)

4. 建立二欄卡片 左col-4 右col
![](https://i.imgur.com/MckKIJ6.png)

* 左邊已設定col-4所以右邊可以寫col就好
* `<canvas>`跟`<img>`很像，要再加入.img-fluid，才不會拉動後掉到下一排
* 把canvas的程式碼貼在main裡面
* 將兩個卡片設定等高h-100


![](https://i.imgur.com/t0RRIjD.png)


## 表格運用
![](https://i.imgur.com/nXQ2VSP.png)
* 這裡使用.card搭配.card-header、.card-body'、card-footer
1.  card-header:
input搭配.form-control，再用.shadow-none.border-0 把hover:foucs的陰影框線拿掉
![](https://i.imgur.com/Hjm0voh.png)

2. card-body:
* 將表格加入響應式.table-responsive.table-hover
* .thead內距加大，.py-3加在訂單編號就可以，再到tr加上.align-middle就可以全部垂直對齊
![](https://i.imgur.com/3NG1Kfd.png)

    ![](https://i.imgur.com/oeycikj.png)
* 在tbody加上.text-nowrap避免文字換行，行動版表格可左右滾動

    ![](https://i.imgur.com/737sHsI.png) 

    ![](https://i.imgur.com/fSiAvCl.png)

3. card-footer:
* 到元件>分頁，複製程式碼貼進來
    ![](https://i.imgur.com/mv3ay74.png)



## 訂單管理介面



## 傳遞內容至 Modal 內


## 單一產品頁面製作


## Sticky 與 scroll spy 的混合運用


## 作業製作