JS实现回到顶部效果

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
            font-family: "Helvetica Neue", Helvetica, Arial, STHeiti, "Microsoft Yahei", sans-serif;
            font-size: 14px;
        }

        html, body {
            width: 100%;
            height: 500%;
            background: -webkit-linear-gradient(top, #11c900, lightblue, lightcoral, lightcyan, lightgoldenrodyellow, lightgreen, lightpink, lightsalmon, lightseagreen);
            background: linear-gradient(top, #11c900, lightblue, lightcoral, lightcyan, lightgoldenrodyellow, lightgreen, lightpink, lightsalmon, lightseagreen);
        }

        a {
            text-decoration: none;
            color: #00516e;
        }

        a:hover, a:active, a:visited, a:target {
            color: #00516e;
        }

        #goLink {
            position: fixed;
            bottom: 100px;
            right: 100px;
            width: 50px;
            height: 50px;
            background-color: red;
            line-height: 50px;
            text-align: center;
            border-radius: 50%;
            opacity: .4;
            display: none;
        }

        #goLink:hover {
            opacity: 1;
        }
    </style>
</head>
<body>

<a href="javascript:;" id="goLink">GO</a>


<script src="utils.js"></script>
<script type="text/javascript">
    var goLink = document.getElementById('goLink');
    window.onscroll = computed;
    goLink.onclick = function () {
        window.onscroll = null;
        this.style.display = 'none';
        var timer = window.setInterval(function () {
            var curScrollTop = utils.win('scrollTop');
            if (curScrollTop === 0) {
                window.clearInterval(timer);
                window.onscroll = computed;
            }
            curScrollTop -= curScrollTop / 10;
            utils.win('scrollTop', curScrollTop);
            console.log('ok');
        }, 10);
    };
    function computed() {
        var curTop = utils.win('scrollTop'),wHeight = utils.win('clientHeight');
        goLink.style.display = curTop > wHeight ? 'block' : 'none';
    }


</script>
</body>
</html>

附:utils.js代码文件

'use strict';
var utils = (function () {
    var isSupport = 'getComputedStyle' in window;

    /*
     * toArray:Converts an array of classes to an array
     * @parameter:
     *   likeAry[object]:Class array to convert
     * @return:
     *   ary[Array]:Convert completed array
     * By Team on 2017-04-16 12:44
     */
    function toArray(likeAry) {
        var ary = [];
        try {
            ary = Array.prototype.slice.call(likeAry);
        } catch (e) {
            for (var i = 0, len = likeAry.length; i < len; i++) {
                ary[ary.length] = likeAry[i];
            }
        }
        return ary;
    }

    /*
     * toJSON:Convert JSON string to JSON object
     * @parameter:
     *   str[String]:JSON string
     * @return:
     *   obj[Object]:JSON object
     * By Team on 2017-04-16 12:48
     */
    function toJSON(str) {
        return 'JSON' in window ? JSON.parse(str) : eval('(' + str + ')');
    }

    /*
     * win:Operating browser box model information
     */
    function win(attr, value) {
        if (typeof value === "undefined") {
            return document.documentElement[attr] || document.body[attr];
        }
        document.documentElement[attr] = value;
        document.body[attr] = value;
    }

    /*
     * getCss:Gets the value of the specific style property for the current element
     * @parameter:
     *   curEle[object]:current element
     *   attr[string]:style properties of elements
     * @return:
     *   Style attribute values for elements
     * By Team on 2017-04-23 12:29
     */
    function getCss(curEle, attr) {
        var val = null,
            reg = null;
        if (isSupport) {
            val = window.getComputedStyle(curEle, null)[attr];
        } else {
            //->IE6~8
            switch (attr) {
                case 'filter':
                case 'opacity':
                    val = curEle.currentStyle['filter'];
                    reg = /alpha(opacity=(.+))/i;
                    val = reg.test(val) ? RegExp.$1 / 100 : 1;
                    break;
                default:
                    val = curEle.currentStyle[attr];
            }
        }
        reg = /^-?d+(.d+)?(px|rem|em|pt)?$/i;
        val = reg.test(val) ? parseFloat(val) : val;
        return val;
    }

    /*
     * getCss:Set the style property value for an element,Setting inline styles for elements
     * @parameter:
     *   curEle[object]:current element
     *   attr[string]:style properties of elements
     *   value:set style property value
     * By Team on 2017-04-23 15:36
     */
    function setCss(curEle, attr, value) {
        if (attr === 'float') {
            curEle['style']['cssFloat'] = value;
            curEle['style']['styleFloat'] = value;
            return;
        }
        if (attr === 'opacity') {
            curEle['style']['opacity'] = value;
            curEle['style']['filter'] = 'alpha(opacity=' + value * 100 + ')';
            return;
        }
        var reg = /^(?:width|height|(?:(?:margin|padding)?(?:top|left|right|bottom)))$/i;
        if (reg.test(attr)) {
            !isNaN(value) ? value += 'px' : null;
        }
        curEle['style'][attr] = value;
    }

    /*
     * setGroupCss:Set the style attribute value for the batch
     * @parameter:
     *   curEle[object]:current element
     *   styleCollection[object]:style collection
     * By Team on 2017-04-23 15:36
     */
    function setGroupCss(curEle, styleCollection) {
        for (var key in styleCollection) {
            if (styleCollection.hasOwnProperty(key)) {
                setCss(curEle, key, styleCollection[key]);
            }
        }
    }

    /*
     * css:The style properties of the operating element, including the capture style, the individual settings style, and the batch settings style
     * @parameter:
     *   curEle[object]:current element
     * By Team on 2017-04-23 15:36
     */
    function css() {
        var arg = arguments;
        if (arg.length >= 3) {
            //->SET CSS
            setCss.apply(this, arg);
            return;
        }
        if (arg.length === 2 && typeof arg[1] === 'object') {
            //->SET GROUP CSS
            setGroupCss.apply(this, arg);
            return;
        }
        return getCss.apply(this, arg);
    }

    /*
     * offset:Gets the offset of the current element distance BODY
     * @parameter:
     *   curEle[object]:current element
     * @return:
     *   [object]:{top:xxx,left:xxx}
     * By Team on 2017-04-23 16:43
     */
    function offset(curEle) {
        var l = curEle.offsetLeft,
            t = curEle.offsetTop,
            p = curEle.offsetParent;
        while (p) {
            if (navigator.userAgent.indexOf('MSIE 8') === -1) {
                l += p.clientLeft;
                t += p.clientTop;
            }
            l += p.offsetLeft;
            t += p.offsetTop;
            p = p.offsetParent;
        }
        return {top: t, left: l};
    }

    /*
     * hasClass:Verify that the current element contains a single style class name
     * @parameter:
     *   curEle[object]:current element
     *   cName[string]:class name to validate
     * @return:
     *   [boolean]:true/false
     * By Team on 2017-04-29 11:16
     */
    function hasClass(curEle, cName) {
        return new RegExp('(^| +)' + cName + '( +|$)').test(curEle.className);
    }

    /*
     * hasClass:Adds a class name to the current element
     * @parameter:
     *   curEle[object]:current element
     *   strClass[string]:Need to increase the style class name, can be more than, for example:'xxx','xxx xxx', '  xxx    xxx  '...
     * By Team on 2017-04-29 11:28
     */
    function addClass(curEle, strClass) {
        strClass = strClass.replace(/(^ +| +$)/g, '').split(/ +/g);
        for (var i = 0; i < strClass.length; i++) {
            var curClass = strClass[i];
            if (!hasClass(curEle, curClass)) {
                curEle.className += ' ' + curClass;
            }
        }
    }

    /*
     * removeClass:Remove a class name to the current element
     * @parameter:
     *   curEle[object]:current element
     *   strClass[string]:Need to deleted the style class name, can be more than, for example:'xxx','xxx xxx', '  xxx    xxx  '...
     * By Team on 2017-04-29 11:44
     */
    function removeClass(curEle, strClass) {
        strClass = strClass.replace(/(^ +| +$)/g, '').split(/ +/g);
        for (var i = 0; i < strClass.length; i++) {
            var curClass = strClass[i],
                reg = new RegExp('(^| )' + curClass + '( |$)', 'g');
            hasClass(curEle, curClass) ? curEle.className = curEle.className.replace(/ /g, '  ').replace(reg, ' ') : null;
        }
        curEle.className = curEle.className.replace(/(^ +| +$)/g, '');
    }

    /*
     * toggleClass:If the passing style class name exists in the element, the delete operation is an operation
     * @parameter:
     *   curEle[object]:current element
     *   strClass[string]:class name to be operated
     * By Team on 2017-04-29 12:00
     */
    function toggleClass(curEle, strClass) {
        strClass = strClass.replace(/(^ +| +$)/g, '').split(/ +/g);
        for (var i = 0; i < strClass.length; i++) {
            var curClass = strClass[i];
            hasClass(curEle, curClass) ? removeClass(curEle, curClass) : addClass(curEle, curClass);
        }
    }

    /*
     * byClass:Gets a set of elements by the element's style class,Compatible IE low version browser
     * @parameter:
     *   strClass[string]:class name to be operated
     *   context[HTMLElementObject]:get the range, the default is document
     * @return:
     *   [Array]:All matching results
     * By Team on 2017-04-29 12:56
     */
    function byClass(strClass, context) {
        context = context || document;
        if (isSupport) {
            return toArray(context.getElementsByClassName(strClass));
        }
        //->IE6~8
        var allList = context.getElementsByTagName('*'),
            ary = [],
            reg = null;
        strClass = strClass.replace(/(^ +| +$)/g, '')
            .replace(/ +/g, '@@')
            .replace(/(?:^|@)([w-]+)(?:@|$)/g, '(?=.*(^| +)$1( +|$).*)');
        reg = new RegExp(strClass);
        for (i = 0; i < allList.length; i++) {
            var cur = allList[i];
            reg.test(cur.className) ? ary[ary.length] = cur : null;
        }
        return ary;
    }

    /*
     * children:Gets all the child nodes of the current container (element), which is filtered in all child elements, and specifies the name of the tag
     * @parameter
     *    curEle[HTMLElement]:current element
     *    tagName[string]:tag name
     * @return
     *    [array]:Collection of elements
     */
    function children(curEle, tagName) {
        var allNodes = curEle.childNodes,
            elementAry = [];
        for (var i = 0; i < allNodes.length; i++) {
            var curNode = allNodes[i];
            if (curNode.nodeType === 1) {
                var curNodeTag = curNode.tagName.toUpperCase();
                if (typeof tagName !== 'undefined') {
                    tagName = tagName.toUpperCase();
                    curNodeTag === tagName ? elementAry[elementAry.length] = curNode : null;
                    continue;
                }
                elementAry[elementAry.length] = curNode;
            }
        }
        return elementAry;
    }

    /*
     * prev:Get older brother element node
     */
    function prev(curEle) {
        if (isSupport) {
            return curEle.previousElementSibling;
        }
        var p = curEle.previousSibling;
        while (p && p.nodeType !== 1) {
            p = p.previousSibling;
        }
        return p;
    }

    /*
     * prevAll:Get all brother element node
     */
    function prevAll(curEle) {
        var ary = [],
            p = prev(curEle);
        while (p) {
            ary.unshift(p);
            p = prev(p);
        }
        return ary;
    }

    /*
     * next:Get next brother element node
     */
    function next(curEle) {
        if (isSupport) {
            return curEle.nextElementSibling;
        }
        var n = curEle.nextSibling;
        while (n && n.nodeType !== 1) {
            n = n.nextSibling;
        }
        return n;
    }

    /*
     * nextAll:Get all brother element node
     */
    function nextAll(curEle) {
        var ary = [],
            n = next(curEle);
        while (n) {
            ary.push(n);
            n = next(n);
        }
        return ary;
    }

    /*
     * siblings:Get all sibling element nodes
     */
    function siblings(curEle) {
        return prevAll(curEle).concat(nextAll(curEle));
    }

    /*
     * index:Gets the index of the current element
     */
    function index(curEle) {
        return prevAll(curEle).length;
    }

    /*
     * firstChild:Gets the first child element in the container
     */
    function firstChild(curEle) {
        if (isSupport) {
            return curEle.firstElementChild;
        }
        var first = curEle.firstChild;
        while (first && first.nodeType !== 1) {
            first = first.nextSibling;
        }
        return first;
    }

    /*
     * lastChild:Gets the last child element in the container
     */
    function lastChild(curEle) {
        if (isSupport) {
            return curEle.lastElementChild;
        }
        var last = curEle.lastChild;
        while (last && last.nodeType !== 1) {
            last = last.previousSibling;
        }
        return last;
    }

    /*
     * prepend:Add a new element to the location of the specified container
     * @parameter
     *   newEle:Newly added elements
     *   container:Specified container
     */
    function prepend(newEle, container) {
        var first = firstChild(container);
        if (first) {
            container.insertBefore(newEle, first);
            return;
        }
        container.appendChild(newEle);
    }

    /*
     * insertAfter:Add a new element to the old element
     * @parameter
     *   newEle:New elements
     *   oldEle:Original element
     */
    function insertAfter(newEle, oldEle) {
        var n = next(oldEle),
            p = oldEle.parentNode;
        if (n) {
            p.insertBefore(newEle, n);
            return;
        }
        p.appendChild(newEle);
    }

    return {
        /*--TOOL--*/
        toArray: toArray,
        toJSON: toJSON,
        win: win,

        /*--CSS OR STYLE--*/
        offset: offset,
        css: css,
        hasClass: hasClass,
        addClass: addClass,
        removeClass: removeClass,
        toggleClass: toggleClass,

        /*--GET ELEMENTS--*/
        byClass: byClass,
        children: children,
        prev: prev,
        next: next,
        prevAll: prevAll,
        nextAll: nextAll,
        siblings: siblings,
        index: index,
        firstChild: firstChild,
        lastChild: lastChild,

        /*--OPERATING ELEMENT--*/
        insertAfter: insertAfter,
        prepend: prepend
    }
})();
原文地址:https://www.cnblogs.com/Scar007/p/7724514.html