史上最简单的「返回顶部」代码

之前实现返回顶部用的是 jQuery Smooth Scroll 插件,但是被我发现了一个更简便的用代码就可以解决的办法,于是就把插件给卸载了。

丝毫不吹牛的说这个绝对是史上最简短的代码了,因为只需要一行……在 footer.php 中的最后一个 </body> 标签之前加入如下代码:

<script type="text/javascript" src="http://arrow.scrolltotop.com/arrow66.js"></script>

嗯,没了…… 就这一行实现返回顶部,具体效果见页面右下角。

其实看一下代码很容易就发现这个只是调用别人服务器上已有的 Js 代码。如果把最后的 arrow66.js 换成 arrow62.jsarrow63.js 等等都可以,只是显示不同的返回标志而已。

本着一探究竟的精神我点开这段 JS 代码(见本文末尾),其实跟普通的 jQuery 上移代码没有本质区别。如果对这个标志不满意的话,可以在这里找到更多的「返回顶部」代码。其实原代码一般有三行:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="http://arrow.scrolltotop.com/arrow13.js"></script>
<noscript>Not seeing a <a href="http://www.scrolltotop.com/">Scroll to Top Button</a>? Go to our FAQ page for more info.</noscript>

第一句应该是先调用一个云端的 jQuery 库,即使网站本身没有开启 jQuery 也确保下面的代码可以生效。不过目前绝大部分的网站都是启用了 jQuery, 所以这一句没有什么用处。而且在我的网站上如果加上这一句会导致网站首页空白, 应该是这个库跟现有主题内置的产生冲突了。建议先不要加入这一句代码,如果不能实现返回顶部的话再尝试加入。第二句就是真正的调用代码了。第三句应该是一行广告,给原始网站增添流量罢了,建议删除。

调用云端的代码一个显而易见的缺点就是,一旦哪一天别人把代码撤下了,或者存放代码的域名有变动,那么这个功能就失效了。保险起见可以将原始的 .js 文件存放在自己网站的 js 文件夹里,再去 footer.php 里声明调用一下这个功能。原始 JavaScript 代码见本文末尾。不过对于我这种懒人就直接写进这一句代码了,等哪天不能正常工作的时候再来调整一下。毕竟这么短的一句代码诱惑实在是太大了……

减少工作量带来的另外一个问题就是,由于代码不是存放在自己的空间里,完全无法对其进行修改,别人写好是怎么样就是怎么样,顶多在 CSS 中编辑一下样式…… 而且配合响应式主题,在移动设备上的显示有一点点问题,不过并不影响使用。看下图。

附:完整的「返回顶部」 JavaScript 代码

var scrolltotop = {
    //startline: Integer. Number of pixels from top of doc scrollbar is scrolled before showing control
    //scrollto: Keyword (Integer, or "Scroll_to_Element_ID"). How far to scroll document up when control is clicked on (0=top).
    setting: {
        startline: 100,
        scrollto: 0,
        scrollduration: 1000,
        fadeduration: [500, 100]
    },
    controlHTML: '***', //引号中填入显示的图片 url, 如 img alt="" src="*.png".
    controlattrs: {
        offsetx: 5,
        offsety: 5
    }, //offset of control relative to right/ bottom of window corner
    anchorkeyword: '#top', //Enter href value of HTML anchors on the page that should also act as "Scroll Up" links
    state: {
        isvisible: false,
        shouldvisible: false
    },
    scrollup: function() {
        if (!this.cssfixedsupport) //if control is positioned using JavaScript
            this.$control.css({
                opacity: 0
            }) //hide control immediately after clicking it
        var dest = isNaN(this.setting.scrollto) ? this.setting.scrollto : parseInt(this.setting.scrollto)
        if (typeof dest == "string" && jQuery('#' + dest).length == 1) //check element set by string exists
            dest = jQuery('#' + dest).offset().top
        else
            dest = 0
        this.$body.animate({
            scrollTop: dest
        }, this.setting.scrollduration);
    },
    keepfixed: function() {
        var $window = jQuery(window)
        var controlx = $window.scrollLeft() + $window.width() - this.$control.width() - this.controlattrs.offsetx
        var controly = $window.scrollTop() + $window.height() - this.$control.height() - this.controlattrs.offsety
        this.$control.css({
            left: controlx + 'px',
            top: controly + 'px'
        })
    },
    togglecontrol: function() {
        var scrolltop = jQuery(window).scrollTop()
        if (!this.cssfixedsupport)
            this.keepfixed()
        this.state.shouldvisible = (scrolltop >= this.setting.startline) ? true : false
        if (this.state.shouldvisible && !this.state.isvisible) {
            this.$control.stop().animate({
                opacity: 1
            }, this.setting.fadeduration[0])
            this.state.isvisible = true
        } else if (this.state.shouldvisible == false && this.state.isvisible) {
            this.$control.stop().animate({
                opacity: 0
            }, this.setting.fadeduration[1])
            this.state.isvisible = false
        }
    },
    init: function() {
        jQuery(document).ready(function($) {
            var mainobj = scrolltotop
            var iebrws = document.all
            mainobj.cssfixedsupport = !iebrws || iebrws && document.compatMode == "CSS1Compat" && window.XMLHttpRequest //not IE or IE7+ browsers in standards mode
            mainobj.$body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html') : $('body')) : $('html,body')
            mainobj.$control = $('<div id = "topcontrol" >' + mainobj.controlHTML + '</div>')
                .css({
                    position: mainobj.cssfixedsupport ? 'fixed' : 'absolute',
                    bottom: mainobj.controlattrs.offsety,
                    right: mainobj.controlattrs.offsetx,
                    opacity: 0,
                    cursor: 'pointer'
                })
                .attr({
                    title: 'Scroll to Top'
                })
                .click(function() {
                    mainobj.scrollup();
                    return false
                })
                .appendTo('body') if (document.all && !window.XMLHttpRequest && mainobj.$control.text() != '') //loose check for IE6 and below, plus whether control contains any text
                    mainobj.$control.css({
                        width: mainobj.$control.width()
                    }) //IE6- seems to require an explicit width on a DIV containing text
            mainobj.togglecontrol() $('a[href="' + mainobj.anchorkeyword + '"]').click(function() {
                mainobj.scrollup()
                return false
            }) $(window).bind('scroll resize', function(e) {
                mainobj.togglecontrol()
            })
        })
    }
}
scrolltotop.init()

About the author

Jueqin

本作品以 CC BY-NC-ND 许可协议进行发布。

如果您认为文章对您有用的话,不妨请我喝一杯咖啡?

20 comments