Page Scroll Menu (页面中锚点菜单)

当页面太长时,会导致浏览不便,这时就需要一个页面锚点菜单(Page Scroll Menu),方便用户快速了解页面的概要及目录并快速定位到相应的目录。


实现方式:

1. 将页面按照内容分成不同的Section, 页面加载时读取各个Section并生成Menu,点击对应的Menu时计算对应Section的位置并设置其位置。

示例 1:http://www.outyear.co.uk/smint/, http://www.outyear.co.uk/smint/demo/

示例 2:http://manos.malihu.gr/page-scroll-to-id

2.  在页面中根据内容插入A标签,定义锚点,在页面加载时收集这些锚点并生成Menu,点击Menu时直接跳转到相应的锚点。

示例 1: http://sympies.com/pagescroll_jquery_menu/

示例 2:HPEMEA项目中的Author模块,主要代码摘录如下:

(function () {
    if (window.SideAnchorMenu == undefined) {
        window.SideAnchorMenu = function () {
            this.isInited = false;
        };
    }

    SideAnchorMenu.prototype.init = function (showTop, forceInit) {
        if (forceInit === false && this.isInited) return;
        var anchorMenu;
        if ($("#divSideAnchorMenu").size() == 0) {
            if (showTop) {
                anchorMenu = $("<div><img src='/Modules/Aximpro.DotNetValue.Anchor/Content/Images/axLogo.png' alt='axLogo' id='axlogo' /><br/><hr id='logo-separator'><br/></div><div><ul><li><a href='#'><span></span><div>Top</div></a></li></ul></div>");
            }
            else {
                anchorMenu = $("<div><img src='/Modules/Aximpro.DotNetValue.Anchor/Content/Images/axLogo.png' alt='axLogo' id='axlogo'/><hr id='logo-separator'></div><div><ul></ul></div>");
            }
            anchorMenu.attr("id", "divSideAnchorMenu");
            $("body").append(anchorMenu);
        } else {
            anchorMenu = $("#divSideAnchorMenu");
            anchorMenu.find("ul").empty();
        }
        var $ul = anchorMenu.find("ul");
        var eventHandler = {
            anchorMenuItemClick: function () {
                $ul.find("li").removeClass("active");
                $(this).addClass("active");
            },
            windowScollHandler: function () {
                $ul.find("li").removeClass("active");
                var windowScrollTop = $(this).scrollTop();
                var windowHeight = $(window).height();
                var forcedLi;
                $(".anchorMark").each(function () {
                    var anchorOffsetTop = $(this).offset().top;
                    if (anchorOffsetTop <= windowScrollTop + windowHeight/3) {
                        forcedLi = $ul.find("a[href='#" + $(this).attr("id") + "']").parent();
                        var bgImage = document.body.style.backgroundImage
                        if (document.body.style.backgroundImage.toString().indexOf($(this).attr("id") + ".jpg", 0) == -1) {

                            document.body.style.background = "url(/Skins/Single_Page/1.0/backgrounds/" + $(this).attr("id") + ".jpg) no-repeat center center fixed";
                            document.body.style.backgroundSize = "cover";
                        }
                    }
                });

                if (forcedLi) {
                    forcedLi.addClass("active");
                } else {
                    $ul.find("a[href='#']").parent().addClass("active");
                }
            }
        };

        $(".anchorMark").each(function (i, item) {
            var $item = $(item);
            var anchor = $("<a><span></span><div></div></a>");
            anchor.attr("href", "#" + $item.attr("id"));
            anchor.attr("class", 'anchor-item');
            anchor.find("div").text($item.attr("title"));
            var $li = $("<li></li>");
            $li.append(anchor);
            $ul.append($li);
            $li.click(eventHandler.anchorMenuItemClick);
        });
        //$ul.pagescroll_menu({ "position": "right", "fontfamily": "Forum" });        $(window).scroll(eventHandler.windowScollHandler);
        this.isInited = true;
    };
    <!--//--><![CDATA[//><!--
    $(document).ready(function () {

        $('a[href*=#]:not([href=#])').click(function () {
            if (location.pathname.replace(/^//, '') == this.pathname.replace(/^//, '') && location.hostname == this.hostname) {
                var target = $(this.hash);
                target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
                if (target.length) {
                    $('html,body').animate({
                        scrollTop: target.offset().top - 150

                    }, 800);

                    return false;
                }
            }
        });

        if (window.SideAnchorMenuInstance == undefined) {
            window.SideAnchorMenuInstance = new window.SideAnchorMenu();
            window.SideAnchorMenuInstance.init(false);
        }
    });
    //--><!]]>
})();




原文地址:https://www.cnblogs.com/cxp9876/p/4043170.html