這個單元要來繼續完成 Dashboard 排版,上一個單元完成了以下的排版方式:
<div class="flex h-screen">
  <div class="hidden w-80 bg-gray-800 sm:flex">
    <p class="text-white">Left</p>
  </div>
  
  <div class="w-full bg-slate-100">
    <h1>Right</h1>
  </div>
</div>
但這樣子的寫法在 RWD 無法起作用,會使得左側的排版消失,這也是 hidden 與 sm:flex 起作用的關係,所以直接宣告一個新的 div 標籤,來讓當寬度小於 sm 時,會出現一個 menu bar:
<div class="flex h-screen">
  <div class="hidden w-80 bg-gray-800 sm:flex">
    <p class="text-white">Left</p>
  </div>
  
  <div class="">
  </div>
  
  <div class="w-full bg-slate-100">
    <h1>Right</h1>
  </div>
</div>
加入 h-full 高度滿版,w-64 寬度 64,bg-gray-800 背景顏色,sm:hidden 當寬度大於 sm 時會消失:
<div class="flex h-screen">
  <div class="hidden w-80 bg-gray-800 sm:flex">
    <p class="text-white">Left</p>
  </div>
  
  <div class="absolute h-full w-64 bg-gray-800 sm:hidden">
  </div>
  
  <div class="w-full bg-slate-100">
    <h1>Right</h1>
  </div>
</div>
在這個 menu 的標籤內,加入兩個按鈕,一個開啟按鈕,另外一個關閉按鈕。
absolute:使用相對位置。right-0:使用相對位置,靠右 0。-mr-10:使用相對位置,對右邊的 margin 間距為 -10,這裡如果加上一個負號,就表示使用相反的間距。cursor-pointer:出現滑鼠的超連結游標。<div class="flex h-screen">
  <div class="hidden w-80 bg-gray-800 sm:flex">
    <p class="text-white">Left</p>
  </div>
  
  <div class="absolute h-full w-64 bg-gray-800 sm:hidden">
    <button class="absolute right-0 -mr-10 mt-16 h-10 w-10 cursor-pointer rounded-br rounded-tr bg-gray-800 text-sm text-white">開啟</button>
    <button class="absolute right-0 -mr-10 mt-16 hidden h-10 w-10 cursor-pointer rounded-br rounded-tr bg-gray-800 text-sm text-white">關閉</button>
  </div>
  
  <div class="w-full bg-slate-100">
    <h1>Right</h1>
  </div>
</div>
在第二個按鈕加入 hidden,表示先隱藏起來。
接下來加入這個 menu 上面的文字,主要是確定 menu 的內容有顯示出來:
<div class="flex h-screen">
  <div class="hidden w-80 bg-gray-800 sm:flex">
    <p class="text-white">Left</p>
  </div>
  
  <div class="absolute h-full w-64 bg-gray-800 sm:hidden">
    <button class="absolute right-0 -mr-10 mt-16 h-10 w-10 cursor-pointer rounded-br rounded-tr bg-gray-800 text-sm text-white">開啟</button>
    <button class="absolute right-0 -mr-10 mt-16 hidden h-10 w-10 cursor-pointer rounded-br rounded-tr bg-gray-800 text-sm text-white">關閉</button>
    
    <div class="px-4 py-6">
      <h1 class="px-2 text-xl text-gray-100">Title</h1>
    </div>
  </div>
  
  <div class="w-full bg-slate-100">
    <h1>Right</h1>
  </div>
</div>
那要如何讓按鈕產生作用?
使用 id 來針對 div 標籤產生名稱,所以加入了這些 id 來辨識 id="mobile-nav" 、  id="openSideBar" 、 id="closeSideBar":
<div class="flex h-screen">
  <div class="hidden w-80 bg-gray-800 sm:flex">
    <p class="text-white">Left</p>
  </div>
  
  <div class="absolute h-full w-64 bg-gray-800 sm:hidden" id="mobile-nav">
    <button id="openSideBar" class="absolute right-0 -mr-10 mt-16 h-10 w-10 cursor-pointer rounded-br rounded-tr bg-gray-800 text-sm text-white">開啟</button>
    <button id="closeSideBar" class="absolute right-0 -mr-10 mt-16 hidden h-10 w-10 cursor-pointer rounded-br rounded-tr bg-gray-800 text-sm text-white">關閉</button>
    
    <div class="px-4 py-6">
      <h1 class="px-2 text-xl text-gray-100">Title</h1>
    </div>
  </div>
  
  <div class="w-full bg-slate-100">
    <h1>Right</h1>
  </div>
</div>
最後加入按鈕的按下事件,onclick 事件,並且分別帶入函式名稱,onclick="sidebarHandler(true)" 表示當按鈕按下呼叫 sidebarHandler 這個函式,並且帶入參數為 true。
onclick="sidebarHandler(false)" 表示當按鈕按下呼叫 sidebarHandler 這個函式,並且帶入參數為 false。
<div class="flex h-screen">
  <div class="hidden w-80 bg-gray-800 sm:flex">
    <p class="text-white">Left</p>
  </div>
  
  <div class="absolute  h-full w-64 bg-gray-800 sm:hidden" id="mobile-nav">
    <button id="openSideBar" class="absolute right-0 -mr-10 mt-16 h-10 w-10 cursor-pointer rounded-br rounded-tr bg-gray-800 text-sm text-white" onclick="sidebarHandler(true)">開啟</button>
    <button id="closeSideBar" class="absolute right-0 -mr-10 mt-16 hidden h-10 w-10 cursor-pointer rounded-br rounded-tr bg-gray-800 text-sm text-white" onclick="sidebarHandler(false)">關閉</button>
    
    <div class="px-4 py-6">
      <h1 class="px-2 text-xl text-gray-100">Title</h1>
    </div>
  </div>
  
  <div class="w-full bg-slate-100">
    <h1>Right</h1>
  </div>
</div>
然後加入以下 javascript 程式來產生作用:
<script>
  var sideBar = document.getElementById("mobile-nav"); //取得 id=mobile-nav 的標籤
  var openSidebar = document.getElementById("openSideBar"); //取得 id=openSideBar 的標籤
  var closeSidebar = document.getElementById("closeSideBar"); //取得 id=closeSideBar 的
  sideBar.style.transform = "translateX(-260px)"; //先讓 sideBar 的x軸位置在 -260
  function sidebarHandler(flag) {
    if (flag) {
      sideBar.style.transform = "translateX(0px)"; //改變 sideBar 的x軸位置在 0
      openSidebar.classList.add("hidden"); //加入 openSidebar 一個 hidden 屬性
      closeSidebar.classList.remove("hidden"); //移除 closeSidebar 的 hidden 屬性
    } else {
      sideBar.style.transform = "translateX(-260px)";
      closeSidebar.classList.add("hidden");
      openSidebar.classList.remove("hidden");
    }
  }
</script>
所以當畫面寬度小於 sm 時,會顯示這樣:

按下開啟按鈕後,會顯示這樣:

這樣就完成這個 Dashboard 的簡單排版了。
tailwindcss - 從零開始學 - Day14 [完]