5.1從0實(shí)現(xiàn)響應(yīng)式導(dǎo)航欄

本節(jié)將分享如何從0實(shí)現(xiàn)一個(gè)響應(yīng)式導(dǎo)航欄。

響應(yīng)式導(dǎo)航欄是靜態(tài)網(wǎng)站特別常見(jiàn)的需求,多數(shù)網(wǎng)站都是基于Twitter推出的Bootstrap硝皂。所以掌握從0開(kāi)發(fā)一個(gè)響應(yīng)式導(dǎo)航欄的前端很少拉盾,本節(jié)將帶大家一探究竟。

什么是響應(yīng)式導(dǎo)航欄

要想 知道什么是響應(yīng)式導(dǎo)航欄帖池,我們需要從兩個(gè)方面去理解:

  • 首先,是導(dǎo)航欄的定義:指位于頁(yè)面頂部或者側(cè)邊區(qū)域的一排水平導(dǎo)航按鈕吭净,起著鏈接站點(diǎn)或者軟件內(nèi)的各個(gè)頁(yè)面的作用睡汹;
  • 其次,是響應(yīng)式的定義:響應(yīng)式確切稱為響應(yīng)式布局寂殉,是Ethan Marcotte在2010年5月份提出的一個(gè)概念囚巴,簡(jiǎn)而言之,就是一個(gè)網(wǎng)站能夠兼容多個(gè)終端——而不是為每個(gè)終端做一個(gè)特定的版本,它是為解決移動(dòng)互聯(lián)網(wǎng)瀏覽而誕生的彤叉。

結(jié)合響應(yīng)式布局和導(dǎo)航欄的概念庶柿,我們就知道我們要實(shí)現(xiàn)的是一組兼容不同終端的導(dǎo)航按鈕。

布局的常識(shí)

網(wǎng)頁(yè)制作最重要的就是網(wǎng)頁(yè)布局秽浇,先布局浮庐,后細(xì)節(jié),只有在選擇了合適的網(wǎng)站布局以后柬焕,才可以順利的進(jìn)行接下來(lái)的工作审残。

好的網(wǎng)頁(yè)布局能夠讓前端開(kāi)發(fā)人員更好地把握網(wǎng)頁(yè)的整體結(jié)構(gòu),提高代碼的書寫效率斑举,復(fù)用性搅轿,和后期維護(hù)。

常見(jiàn)的布局有:

  • 靜態(tài)布局:即最開(kāi)始的網(wǎng)頁(yè)設(shè)計(jì)富玷,所有的網(wǎng)頁(yè)尺寸都用px作為單位璧坟;
  • 流式布局:使用%百分比定義寬度,頁(yè)面元素寬度按照屏幕分辨率進(jìn)行適配調(diào)整赎懦,元素大小會(huì)變化但整體布局不便雀鹃,需要配合max-width或min-width等屬性控制尺寸流動(dòng)范圍,如柵格系統(tǒng)励两;
  • 自適應(yīng)布局:分別為不同的屏幕分辨率定義布局黎茎,即創(chuàng)建多個(gè)靜態(tài)布局,每個(gè)靜態(tài)布局對(duì)應(yīng)一個(gè)范圍伐蒋;
  • 響應(yīng)式布局:結(jié)合流水布局和自適應(yīng)布局,搭配媒體查詢技術(shù)的使用迁酸,元素位置和大小都會(huì)變先鱼,適應(yīng)pc和移動(dòng)端,和自適應(yīng)一樣奸鬓,都需要檢測(cè)設(shè)備焙畔,根據(jù)不同設(shè)備展示不同的樣式;
  • 彈性布局:包裹文字各元素的尺寸采用em/rem(為順應(yīng)不同網(wǎng)頁(yè)字體大小展現(xiàn)而產(chǎn)生的串远,em相對(duì)其父元素宏多,rem始終相對(duì)頁(yè)面根元素)做單位,而頁(yè)面主要?jiǎng)澐謪^(qū)域的尺寸仍使用百分?jǐn)?shù)或px澡罚,瀏覽器默認(rèn)字體16px伸但,所以1 em = 16px,為了計(jì)算方便通常將頁(yè)面根元素設(shè)置為62.5%留搔,1 rem = 10px更胖。

布局選擇建議:

  • 如果只做PC端,靜態(tài)布局是最好的選擇;
  • 如果只做移動(dòng)端却妨,且高度和元素間距不高饵逐,彈性布局是最好的選擇;
  • 如果兼容PC和移動(dòng)端彪标,響應(yīng)式布局是最好的選擇倍权。

顯然,我們要做的響應(yīng)式導(dǎo)航欄就是要兼容多端捞烟,所以需要采用響應(yīng)式布局薄声。

如何實(shí)現(xiàn)響應(yīng)式導(dǎo)航欄

  • 設(shè)置 Meta 標(biāo)簽:大多數(shù)移動(dòng)瀏覽器將HTML頁(yè)面放大為寬的視圖(viewport)以符合屏幕分辨率。你可以使用視圖的meta標(biāo)簽來(lái)進(jìn)行重置坷襟。下面的視圖標(biāo)簽告訴瀏覽器奸柬,使用設(shè)備的寬度作為視圖寬度并禁止初始的縮放。在<head>標(biāo)簽里加入這個(gè)meta標(biāo)簽婴程。
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

user-scalable = no 屬性能夠解決 iPad 切換橫屏之后觸摸才能回到具體尺寸的問(wèn)題廓奕。

  • 首先,設(shè)定頁(yè)面的大體布局档叔,在index.html文件中加入如下內(nèi)容:
    <header>
        <nav>
            <div class="navbar-header">
              <a href="#" class="navbar-logo">Logo</a>
              <button class="navbar-toggle" type="button">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
              </button>
            </div>
            <div class="collapse navbar-collapse">
              <ul class="nav navbar-nav" id="navList">
                <li><a href="#" class="active">首頁(yè)</a></li>
                <li><a href="#">產(chǎn)品服務(wù)</a></li>
                <li><a href="#">聯(lián)系我們</a></li>
                <li><a href="#">關(guān)于我們</a></li>
               </ul>
            </div>
          </nav>
    </header>
    <section class="content-wrap">
      <!-- 網(wǎng)站內(nèi)容 -->
      <img src="skills.jpg" alt="前端技能圖">
    </section>
    <footer class="foot-wrap">
        <p>?2018 慕課網(wǎng)學(xué)習(xí) </p>
        <p>京ICP備180043275號(hào)-2</p>
    </footer>

其中桌粉,header標(biāo)簽包含的是導(dǎo)航欄的部分,section標(biāo)簽包含的是前端技能圖的部分衙四,footer標(biāo)簽包含的是頁(yè)腳部分铃肯。

然后在index.css中,添加如下的css樣式:

* {
  box-sizing: border-box;
}
body {
  margin: 0;
}
button:focus {
  outline: none;
}
a {
  text-decoration: none;
  color: white;
}

ul {
  margin: 0;
  padding: 0;
  list-style-type: none;
}
nav {
  height: 60px;
  padding: 20px;
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
  align-items: center;
  background-color:#171717;
}
.navbar-header {
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
  align-items: center;
}     
.navbar-toggle {
  height: 37px;
  width: 30%;
  text-align: center;
  display: none;
  border: none;
  background-color: #171717;
}
.navbar-toggle span {
  display: block;
  width: 30px;
  margin: 3px 0;
  border-bottom: 2px solid #fff;
}
.navbar-logo {
  display: block;
}
.navbar-nav li {
  display: inline-block;
  padding: 0.5em;
}

.navbar-nav li  a{
  border-radius:3px;
  padding:4px 8px;
}

.navbar-nav li a:hover{
  color:#171717;
  background-color:#fff;
  box-shadow:1px 1px 1px 0 #fff
}

.active {
  color:#171717;
  background-color:#fff;
  box-shadow:1px 1px 1px 0 #fff
}
.content-wrap {
  height: calc(100% - 196px);
  width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}

.content-wrap img{
  height: 100%;
  width: auto;
}

.foot-wrap {
  width: 100%;
  height: 120px;
  line-height: 50px;
  text-align: center;
  background-color: #695f5f;
}

@media(max-width: 768px) {
  nav {
    display: block;
    padding: 0px;
  }
  .navbar-header {
    padding: 10px 0px 10px 10px;
  }     
  .navbar-toggle {
    display: flex;
    flex-flow: column;
    justify-content: center;
    align-items: center;
    width: 30%;
    text-align: center;
  }
  .collapse {
    display: none;
  } 
  .navbar-collapse {
    height: 100%;
    width:30%;
    right: 0;
    position:fixed;
    background-color:#171717;
  }
  .navbar-collapse li {
    width: 100%;
    border-bottom: 1px solid #fff;;
    text-align: center;
  }
}

最后传蹈,在在index.html文件中的body標(biāo)簽的底部添加js控制的相關(guān)代碼:

 <script>
      var toggleButton = document.querySelector('.navbar-toggle');
      var collapsedElm = document.querySelector('.navbar-collapse');
      toggleButton.addEventListener('click', function() {
        collapsedElm.classList.toggle('collapse');
      });
    var navList = document.getElementById('navList');
    var oList=navList.getElementsByTagName("a");
    for(var i=0;i<oList.length;i++){
        oList[i].onclick=function(){
            for(var j=0;j<oList.length;j++){
              oList[j].className="";
            }
            this.className+="active";
        }
    }
 </script>

最終效果

  • pc 端效果:


    Screen Shot 2019-01-06 at 1.47.02 PM.png
  • h5移動(dòng)端效果:


    Screen Shot 2019-01-06 at 1.47.28 PM.png

    點(diǎn)擊折疊導(dǎo)航欄后:


    Screen Shot 2019-01-06 at 1.48.53 PM.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末押逼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惦界,更是在濱河造成了極大的恐慌挑格,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沾歪,死亡現(xiàn)場(chǎng)離奇詭異漂彤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)灾搏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門挫望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人狂窑,你說(shuō)我怎么就攤上這事媳板。” “怎么了泉哈?”我有些...
    開(kāi)封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵拷肌,是天一觀的道長(zhǎng)到旦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)巨缘,這世上最難降的妖魔是什么添忘? 我笑而不...
    開(kāi)封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮若锁,結(jié)果婚禮上搁骑,老公的妹妹穿的比我還像新娘。我一直安慰自己又固,他們只是感情好仲器,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仰冠,像睡著了一般乏冀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洋只,一...
    開(kāi)封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天辆沦,我揣著相機(jī)與錄音,去河邊找鬼识虚。 笑死肢扯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的担锤。 我是一名探鬼主播蔚晨,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肛循!你這毒婦竟也來(lái)了铭腕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤多糠,失蹤者是張志新(化名)和其女友劉穎累舷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體熬丧,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笋粟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年怀挠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了析蝴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绿淋,死狀恐怖闷畸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吞滞,我是刑警寧澤佑菩,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布盾沫,位于F島的核電站,受9級(jí)特大地震影響殿漠,放射性物質(zhì)發(fā)生泄漏赴精。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一绞幌、第九天 我趴在偏房一處隱蔽的房頂上張望蕾哟。 院中可真熱鬧,春花似錦莲蜘、人聲如沸谭确。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逐哈。三九已至,卻和暖如春问顷,著一層夾襖步出監(jiān)牢的瞬間昂秃,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工择诈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留械蹋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓羞芍,卻偏偏與公主長(zhǎng)得像哗戈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荷科,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容