iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
Modern Web

快搭上姐姐的`微`前端便車系列 第 22

第22車廂-模仿大賽—仿IT邦幫忙:Sticky Nav應用篇

  • 分享至 

  • xImage
  •  

本篇介紹固定navBar應用篇—仿IT邦幫忙

每進入iT邦幫忙網站,忍不住都會滑一下卷軸吧?上方header算是常見的網頁效果,
所以今天要來模仿一下,iT邦幫忙是怎麼做的!

▼完成圖如下

結構會與IT邦幫忙的header有點不同,是以比較易懂的HTML去撰寫

HTML

  <header>
    <h1><a href="/"><img
             src="https://ithelp.ithome.com.tw/storage/image/logo.svg"
             alt="iT邦幫忙"></a></h1>
  </header>
  <nav>
    <h1><a href="/"><img
             src="https://ithelp.ithome.com.tw/storage/image/nav_logo.svg"
             alt="iT邦幫忙"></a></h1>

    <ul class="menu__left">
      <li><a href="###">nav1</a></li>
      <li><a href="###">nav2</a></li>
      <li><a href="###">nav3</a></li>
      <li><a href="###">nav4</a></li>
    </ul>
  </nav>

  <div class="container">
      ...其他假文字
  </div>

CSS

  <style>
    * {
      margin: 0;
      padding: 0;
      list-style: none;
    }

    a {
      text-decoration: none;
    }

    .container {
      padding: 10px;
    }

    nav {
      background-color: #00A0E9;
      display: flex;
      padding: 0 15px;
      align-items: center;
    }

    nav .menu__left {
      display: flex;
      background-color: #00a0e9;
      transform: translateX(-120px);
      transition: 0.2s linear;
    }

    nav a {
      color: #fff;
      padding: 10px;
      display: block;
    }

    .menu--fixed {
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      z-index: 100;
    }

    .menu--fixed .menu__left {
      transform: translateX(0);
    }
  </style>

邏輯

當卷軸拉到header的高度一樣高時,就將nav新增class,這個class是做fixed,這時候nav就會固定,但是因為此時nav會是漂浮的狀態,所以要再將nav的高度加回來

JS

 <script>
    window.addEventListener('scroll', function (e) {
      const header = document.querySelector("header");
      const nav = document.querySelector("nav");
      const scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop; 
      let topHeader = header.offsetHeight;

      console.log(scrollTop, topHeader)

      if (scrollTop >= topHeader) {
        console.log("比較高")
        nav.classList.add('menu--fixed');
        document.body.style.paddingTop = nav.offsetHeight + "px";
      } else {
        nav.classList.remove('menu--fixed');
        document.body.style.paddingTop = "0px";
      }

    }
    );

  </script>

JQ

 <script>

    $(window).scroll(function () {
      var win_h = $(document).scrollTop();

      if (win_h >= $('.header').height()) {
        $('nav').addClass('menu--fixed');
        $('body').css("padding-top", $('nav').height() + "px")
      } else {
        $('nav').removeClass('menu--fixed');
        $('body').css("padding-top", "0px")

      }
    }).scroll();
  </script>

方法介紹

JS方法 代表
window.scrollY 卷軸現在高度Y值(高度)
offsetWidth 取得元素的寬度(包含 padding 和 border)
offsetHeight 取得元素的高度(包含 padding 和 border)
offsetTop 取得相對於上層的Y座標(相對於父層的位置)
JQ方法 代表
$(window).scrollTop() 卷軸現在Y值(高度)
height() 設置或取得元素的高度
width() 設置或取得元素的寬度
innerWidth() 取得元素的寬度(含 padding)
innerHeight() 取得元素的高度(含 padding)
outerWidth() 取得元素的寬度(包含 padding 和 border)
outerHeight() 取得元素的高度(包含 padding 和 border)

範例補充

我發現小心機的logo的地方原來是這樣做的
logo一直都在只是透過移動+蓋背景色被隱藏了
https://ithelp.ithome.com.tw/upload/images/20211007/20142016N8Bv3pjNaK.jpg

https://ithelp.ithome.com.tw/upload/images/20211007/20142016tRv1KszjYo.jpg
等到nav 被新增了('menu--fixed') 就會套用到
.menu--fixed .menu__left { transform: translateX(0); }

當然你不透過JS,把整段JS刪了,也可以只靠CSS position: sticky; 就達到同樣滑到nav時固定(撇除固定時還要將Logo出現),但是因為position: sticky;IE上是沒有作用的,所以還是只能透過JS達到囉!

▼ 加sticky;版本

CSS

  <style>
    * {
      margin: 0;
      padding: 0;
      list-style: none;
    }

    a {
      text-decoration: none;
    }

    .container {
      padding: 10px;
    }

    nav {
      background-color: #00A0E9;
      display: flex;
      padding: 0 15px;
      align-items: center;
      position: sticky; //增加
      top: 0;
    }

    nav .menu__left {
      display: flex;
      background-color: #00a0e9;
      transform: translateX(-120px);
      transition: 0.2s linear;
    }

    nav a {
      color: #fff;
      padding: 10px;
      display: block;
    }
  </style>

本篇參考:
https://ithelp.ithome.com.tw/articles/10249456
https://icguanyu.github.io/jquery/getsize/
https://codertw.com/%E5%89%8D%E7%AB%AF%E9%96%8B%E7%99%BC/288188/


上一篇
第21車廂-input全選/取消全選功能底加啦!
下一篇
第23車廂-在網頁中預覽pdf—pdf.js簡易版應用篇
系列文
快搭上姐姐的`微`前端便車30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言