使用Affix和ScrollSpy插件動態(tài)生成你的文章內(nèi)部目錄

引言

在寫博客的時候,為了條理性起見玩般,經(jīng)常會使用許多小標(biāo)題银觅,當(dāng)文章長時,需要來回在不同的標(biāo)題之間穿梭坏为,如果手動添加目錄设拟,添加錨點,實在是麻煩久脯,為此纳胧,可以動態(tài)生成一塊目錄區(qū)域,并使用Bootstrap提供的Affix插件將目錄區(qū)域固定在頁面上帘撰。Bootstrap文檔便使用了它

準(zhǔn)備工作-引入bootstrap.min.js

  • 將bootstrap.min.js放入body之前的script標(biāo)簽中跑慕,uikit.min.js暫時不引入
    引入相關(guān)插件之后,我們的思路是首先根據(jù)文章自動生成錨點以及菜單內(nèi)容核行,隨后為其添加Affix產(chǎn)生固定效果牢硅,再使用uikit的scrollSpy插件(bootstrap中也有scrollspy,使用方法幾乎一致)。

引-學(xué)習(xí)Affix的使用

Affix插件尅幫助我們固定導(dǎo)航部分的位置芝雪,并且根據(jù)用戶的滾動情況來為固定的元素增加垂直偏移量减余,使得nav在三個類之間進(jìn)行切換:
1.affix-top:表示在頂端
2.affix:表示在頁面滾動,增加fixed屬性惩系,同時使用自定義的offset偏移量
3.affix-bottom:表示到達(dá)最底端

啟用Affix只需要以下代碼:

$('#nav').affix({
    offset: {
                    top:$('header').offset().top,
            bottom: ($('footer').outerHeight(true) + 
                $('.application').outerHeight(true)) + 40
        }
});

一位岔、組織HTML代碼部分

<ul id="mysidebar" class="nav affix" >
</ul>

一定要注意為ul添加nav和affix類。

二堡牡、生成封裝代碼

將本代碼段引入到你自己的script腳本中

  ;$.fn.extend({
        "createAffix": function(selector) {
            $list = $("" + selector),
                length = $list.length,
                affixValue = "";
            for (var i = 0; i < length; i++) {
                //給每一個標(biāo)題增加name屬性
                $list.eq(i).attr("id", ("node" + i));
                var text = $list.eq(i).text();
                if (i == 0) {
                    affixValue += "<li><a href=#node" + i + " class='active' >" + text + "</a></li>";
                } else {
                    affixValue += "<li><a href=#node" + i + ">" + text + "</a></li>";
                }
            }
            this.append(affixValue);
            this.affix({
                offset: {
                    top: this.offset().top//在固定之后距離頂部的偏移量
                }
            });
            return this;
        }
    
  });

上述代碼的原理是為createAffix函數(shù)傳入需要被認(rèn)為是標(biāo)題單元的標(biāo)簽或者類抒抬,在遍歷過程中為其增加錨點鏈接。

三晤柄、使用方法

書寫HTML部分

  <ul id="mysidebar" class="nav affix" >
  <li><a href="#node1"></a></li>
  <li><a href="#node2"></a></li>
  <li><a href="#node3"></a></li>
  </ul>
    
  <h3 id="node1">標(biāo)題1</h3>
  <h3 id="node2">標(biāo)題2</h3>
  <h3 id="node3">標(biāo)題3</h3>

書寫Javascript部分

  $(function(){
  $(' #mysidebar').createAffix('h3');
  //表示在文章中擦剑,使用`h3`標(biāo)簽的是  需要被添加錨點的地方。
  });

解決錨點偏移的問題

因為錨點默認(rèn)將頁面偏移到錨點元素的頂部芥颈,也就是如果我們對標(biāo)題1進(jìn)行了上述操作惠勒,當(dāng)我們點擊錨點時,頁面會偏移到'標(biāo)題1'所在的頂端位置爬坑,如果頂端有菜單欄捉撮,那么將會被遮住,通過設(shè)置css樣式來解決妇垢。

.class{
        /*
        添加padding可以讓錨點向下偏移num px,也就是跳過菜單欄的高度肉康,
        通過設(shè)置margin-top為負(fù)值來`彌補`因為padding-top帶來的空白部分
        */
        padding-top: num px;
        margin-top: -num px;
}

添加滾動監(jiān)聽

目前我們的DOM文檔是這樣的闯估。

<ul id="mysidebar" class="nav affix" >
<li><a href="#node1"></a></li>
<li><a href="#node2"></a></li>
<li><a href="#node3"></a></li>
</ul>

加工一下,引入uikit屬性,具體查看文檔

<ul id="mysidebar" class="nav affix uk-nav uk-nav-side" data-uk-scrollspy-nav="{closest:'li',smoothscrool:true}" >
<li><a href="#node1"></a></li>
<li><a href="#node2"></a></li>
<li><a href="#node3"></a></li>
</ul>

引入uikit.min.js

由于我們的菜單項(li)是在文檔加載后執(zhí)行的吼和,那么如果在生成菜單項之前變執(zhí)行uikit的scrollspy涨薪,那么必定不起作用,所以要在菜單項生成后引入uikit.min.js炫乓,代碼如下:

$(function(){
$(' #mysidebar').createAffix('h3');//生成菜單
$.getScript("uikit.min.js");//異步載入uikit.min.js刚夺,滾動監(jiān)聽生效。
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末末捣,一起剝皮案震驚了整個濱河市侠姑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箩做,老刑警劉巖莽红,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡安吁,警方通過查閱死者的電腦和手機醉蚁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鬼店,“玉大人网棍,你說我怎么就攤上這事「局牵” “怎么了滥玷?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長俘陷。 經(jīng)常有香客問我罗捎,道長,這世上最難降的妖魔是什么拉盾? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任桨菜,我火速辦了婚禮,結(jié)果婚禮上捉偏,老公的妹妹穿的比我還像新娘倒得。我一直安慰自己,他們只是感情好夭禽,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布霞掺。 她就那樣靜靜地躺著,像睡著了一般讹躯。 火紅的嫁衣襯著肌膚如雪菩彬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天潮梯,我揣著相機與錄音骗灶,去河邊找鬼。 笑死秉馏,一個胖子當(dāng)著我的面吹牛耙旦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萝究,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼免都,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帆竹?” 一聲冷哼從身側(cè)響起绕娘,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栽连,沒想到半個月后业舍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年舷暮,在試婚紗的時候發(fā)現(xiàn)自己被綠了态罪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡下面,死狀恐怖复颈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沥割,我是刑警寧澤耗啦,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站机杜,受9級特大地震影響帜讲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜椒拗,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一似将、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚀苛,春花似錦在验、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渗蟹,卻和暖如春块饺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雌芽。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工授艰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膘怕。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像召庞,于是被迫代替她去往敵國和親岛心。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫篮灼、插件忘古、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,064評論 4 62
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)诅诱,斷路器髓堪,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 有那么一次沖動,因為一心特別想念他。然后迫不及待的我就買了當(dāng)天晚上到他那的火車票干旁。 然后驶沼,在他所在的城...
    plskeepyourself閱讀 339評論 0 0
  • 從未感受過西北狂野的北方姑娘第一次來到了這里,偶然聯(lián)系到了認(rèn)識多年的朋友争群,結(jié)交了他的好哥們回怜,帶著我們嘗遍了...
    Psyche_li閱讀 426評論 0 1