// ==UserScript==
// @name Scroll To Top
// @namespace sunnylost
// @include http://*
// @include https://*
// ==/UserScript==
(function(global) {
if(global !== window) return;
function bind(context, name) {
return function() {
return context[name].apply(context, arguments);
}
}
global.addEventListener('scroll', scrollHandler, false);
function scrollHandler() {
if(!scroll.isScrolling) {
(scroll.getScrollY() > 0) ? scroll.show() : scroll.hide();
}
}
var scroll = {
_scrollY : 0,
isScrolling : false, //is scrolling
imgBtn : null,
closeBtn : null,
create : function() {
var div = global.document.createElement('div');
var css = '#_scrollToTop{position:fixed;display:none;left:90%;top:80%;text-align:center;z-index:999999; width:50px;height:50px;cursor:pointer;opacity:0.5;} #_scrollToTop:hover{opacity:1;} #_scrollToTop a{text-decoration:none;} #_scrollToTop span._arrow{background:none repeat scroll 0 0 #eee;border-style:solid; border-width:1px;border-color:#ccc #ccc #aaa; border-radius:5px;color:#333;font-size:36px;padding:5px 10px;} #_scrollToTop span._close {background:repeat scroll #548b02;position:absolute;top:-15px;right:-15px;border-radius:15px;border:1px solid #ccc;width:15px;height:15px;font-size:12px;text-align:center;visibility:hidden;}';
GM_addStyle(css);
div.id = '_scrollToTop';
div.title = 'Back To Top';
div.innerHTML = '<span class="_close" title="hide this button">×</span><span class="_arrow">▲</span>';
document.body.appendChild(div);
div.addEventListener('click', bind(this, 'scrollToTop'),false);
div.addEventListener('mouseover', bind(this, 'mouseOver'),false);
div.addEventListener('mouseout', bind(this, 'mouseOut'),false);
return this.imgBtn = div;
},
getImgBtn : function() {
return this.imgBtn || this.create();
},
getCloseBtn : function() {
return this.closeBtn || (this.closeBtn = this.getImgBtn().getElementsByTagName('span')[0]);
},
show : function() {
this.getImgBtn().style.display = 'block';
},
hide : function() {
this.getImgBtn().style.display = 'none';
},
mouseOver : function() {
this.getCloseBtn().style.visibility = 'visible';
},
mouseOut : function() {
this.getCloseBtn().style.visibility = 'hidden';
},
getScrollY : function() {
//this piece of code is from John Resig's book 'Pro JavaScript Techniques'
var de = document.documentElement;
return this._scrollY = (self.pageYOffset ||
( de && de.scrollTop ) ||
document.body.scrollTop);
},
scrollToTop : function(e) {
if(e && e.target && e.target.getAttribute('class') === '_close') {
//e.preventDefault();
this.hide();
global.removeEventListener('scroll', scrollHandler, false);
return false;
} else {
if(!this.isScrolling) {
this.isScrolling = true;
}
this._scrollY -= 150;
global.scrollTo(0, this._scrollY);
if(this._scrollY > 0) {
setTimeout(bind(scroll, 'scrollToTop'), 20);
} else {
this.isScrolling = false;
}
}
}
}
}(window.top))
|