亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript手工制作懸浮菜單

2019-11-20 13:10:16
字體:
來源:轉載
供稿:網友

有選擇性的重復造一些輪子,未必是件壞事。Aaron的博客上加了一個懸浮菜單,貌似顯得很高大上了。雖然這類小把戲也不是頭一次見了,但是從未自己寫過。今天就選擇性的拿這個功能寫一寫。下面是這個輪子的開發過程,也可以當作是一篇需求文檔的分析和實現過程。

演示地址:http://sandbox.runjs.cn/show/to8wdmuy

源碼下載:https://github.com/bjtqti/floatmenu

第一步創建dom節構:

復制代碼 代碼如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AppCarrier</title>
    <link rel="stylesheet" href="menu.css">
</head>
<body>
    <div id="content">
              <h1 id="test1">test1</h1>
              <p>The past can hurt. But you can either run from it or learn from it</p>
              <p>過去是痛楚的,但你要么逃避,要么從中成長</p>
              <p>One meets his destiny on the road he takes to avoid it</p>
              <p>往往在逃避命運的路上,卻與之不期而遇</p>
              <p>Rules are meant to be broken</p>
              <p>規則就該被打破。</p>
              <p>Years may wrinkle the skin, but to give up enthusiasm wrinkles the soul.</p>
              <p>歲月流逝只令容顏蒼老,激情不再卻使心靈枯萎。</p>
              <h1 id="test2">test2</h1>
              <p>只有不斷地練習學到的知識,你才能真正掌握它。</p>
              <p>Live every day to the fullest.</p>
              <p>盡享每日。</p>
              <p>Keep your eyes on the stars, and your feet on the ground.</p>
              <p>志存高遠,腳踏實地。</p>
              <p>Always be up for an unexpected adventure.</p>
              <p>隨時準備開始一場意外冒險吧。</p>
              <p>Life is full of disappointment. You can't dwell on things. You have to move on.</p>
              <p>生活常不如意,別沉溺往事,要勇往直前。</p>
              <p>I'm a free spirit. I can't be caged.</p>
              <p>我的靈魂是自由的,不該被束縛。</p>
              <p>Sometimes the heart sees what is invisible to the eye.</p>
              <p>目不見者,心可感之</p>
              <p>The simple things are also the most extraordinary things, and only the wise can see them.</p>
              <p>最平凡的事也是最非凡的事,只有智者才明白。</p>
              <h1 id="test3">test3</h1>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <h1 id="test4">test4</h1>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
              <p>how many xxxxxx</p>
    </div>
    <div class="menu" id="menubar">
        <p class="static">隱藏</p>
        <ul>
            <li><a href="#test1">test1</a></li>
            <li><a href="#test2">test2</a></li>
            <li><a href="#test3">test3</a></li>
            <li><a href="#test4">test4</a></li>
        </ul>
    </div>
</body>
<script src="menu.js"></script>
</html>

第二步準備css文件:

復制代碼 代碼如下:

ul {
    list-style-type: none;
}
a {
    text-decoration: none;
}
/*文章內容區*/
#content {
    width:400px;
    margin: 0 auto;
    font-size: 2em;
}
/*懸浮菜單*/
.menu {
    position: fixed;
    top:20%;
    right: 0;
    width:200px;
    border: 1px solid gray;
    border-radius: 5px;
}
.menu li {
    height: 2em;
    line-height: 2em;
}
.red {
    color : red;
}
.hide {
    display: none;
}
/*隱藏懸浮菜單*/
.slideIn {
    transform : translate3d(202px, 0, 0);
    transition-duration : .5s;
}
/*顯示懸浮菜單*/
.slideOut {
    transform : translate3d(0, 0, 0);
    transition-duration : .5s;
}
.static {
    color:#007aff;
    text-align: center;
}
/*顯示懸浮球*/
.toShow {
    display: block;
        width: 4.8em;
        height: 2em;
        line-height: 2em;
        border-radius: .5em;
    border:1px solid gray;
    transform : translate3d(-5em, 0, 0);
    transition-duration : 1s;
}

第三步開始編寫js代碼:

復制代碼 代碼如下:

(function(doc){
    //收集各章節的鏈接位置
     var pos = [],
         //收集菜單上的項目
         links = doc.getElementsByTagName('a'),
         //收集章節的標題
         titles = doc.getElementsByTagName('h1'),
         //懸浮菜單
         menu = doc.getElementById('menubar'),
         //當前選擇項
         currentItem=null;
     //添加紅色樣式
     var addClass = function (element){
             currentItem && currentItem.removeAttribute('class');
             element.setAttribute('class','red');
             currentItem = element;
         },
         //網頁被卷去的高:
        getScrollTop = function (){
            return Math.ceil(document.body.scrollTop)+1;
        },
         //計算滾動位置
        startScroll = function (){
            var scrollTop = getScrollTop(),
                len = titles.length,
                i = 0;
            //第一條
            if(scrollTop>=0 && scrollTop<pos[0]){
                addClass(links[0]);
                return;
            }
            //最后一條
            if(scrollTop>=pos[len-1]){
                addClass(links[len-1]);
                return;
            }
            //中間
            for(;i<len;i++){
                if(scrollTop > pos[i] && scrollTop < pos[i+1]){
                    addClass(links[i]);
                    break;
                }
            }
    };
     //點擊列表中的鏈接變色
     menu.onclick=function(e){
         var target = e.target || e.srcElement;
         if(target.nodeName.toLowerCase() === 'a'){
             //列表項狀態指示
             addClass(target);
             return;
         }
         if(target.nodeName.toLowerCase() === 'p'){
             if(target.className == 'static'){
                 //隱藏菜單
                 this.className = 'menu slideIn';
                 setTimeout(function(){
                     target.className = 'static toShow';
                     target.innerHTML = '顯示';
                 },1000);
             }else{
                 //顯示菜單
                 target.className = 'static';
                 target.innerHTML = '隱藏';
                 this.className = 'menu slideOut';
             }
         }
     }
    //計算各章節的初始位置
    var ln = titles.length;
    while(--ln>-1){
        //titles[len].offsetParent.offsetTop = 0;
        pos.unshift(titles[ln].offsetTop);
    }
    startScroll();
    //監聽滾動
    window.onscroll = function(){
          startScroll()
    }
})(document);

分析:

    1. 實現自動跳轉到指定節

          這一步可以利用<a>標簽的錨功能來做,由于html5以后不支持name 屬性(HTML5 不支持。規定錨的名稱。),所以考慮用ID來跳轉。

    2. 標識懸浮菜單中的項屬于左邊內容中的哪個章節。

          這一步是難點,先簡單分析一下:

            2.1 第一種情況,就是人為點擊菜單項。這個很容易,只要標識點擊的元素就可以了。

            2.2 第二種情況,通過鼠標中鍵滾動或拖動滾動條,這個時候要關聯左邊內容和右邊菜單項,這是最難的地方??紤]分步實施,先易后難,各各擊破的策略。

             2.2.1 先收集標題元素的坐標高度。也就是所有的h1標簽的垂直高度。存入數組1.

             2.2.2 收集菜單項中的a元素,存入數組2.

                2.2.3  監聽滾動事件,判斷當前內容屬于哪個菜單項。

                    做一步的時候,建議在稿紙上畫一個圖:

            A1

                         ****************
                         *       A2
                         *
                         ****************
                         *       A3
                         *
                         ****************
                         *
                         *     A4
                         *

       每滾動一次,就判斷當前滾動的距離是在哪一個區間,如果是0到A1則是第1章,A1到A2則是第2章,以此類推。

                    關于元素的位置高度,我這里簡單地用element.offsetTop來獲取,可能會存在兼容性問題,如果用jquery來做的話,應當是$('element').offset().top,

                    同樣的,滾動條的高度,我也是簡單的用了document.body.scrollTop來獲取,如果換成jquery的話,應當是$(window).scrollTop();

                   畫圖的作用是把抽象的問題具體化,幫助我們思考,找出規律。也許稱為“建?!睍@得高大上一些吧。

                    需要強調的是數組1和數組2中的關系應當是一一對應的。如<a href="#h1">對應的是<h1 id="h1">。

           2.3 第三種情況,直接進入頁面時的菜單狀態指示。比如通過index.html#h3這樣的地址進來,菜單中的h3應當要突出顯示。

    3.  實現懸浮菜單的顯示和隱藏動畫。

        3.1  這一步應當是比較簡單的,可以考慮先做。利用css3的tramsform屬性就可以了,簡單高效,跨瀏覽器的話,注意兼容。

      注意transform : translate3d(x軸, y軸, z軸); 用3d是可以利用硬件加速,增加動畫效果,但是功耗會增加,善用!第一個參數是控制左右方向,如果為正,則表示向右移動,如果為負則向左移動。這么說其實是不嚴謹的,實際上應當根據參考點來確定,比如元素的靜止時的x坐標是0,那么增加x的值向右,減少為向左,0為復位。

    分析完之后,就是編寫代碼了。這沒有什么好說的。盡情享受敲擊鍵盤產生的樂感吧。

    寫完之后,預覽一下,點擊菜單,跳入指定章節,同時點擊項變紅色,刷新當前頁面,依賴顯示正確?;瑒右幌聺L輪,菜單項隨著內容的變化而相應的變化,拖動一下滾動條,也是這樣,最后點擊一下隱藏,菜單縮回去,點擊顯示,菜單滑出來。這樣懸浮功能就做完了。

以上就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人一区二| 欧美日韩国产区| 欧美插天视频在线播放| 国产激情综合五月久久| 亚洲免费电影在线观看| 精品视频在线观看日韩| 国产精品久久久久7777婷婷| 91精品视频在线免费观看| 亚洲成人黄色在线| 欧美一区深夜视频| 日韩精品视频免费专区在线播放| 国产精品偷伦视频免费观看国产| 久久的精品视频| 国产丝袜一区二区三区免费视频| 中文字幕精品网| 成人福利网站在线观看| 66m—66摸成人免费视频| 亚洲成人a级网| 粉嫩av一区二区三区免费野| 亚洲欧洲国产一区| www.亚洲男人天堂| 欧美在线视频播放| 日韩av在线高清| 日韩欧美亚洲国产一区| 九九热精品视频国产| 粉嫩老牛aⅴ一区二区三区| 亚洲欧美日韩区| 国产脚交av在线一区二区| 亚洲综合成人婷婷小说| 日韩精品中文字幕久久臀| 久久香蕉精品香蕉| 亚洲成色777777女色窝| 欧美日韩一区二区三区在线免费观看| 亚洲高清av在线| 久久久久久久久综合| 91福利视频网| 欧美日韩裸体免费视频| 久久91亚洲精品中文字幕奶水| 国产xxx69麻豆国语对白| 91精品久久久久久久久不口人| 久久久噜久噜久久综合| 97免费在线视频| 国产精品久久91| 一区二区三区国产在线观看| 国产91免费看片| 亚洲91精品在线| 国内揄拍国内精品少妇国语| 久久综合伊人77777| 欧美日韩综合视频网址| 中文字幕日韩av综合精品| 亚洲视频在线观看| 色妞欧美日韩在线| 丝袜亚洲欧美日韩综合| 国产亚洲精品91在线| 久久精品视频中文字幕| 日韩经典一区二区三区| 亚洲91精品在线观看| 欧美黑人xxx| 91精品国产精品| 国产成人精品久久二区二区| 日本精品久久中文字幕佐佐木| 亚洲精品日韩丝袜精品| 亚洲高清福利视频| 中文字幕免费国产精品| 国内精品小视频| 秋霞av国产精品一区| 欧美日韩国产一区中文午夜| 欧美日韩中文字幕在线| 正在播放欧美视频| 91九色蝌蚪国产| 一色桃子一区二区| 国产精品激情av在线播放| 成人福利网站在线观看| 日韩免费av在线| 亚洲国产成人精品久久久国产成人一区| 91精品视频一区| 国产亚洲aⅴaaaaaa毛片| 日韩精品视频在线播放| 日韩精品在线观看视频| 欧美疯狂性受xxxxx另类| 久久久久这里只有精品| 欧美日韩加勒比精品一区| 欧美日韩国产丝袜另类| 91麻豆国产精品| 欧美第一黄网免费网站| 成人女保姆的销魂服务| 日韩精品久久久久久久玫瑰园| 欧美精品免费在线观看| 国产日韩在线观看av| 岛国av一区二区在线在线观看| 黑人巨大精品欧美一区免费视频| 国产精品网站视频| 一区二区成人av| 亚洲欧美成人精品| 午夜精品一区二区三区在线播放| 色悠悠国产精品| 91国产美女视频| 欧美精品一区二区三区国产精品| 久久久久久这里只有精品| 2025国产精品视频| 欧美激情网站在线观看| 91免费人成网站在线观看18| 欧日韩不卡在线视频| 欧美成人免费全部| 国产91成人在在线播放| 亚洲欧洲在线视频| 久久久视频在线| 伦伦影院午夜日韩欧美限制| 国产精品美女呻吟| 91精品视频在线| 91社影院在线观看| 国产亚洲视频中文字幕视频| 国产91精品高潮白浆喷水| 亚洲色图25p| 538国产精品视频一区二区| 欧美怡红院视频一区二区三区| 这里只有精品久久| 欧美多人爱爱视频网站| 97精品免费视频| 欧美日韩成人黄色| 中文字幕欧美日韩在线| 亚洲第一网中文字幕| 国产精品福利网站| 欧美日韩一区二区精品| 亚洲国产另类久久精品| 久久免费精品日本久久中文字幕| 久久精品美女视频网站| 日韩一中文字幕| 亚洲女人天堂网| 国产+人+亚洲| 久久人人爽亚洲精品天堂| 亚洲人精品午夜在线观看| 国产丝袜视频一区| 日韩免费不卡av| 日韩亚洲一区二区| 亚洲视频在线观看视频| 亚洲偷欧美偷国内偷| 亚洲欧美一区二区三区四区| 成人在线中文字幕| 精品国产乱码久久久久久天美| 国产精品网红直播| 亚洲精品欧美日韩专区| 亚洲自拍欧美色图| 亚洲欧美日韩高清| 亚洲国产精彩中文乱码av在线播放| 不卡av在线播放| 欧美黑人国产人伦爽爽爽| 亚洲欧美激情四射在线日| 久久久久久尹人网香蕉| 国内免费久久久久久久久久久| 好吊成人免视频| 91免费在线视频网站| 国产精品国产三级国产专播精品人| 午夜精品蜜臀一区二区三区免费| 91精品国产综合久久久久久蜜臀| 国模视频一区二区| 国产欧美亚洲精品| 亚洲精品国产精品自产a区红杏吧| 91免费精品视频| y97精品国产97久久久久久| 欧美另类交人妖| 国产mv久久久| 国产成人avxxxxx在线看| 亚洲欧美在线免费观看|