CSS | Bootstrap5 Class Tips (Intranet Low Maintenance Website / 簡易維護網頁範本)

2022-08-01

說明活用 Bootstrap 5 Components 以及 Utilities 創造網頁設計妙用,減少手工 CSS 的負擔 🙂

JavaScript logo

說明

Overlapping

<div class="position-relative " style="margin: 0px -12px;width: calc(100% + 24px);">
    <div class="overflow-hidden" style="max-height:300px;">
        <img src="./assets/tech-2.jpg" class="w-100 opacity-75">
    </div>
    <div class="department-heading text-white d-none d-lg-block">sdwh.dev</div>
</div>

<div class="container position-relative bg-light py-1 rounded shadow-lg" 
    style="top:-50px; width: 95%;max-width: 1920px !important;">
    <h2 class="mt-3 fw-bolder mb-3">最新消息</h2>

    <div class="bg-light p-2 mb-4 rounded-2 border border-danger">
        <h3 class="" style="font-size:20px">部落格最新文章</h3>
        <p class="">
            App_Offline.htm Template 臨時維護網頁範本發佈囉!
        </p>
        <div class="text-end">發佈日期:2022年8月6日 13:05</div>
    </div>
</div>    

Pattern Background Section

.special-section::before{
    /* https://doodad.dev/pattern-generator */
    background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='100%25' width='100%25'%3E%3Cdefs%3E%3Cpattern id='doodad' width='30' height='30' viewBox='0 0 40 40' patternUnits='userSpaceOnUse' patternTransform=''%3E%3Crect width='100%25' height='100%25' fill='rgba(198, 246, 213,1)'/%3E%3Cpath d='M0 20h6v6h-6zM40 20h6v6h-6zM40 20h6v6h-6z' fill='rgba(246, 224, 94,1)'/%3E%3Cpath d='M20 20h6v6h-6zM60 20h6v6h-6z' fill='rgba(104, 211, 145,1)'/%3E%3C/pattern%3E%3C/defs%3E%3Crect fill='url(%23doodad)' height='200%25' width='200%25'/%3E%3C/svg%3E ");
    opacity: 0.5;
    background-repeat: no-repeat;
    background-size: cover;
    width: 100%;
    height: 100%;
    content: "";
    position: absolute;
    top: 0px;
    left: 0px;
}

.special-section{
    position: relative;
    margin: 0px -12px;
    width: calc(100% + 24px);
}

Flex Autofill

Flex 在排版上十分方便,十分容易做到置中的效果。但如果想要向左對齊,又保有適當的間距則會有困難。

而如果是在三個 Column 的情況下,可以藉由 CSS Pseudo Selector 解決這個問題。

.flex-autofill-3::after {
    content: "";
    flex: 0 0 30%;
}

.little-banner{
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 1rem !important;
}

.little-banner>div{
    width: 30%;
    max-height: 140px;
    overflow: hidden;
    border-radius: 0.25rem !important;
}
<div class="flex-autofill-3 little-banner">
    <div>
        <img src="./assets/tech-1.jpg" class="w-100">
    </div>
    <div>
        <img src="./assets/tech-2.jpg" class="w-100">
    </div>
    <div>
        <img src="./assets/tech-3.jpg" class="w-100">
    </div>
    <div>
        <img src="./assets/tech-4.jpg" class="w-100">
    </div>
    <div>
        <img src="./assets/tech-5.jpg" class="w-100">
    </div>
</div>

Icon Hover Effect

.zoom-effect:hover{
    transform: scale(1.2);
    transition: all .5s;
}
<div class="d-flex flex-wrap justify-content-between">
    <div class="card text-center mb-3" style="width: 30%">
        <div class="text-center pt-3">
            <img src="./assets/tablericons-lock.svg" class="zoom-effect img-fluid w-50">
        </div>
        <div class="card-body">
            <a href="#faq" class="btn btn-outline-secondary">密碼學</a>
        </div>
    </div>
    <div class="card text-center mb-3" style="width: 30%">
        <div class="text-center pt-3">
            <a href="https://tablericons.com/" target="_blank">
                <img src="./assets/tablericons-computer.svg" class="zoom-effect img-fluid w-50">
            </a>
        </div>
        <div class="card-body">
            <a href="#faq" class="btn btn-outline-secondary">計算機組織</a>
        </div>
    </div>
    <div class="card text-center mb-3" style="width: 30%">
        <div class="text-center pt-3">
            <img src="./assets/tablericons-apps.svg" class="zoom-effect img-fluid w-50">
        </div>
        <div class="card-body">
            <a href="#faq" class="btn btn-outline-secondary">計算機程式設計</a>
        </div>
    </div>
    <div class="card text-center mb-3" style="width: 30%">
        <div class="text-center pt-3">
            <img src="./assets/tablericons-mouse.svg" class="zoom-effect img-fluid w-50">
        </div>
        <div class="card-body">
            <a href="#faq" class="btn btn-outline-secondary">人機介面</a>
        </div>
    </div>
    <div class="card text-center mb-3" style="width: 30%">
        <div class="text-center pt-3">
            <img src="./assets/tablericons-wifi.svg" class="zoom-effect img-fluid w-50">
        </div>
        <div class="card-body">
            <a href="#faq" class="btn btn-outline-secondary">網際網路概論</a>
        </div>
    </div>
    <div class="card text-center mb-3" style="width: 30%">
        <div class="text-center pt-3">
            <img src="./assets/tablericons-doc.svg" class="zoom-effect img-fluid w-50">
        </div>
        <div class="card-body">
            <a href="#faq" class="btn btn-outline-secondary">離散數學</a>
        </div>
    </div>
</div>

Basic Forms

<form class="border p-3 shadow-sm" method="get">
  <div class="mb-3">
    <label for="exampleText1" class="form-label">系統名稱</label>
    <input type="text" class="form-control" id="exampleText1" name="text1">
  </div>

  <div class="mb-3 form-check">
    <input type="checkbox" class="form-check-input" id="exampleCheck1">
    <label class="form-check-label" for="exampleCheck1">新開發系統</label>
  </div>

  <div class="row">
    <div class="mb-3 col-6">
      <label class="form-label" for="exampleSelect1">資通系統分級</label>
      <select class="form-select" aria-label="Default select example" id="exampleSelect1" name="select1">
        <option selected disabled>分級</option>
        <option value="1"></option>
        <option value="2"></option>
        <option value="3"></option>
      </select>
    </div>

    <div class="mb-3 col-6">
      <div>開發方式</div>
      <div class="d-flex align-items-center h-75">
        <div class="form-check form-check-inline">
          <input class="form-check-input" type="radio" name="radioOptions1" id="inlineRadio1" value="option1">
          <label class="form-check-label" for="inlineRadio1">委外開發</label>
        </div>
        <div class="form-check form-check-inline">
          <input class="form-check-input" type="radio" name="radioOptions1" id="inlineRadio2" value="option2">
          <label class="form-check-label" for="inlineRadio2">自行開發</label>
        </div>
      </div>
    </div>
  </div>

  <div class="mb-3">
    <label for="formFile" class="form-label">安全檢測佐證資料</label>
    <input class="form-control" type="file" id="formFile">
  </div>

  <button type="submit" class="btn btn-primary">儲存</button>
</form>
<div class="container mb-3">
  <div id="carouselExampleCaptions" class="carousel slide" data-bs-ride="carousel">
    <div class="carousel-indicators">
      <button type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide-to="0" class="active"
        aria-current="true" aria-label="Slide 1"></button>
      <button type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide-to="1"
        aria-label="Slide 2"></button>
      <button type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide-to="2"
        aria-label="Slide 3"></button>
    </div>
    <div class="carousel-inner">
      <div class="carousel-item active" data-bs-interval="2000">
        <div class="overflow-hidden" style="max-height:300px;">
          <img src="./assets/tech-1.jpg" class="d-block w-100">
        </div>
        <div class="carousel-caption d-none d-md-block">
          <h5>創意寫作</h5>
        </div>
      </div>
      <div class="carousel-item" data-bs-interval="2000">
        <div class="overflow-hidden" style="max-height:300px;">
          <img src="./assets/tech-2.jpg" class="d-block w-100">
        </div>
        <div class="carousel-caption d-none d-md-block">
          <h5>資訊系統設計</h5>
        </div>
      </div>
      <div class="carousel-item" data-bs-interval="2000">
        <div class="overflow-hidden" style="max-height:300px;">
          <img src="./assets/tech-3.jpg" class="d-block w-100">
        </div>
        <div class="carousel-caption d-none d-md-block">
          <h5>網路應用</h5>
        </div>
      </div>
    </div>
    <button class="carousel-control-prev" type="button" 
      data-bs-target="#carouselExampleCaptions" data-bs-slide="prev">
      <span class="carousel-control-prev-icon" aria-hidden="true"></span>
      <span class="visually-hidden">Previous</span>
    </button>
    <button class="carousel-control-next" type="button" 
      data-bs-target="#carouselExampleCaptions" data-bs-slide="next">
      <span class="carousel-control-next-icon" aria-hidden="true"></span>
      <span class="visually-hidden">Next</span>
    </button>
  </div>
</div>

<footer class="bg-dark">
    <div class="d-none d-sm-flex justify-content-between w-75 mx-auto py-3">
        <div>
            <div class="fw-bolder fatfooter-heading"><a href="#apps">系統開發</a></div>
            <ul class="text-white footer-ul">
                <li>ASP.NET</li>
                <li>Python</li>
                <li>Node.js</li>
            </ul>
        </div>
        <div>
            <div class="fw-bolder fatfooter-heading"><a href="#server">伺服器管理</a></div>
            <ul class="text-white footer-ul">
                <li>Windows Server</li>
                <li>SQL Server</li>
                <li>IIS</li>
            </ul>
        </div>
        <div>
            <div class="fw-bolder fatfooter-heading"><a href="#cyber">資安防護</a></div>
            <ul class="text-white footer-ul">
                <li>PowerShell</li>
                <li>Network</li>
                <li>OS</li>
            </ul>
        </div>
    </div>
    <div class="d-flex justify-content-end">
        <div class="text-start me-md-3 mb-3 mt-3 mt-sm-0">
            <div class="text-white" id="update-datetime">📅 更新日期:2022-08-06</div>
            <div class="text-white">🏢 臺南市東區中華東路三段357巷</div>
            <div class="text-white">📧 [email protected]</div>
        </div>
    </div>
</footer>

JS

route.js

function UrlRouter(){
    let hash = window.location.hash;
    switch (hash) {
        case '':
        case '#index':
            $('#post-content').load('default.html')
            break;
        default:
            $('#post-content').load(`${hash.replace('#', '')}.html`)
            break;
    }
}

$(window).on('hashchange', function(e){
    setTimeout(function () {
        window.scrollTo({top: 0, behavior: 'instant'});
    }, 100);
    UrlRouter();
});

$(document).ready(function(){
    UrlRouter();
});