一个细长的垂直滚动条,可以自动生成指向文档中不同部分的节点(锚链接)。非常适合单页滚动网站和全页时间表。用jQuery和CSS/CS3编写。
1.为垂直滚动条创建一个emty HTML列表。
- <ul class="indicator">
- <li class="bar"></li>
- </ul>
2.在网页中添加内容部分。请注意,每个部分都必须有一个唯一的数据名称
:
- <div class="container">
- <section data-name="Home">
- <h1>Slim One Page Scroll Indicator Example</h1>
- <p>A slim vertical scrollbar that automatically generates nodes (anchor links) pointing to different sections within the document. Great for one page scrolling website and fullpage timelines. Written in jQuery and CSS/CSS3.
- </p>
- </section>
- <section data-name="Two">
- <h1>Section Two</h1>
- </section>
- <section data-name="Three">
- <h1>Section Three</h1>
- </section>
- ... more sections here ..
- </div>
3.设置垂直滚动条的样式。
- .indicator {
- margin: 0;
- padding: 0;
- list-style: none;
- position: fixed;
- left: 100px;
- top: 5%;
- width: 1px;
- height: 90%;
- background: #464c63;
- }
- .indicator .bar {
- position: absolute;
- width: 1px;
- background-color: #fcf769;
- top: 0;
- left: 0;
- z-index: 0;
- }
4.设置滚动条内节点(锚链接)的样式。
- .node {
- position: absolute;
- width: 3px;
- height: 3px;
- background: #FFF;
- left: -1px;
- z-index: 1;
- cursor: pointer;
- border-radius: 3px;
- }
- .node:hover {
- background: #46ffdd;
- }
- .node:hover span {
- opacity: 1;
- }
- .node:before {
- content: "";
- position: absolute;
- width: 9px;
- height: 9px;
- left: -3px;
- top: -3px;
- }
- .node span {
- transition: all 0.4s ease-out;
- text-transform: uppercase;
- right: 4px;
- top: -16px;
- color: #FFFFFF;
- position: absolute;
- padding: 10px;
- white-space: nowrap;
- font-size: 10px;
- font-weight: 200;
- opacity: 0;
- }
5.包括必要的jQuery库。
- <script src="/path/to/cdn/jquery.min.js"></script>
6.用于激活滚动条的主JavaScript。
- $(function () {
- function sumSection() {
- return $(".container").height();
- }
- function setDimensionBar() {
- $(".bar").css({
- "height": $(window).height() / sumSection() * 100 + "%" });
- }
- function setSection() {
- $.each($("section"), function (i, element) {
- $(element).css({
- "min-height": $(window).height() });
- });
- }
- function addBehaviours() {
- let sections = $("section");
- $.each($(".node"), function (i, element) {
- $(element).on("click", function (e) {
- e.preventDefault();
- let scroll = $(sections[i]).offset().top;
- $('html, body').animate({
- scrollTop: scroll },
- 500);
- });
- });
- }
- function arrangeNodes() {
- $(".node").remove();
- $.each($("section"), function (i, element) {
- let name = $(element).data("name");
- let node = $("<li class='node'><span>" + name + "</span></li>");
- $(".indicator").append(node);
- $(node).css({
- "top": $(".indicator").height() / $(document).height() * $(element).offset().top });
- });
- addBehaviours();
- }
- $(window).on("scroll", function () {
- let top = window.scrollY / sumSection() * 100;
- $(".bar").css({
- "top": top + "%" });
- });
- $(window).on("resize", function () {
- setSection();
- arrangeNodes();
- setDimensionBar();
- });
- setTimeout(
- function () {
- setSection();
- arrangeNodes();
- setDimensionBar();
- },
- 200);
- });