自動的に要素の数に合わせてナビゲーションを増減させるスクリプト
PR
Auto-generated Scroll Nav
Heght、Width、それぞれが100%の要素を連続して並べて作られたようなページで表示するナビゲーションが自動的にその要素の数に合わせてアンカーリンクを創りだしてくれるスクリプト
また現在の位置に応じてナビゲーションが変化します
右側にあるアンカーリンクのナビゲーションが、要素の数に合わせて自動的に生成されてナビゲートしてくれるものです。
ポイントは、sectionのtitleのところを元に数字を指定、あとはidにそれぞれ何番目かの目印をつけるだけ
コード
HTML
<nav id="section-menu"> <ul></ul> </nav> <section id="section-one" class="section scroll-item" title="One"> <div class="inner"> <h2>Today</h2> </div> </section> <section id="section-two" class="section scroll-item" title="Two"> <div class="inner"> <h2>I</h2> </div> </section> <section id="section-three" class="section scroll-item" title="Three"> <div class="inner"> <h2>ate</h2> </div> </section> <section id="section-four" class="section scroll-item" title="Four"> <div class="inner"> <h2>the</h2> </div> </section> <section id="section-five" class="section scroll-item" title="Five"> <div class="inner"> <h2>world</h2> </div> </section> <script type="text/javascript" src="script.js"></script>
6番目を追加するのなら次のように追加
<section id="section-six" class="section scroll-item" title="six"> <div class="inner"> <h2>world</h2> </div> </section>
あとは同じ要領で増やして行けます
CSS
html, body { margin: 0; padding: 0; min-height: 100%; font-family: Helvetica, sans-serif; vertical-align: baseline; } h2 { font-weight: 100; font-size: 10em; line-height: 1em; text-transform: uppercase; text-align: center; margin: 0; padding: 0; color: #fff; } .inner { width: 62.5%; margin: 0 auto; padding-top: 20%; } /* ========================================================================== Sections ========================================================================== */ .section { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; height: 400px; } #section-one { background: #73d2e5; } #section-two { background: #57b8d9; } #section-three { background: #3d9ccc; } #section-four { background: #2680bf; } #section-five { background: #1262b2; } /* ========================================================================== Section Navigation ========================================================================== */ #section-menu { position: fixed; top: 50%; right: 0; z-index: 3000; text-transform: uppercase; -webkit-transition: all ease 0.1s; transition: all ease 0.1s; } #section-menu.freeze { right: -112px; } .touch #section-menu { display: none; } #section-menu ul { margin: 0; padding: 0; list-style: none; } #section-menu li {} #section-menu a { float: right; clear: both; display: block; height: 2em; line-height: 2em; text-decoration: none; padding: 0 8px; background: rgba(0,0,0,0.5); color: #fff; white-space: nowrap; -webkit-transition: all ease 0.1s; transition: all ease 0.1s; } #section-menu.freeze a { float: none; width: 128px; } #section-menu a:hover, #section-menu a:focus { background: rgba(0,0,0,0.75); font-size: 1.2em; } #section-menu a span { display: none; font-weight: 700; position: relative; width: 32px; left: -8px; text-align: center; background: rgba(0,0,0,0.1); } #section-menu a.active { background: #000; font-size: 1.4em; font-weight: 700; } #section-menu.freeze a span { display: inline-block; } #section-menu a.active span { display: inline-block; background: #000; } #section-menu a.active span:before { content: ''; position: absolute; width: 100%; height: 100%; left: 0; background: #f80; } #section-menu.freeze a.active span:before { display: none; }
デフォルトでの表現が少し、物足りなかったので #section-menu a に width:100px;を追加しました。
追加前
追加後
とりあえず、ガタガタが気になったので揃えました
javascript (jQuery)
jQuery(function($) { var html = $('html'); var viewport = $(window); var viewportHeight = viewport.height(); var scrollMenu = $('#section-menu'); var timeout = null; function menuFreeze() { if (timeout !== null) { scrollMenu.removeClass('freeze'); clearTimeout(timeout); } timeout = setTimeout(function() { scrollMenu.addClass('freeze'); }, 2000); } scrollMenu.mouseover(menuFreeze); /* ========================================================================== Build the Scroll Menu based on Sections .scroll-item ========================================================================== */ var sectionsHeight = {}, viewportheight, i = 0; var scrollItem = $('.scroll-item'); var bannerHeight; function sectionListen() { viewportHeight = viewport.height(); bannerHeight = (viewportHeight); $('.section').addClass('resize').css('height', bannerHeight); scrollItem.each(function(){ sectionsHeight[this.title] = $(this).offset().top; }); } sectionListen(); viewport.resize(sectionListen); viewport.bind('orientationchange', function() { sectionListen(); }); var count = 0; scrollItem.each(function(){ var anchor = $(this).attr('id'); var title = $(this).attr('title'); count ++; $('#section-menu ul').append('<li><a id="nav_' + title + '" href="#' + anchor + '"><span>' + count + '</span> ' + title + '</a></li>'); }); function menuListen() { var pos = $(this).scrollTop(); pos = pos + viewportHeight * 0.625; for(i in sectionsHeight){ if(sectionsHeight[i] < pos) { $('#section-menu a').removeClass('active'); $('#section-menu a#nav_' + i).addClass('active');; var newHash = '#' + $('.scroll-item[title="' + i + '"]').attr('id'); if(history.pushState) { history.pushState(null, null, newHash); } else { location.hash = newHash; } } else { $('#section-menu a#nav_' + i).removeClass('active'); if (pos < viewportHeight - 72) { history.pushState(null, null, ' '); } } } } scrollMenu.css('margin-top', scrollMenu.height() / 2 * -1); /* ========================================================================== Smooth Scroll for Anchor Links and URL refresh ========================================================================== */ scrollMenu.find('a').click(function() { var href = $.attr(this, 'href'); $('html').animate({ scrollTop: $(href).offset().top }, 500, function() { window.location.hash = href; }); return false; }); /* ========================================================================== Fire functions on Scroll Event ========================================================================== */ function scrollHandler() { menuListen(); menuFreeze(); } scrollHandler(); viewport.on('scroll', function() { scrollHandler(); // window.requestAnimationFrame(scrollHandler); }); });
それぞれのコードはダブルクリックすると、簡単に全選択になりコピーできます。
コードをファイルでダウンロード
DOWNLOAD
PR
COMMENT