一個簡單的響應式導航欄

背景

導航對于一個網站重要性,不言而喻。網站上導航一般都置于網站的頂端,每一個導航項都直接詳細的列出來,但如果需要去適配移動端的話這樣簡單粗暴的方法就不大可行了,因為受移動端屏幕寬度所限,在電腦端完美顯示的布局在移動端可能就亂掉了(好吧,這是個人碼的第一篇博客,之前也沒有過寫文章的經驗,對于“亂掉了”這樣口語化的措辭,我也很無奈啊...),所以我們需要為移動端設計專屬的導航欄樣式。大多數的設計是用一個漢堡按鈕(好像是這么叫的?)來代替原來的導航欄,然后通過點擊這個按鈕來顯示或隱藏之。這篇博客就算作在了解了Bootstrap的實現方法原理之后的筆記。

實現原理

直接上代碼吧

  • HTML部分
    <nav>
      <div class="navbar-header">
        <!-- 確保無論是寬屏還是窄屏,navbar-brand都顯示 -->
        <a href="##" class="navbar-brand">XX網</a>
       <!-- .navbar-toggle樣式用于toggle收縮的內容,即nav-collapse collapse樣式所在元素 -->
        <button class="navbar-toggle" type="button">
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
      </div>
      <!-- 屏幕寬度小于768px時,div.navbar-responsive-collapse容器里的內容都會隱藏,顯示icon-bar圖標,當點擊icon-bar圖標時,再展開。屏幕大于768px時,默認顯示。 -->
      <div class="collapse navbar-collapse">
        <ul class="nav navbar-nav">
          <li class="active"><a href="##">網站首頁</a></li>
          <li><a href="##">系列教程</a></li>
          <li><a href="##">名師介紹</a></li>
          <li><a href="##">成功案例</a></li>
          <li><a href="##">關于我們</a></li>
          </ul>
      </div>
    </nav>

這部分幾乎和Bootstrap對應代碼完全一致,導航欄的HTML結構顯而易見:

- nav
  - div.navbar-header
    - a.navbar-brand
    - button.navbar-toggle(漢堡按鈕)
  - div.navbar-collapse(實際導航欄)
    - ul.nav

當視窗寬度大于768px時,直接顯示實際導航欄就好,漢堡按鈕不顯示;小于768px時,顯示漢堡按鈕,然后實際導航欄的顯示則通過點擊漢堡按鈕由JS來實現導航欄的隱藏和顯示,兩種情況下導航欄的布局考驗的則是對CSS的運用,整個實現原理就是這樣。

說到CSS,感覺用好這個東西來寫一個布局清晰樣式精美的網頁很費力(應該是練的太少了,其實自己到現在寫的頁面,一只手都能數的過來,所以還是太急躁了吧。。。),倒不是CSS原理不懂,就是寫出來的東西真沒法看,人說CSS是藝術真不是假的。說這幾句廢話,其實我只是想拖延下貼慘不忍睹的CSS代碼

  • CSS部分
* {
  box-sizing: border-box;
}
body {
  margin: 0;
}
a {
  text-decoration: none;
  color: blue;
}
a:hover {
  text-decoration: underline;
}
ul {
  margin: 0;
  padding: 0;
  list-style-type: none;
  }
nav {
  height: 90px;
  padding: 20px;
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
  align-items: center;
  background-color: lightblue;
}
.navbar-header {
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
  align-items: center;
}     
.navbar-toggle {
  height: 37px;
  display: none;
  border: none;
  background-color: green;
  border-radius: 2px;
  cursor: pointer;
}
.navbar-toggle span {
  display: block;
  width: 2em;
  margin: 3px 0;
  border-bottom: 2px solid #fff;
}
.navbar-brand {
  display: block;
}
.navbar-nav li {
  display: inline-block;
  padding: .5em;
  background-color: lightgreen;
}

@media(max-width: 768px) {
  nav {
    display: block;
  }
  .navbar-header {
    margin-top: 6.5px;
  }  
  .navbar-toggle {
    display: flex;
    flex-flow: column;
    justify-content: center;
    align-items: center;
  }
  .collapse {
    display: none;
  } 
  .navbar-collapse {
    position: relative;
    top: 26.5px;
  }
  .navbar-collapse li {
    width: 100%;
    border-bottom: 1px solid #fff;;
    text-align: center;
  }
}

因為前些日子看了CSS3里flex的屬性,剛好這里就盡量用flex來寫的布局,發現屬性是真好用;當然好用并不一定隨隨便便就能用好,所以為了讓導航欄里的內容的位置在兩種情況下都相對固定,湊了好幾個元素的固定長度值,所以寫得爛我心里是有點逼數的。

JS的部分就簡單了,三條語句,獲取元素A,獲取元素B,在A上綁定事件,事件觸發時操縱B。所以覺得JS比CSS簡單是有理由的吧。

  • JS部分
var toggleBtn = document.querySelector('.navbar-toggle')
var collapsedElm = document.querySelector('.navbar-collapse')
toggleBtn.addEventListener('click', function() {
  collapsedElm.classList.toggle('collapse')

代碼貼完了再貼下效果圖吧,主要看效果,配色什么的忽視就好了

效果圖

  • >786px


    image.png
  • <786px


    image.png

    image.png

好了,都貼完了,就這么點東西么(圖里的那么大片空白肯定是故意占地方的)?是的,就這么點……總結下。

總結

打個比方,CSS好比是一個人的外表,JS好比是能力,外表不好看都不會有表現的機會,所以包裝是有必要而且關鍵的,同理CSS也是很重要的,先把CSS學熟練吧,起碼達到寫出的頁面能勾起別人繼續看下去的興趣的程度。

第一篇出來就好辦了,第二篇、第三篇……都會源源不斷的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,796評論 1 92
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,229評論 4 61
  • 生活中,我們總會碰到各種奇葩的設計。讓我們看了分分鐘想打人,關鍵還有些特別搞笑。下面來看看吧 第一,奇葩電梯樓層,...
    置青春家裝閱讀 273評論 0 0
  • 今日更新的新概念是現狀,什么是現狀通俗化現在的狀態?如果這樣解釋,他對我們的行動沒有任何的處境,可是如果我換另一個...
    忠良162閱讀 156評論 0 1
  • 小冷,江邊無人 北風代替了行走 春天擱淺在沙灘上 我記得仲夏之夜 人聲鼎沸,岸邊漁火 垂釣者握一桿期許 三兩個時辰...
    章小貢閱讀 180評論 0 0