发新文章了,但却不是如上篇文章所说的介绍 jQuery 判断外部链接并新窗口打开的方法。
主要是昨天看到这段代码的时候有点小兴奋,想尽快跟大家分享下,至于那篇文章就下一次再发吧!!
这篇文章的题目还真想了不少,不知道用什么词比较好。现在写出来想必大家都能理解吧,就是在同一页面内的锚链接,也就是带有 # 的链接了,能实现平滑移动到相应的位置,而不是直接跳转,效果就如同本站在文章页点击 Goto comments , Leave a comment 的效果一样,大家也可以点击下试下。当然此代码的强大在于不需要你做另外其它的设置,自动实现所有锚链接的效果。你可以随便 Go top , Go footer,只须将对象的 ID 前面加 # 作为链接对象即可。而且可以自定义滑动的时间。
另外用了 mail to commenter 插件的博客,当有人回复时就会有一个链接链向原来的评论,而这个链接就是锚链接,这时也来个平滑移动,效果应该不错,哈哈!!
看下官方是如何描述这个 JS 的。
Changes links that link to other parts of this page to scroll smoothly to those links rather than jump to them directly, which can be a little disorienting.
怎么样,还不错吧,现在上代码,代码中作者也做了比较详细的注释:
Changes links that link to other parts of this page to scroll
smoothly to those links rather than jump to them directly, which
can be a little disorienting.
sil, http://www.kryogenix.org/
v1.0 2003-11-11
v1.1 2005-06-16 wrap it up in an object
*/
var ss = {
fixAllLinks: function() {
// Get a list of all links in the page
var allLinks = document.getElementsByTagName('a');
// Walk through the list
for (var i=0;i<allLinks.length;i++) {
var lnk = allLinks[i];
if ((lnk.href && lnk.href.indexOf('#') != -1) &&
( (lnk.pathname == location.pathname) ||
('/'+lnk.pathname == location.pathname) ) &&
(lnk.search == location.search)) {
// If the link is internal to the page (begins in #)
// then attach the smoothScroll function as an onclick
// event handler
ss.addEvent(lnk,'click',ss.smoothScroll);
}
}
},
smoothScroll: function(e) {
// This is an event handler; get the clicked on element,
// in a cross-browser fashion
if (window.event) {
target = window.event.srcElement;
} else if (e) {
target = e.target;
} else return;
// Make sure that the target is an element, not a text node
// within an element
if (target.nodeName.toLowerCase() != 'a') {
target = target.parentNode;
}
// Paranoia; check this is an A tag
if (target.nodeName.toLowerCase() != 'a') return;
// Find the <a name> tag corresponding to this href
// First strip off the hash (first character)
anchor = target.hash.substr(1);
// Now loop all A tags until we find one with that name
var allLinks = document.getElementsByTagName('a');
var destinationLink = null;
for (var i=0;i<allLinks.length;i++) {
var lnk = allLinks[i];
if (lnk.name && (lnk.name == anchor)) {
destinationLink = lnk;
break;
}
}
if (!destinationLink) destinationLink = document.getElementById(anchor);
// If we didn't find a destination, give up and let the browser do
// its thing
if (!destinationLink) return true;
// Find the destination's position
var destx = destinationLink.offsetLeft;
var desty = destinationLink.offsetTop;
var thisNode = destinationLink;
while (thisNode.offsetParent &&
(thisNode.offsetParent != document.body)) {
thisNode = thisNode.offsetParent;
destx += thisNode.offsetLeft;
desty += thisNode.offsetTop;
}
// Stop any current scrolling
clearInterval(ss.INTERVAL);
cypos = ss.getCurrentYPos();
ss_stepsize = parseInt((desty-cypos)/ss.STEPS);
ss.INTERVAL =setInterval('ss.scrollWindow('+ss_stepsize+','+desty+',"'+anchor+'")',10);
// And stop the actual click happening
if (window.event) {
window.event.cancelBubble = true;
window.event.returnValue = false;
}
if (e && e.preventDefault && e.stopPropagation) {
e.preventDefault();
e.stopPropagation();
}
},
scrollWindow: function(scramount,dest,anchor) {
wascypos = ss.getCurrentYPos();
isAbove = (wascypos < dest);
window.scrollTo(0,wascypos + scramount);
iscypos = ss.getCurrentYPos();
isAboveNow = (iscypos < dest);
if ((isAbove != isAboveNow) || (wascypos == iscypos)) {
// if we've just scrolled past the destination, or
// we haven't moved from the last scroll (i.e., we're at the
// bottom of the page) then scroll exactly to the link
window.scrollTo(0,dest);
// cancel the repeating timer
clearInterval(ss.INTERVAL);
// and jump to the link directly so the URL's right
location.hash = anchor;
}
},
getCurrentYPos: function() {
if (document.body && document.body.scrollTop)
return document.body.scrollTop;
if (document.documentElement && document.documentElement.scrollTop)
return document.documentElement.scrollTop;
if (window.pageYOffset)
return window.pageYOffset;
return 0;
},
addEvent: function(elm, evType, fn, useCapture) {
// addEvent and removeEvent
// cross-browser event handling for IE5+, NS6 and Mozilla
// By Scott Andrew
if (elm.addEventListener){
elm.addEventListener(evType, fn, useCapture);
return true;
} else if (elm.attachEvent){
var r = elm.attachEvent("on"+evType, fn);
return r;
} else {
alert("Handler could not be removed");
}
}
}
ss.STEPS = 100; //设置滑动时间
ss.addEvent(window,"load",ss.fixAllLinks);


















加上这个效果都点Mail to Commenter的链接貌似会直接跳跃,然后在滑动一阵子。可能是因为我主题的原因,上一个主题都没有这个现象。。
@stephen 看到你的新模版了,呵呵,很不错哈!
可能是你 reply JS代码的问题,我点了下面的评论那里滑动是没问题的哈!你在JS
JS中是不是让评论框取得焦点了?
@xiaorsz 对就是Mail to Commenter那里有点问题,上面的add comment是完全OK的。
他的插件代码我没有修改过啊,我的模板是直接使用sandbox,comment模板也是直接用里面的,难带是sandbox模板有问题??“让评论框取得焦点”这个我不是很懂啊。。。
@stephen 噢,你直接用了 Mail to Commenter 啊,那就会有问题了。如果想平滑移动,恐怕要改些它的代码才可以,或是你直接用jQuyer实现,呵呵!我这里是延迟了一秒才获得焦点的,就是鼠标指针停在了留言框里!对了,你的样式是模仿的还是自己的设计的哈?!
@xiaorsz 原来是这样的,我做这个主题只有一样背景图片是直接拷贝别人的,布局是自己设计的,呵呵。。。瞎搞。。
这个有个缺点,不同距离的滑动时间一样,有的短的效果并不好,而太长的又太快
还是底下那个TOP的代码比较优秀一点
怎么用,上传到wp-admin/js中就行了吗?我的评论也有#的,可就是没滑动效果,,
[...] 譬如您可以点击标题栏右侧的"Leave a Comment"按钮,感谢xiaorsz滴分享. [...]
[...] 这个插件后台可以自定义评论回复按钮的样式和邮件通知的样式,后台功能有点像偶爱偶家的WordPress Thread Comment,但它们又不是同一个概念的东西。如果使用Mail To Commenter插件,推荐大家再配上XIAORSZ的Smooth.js文件,可以在点击回复后平滑的跳到底部评论栏。(VIA:分享 JS 代码:同一页面链接平滑跳转) [...]
[...] 今天我也来分享一个jQuery实现站内scoll to的滑动效果,之前yinheli和xiaorsz分别写过一篇页面内锚点平滑移动 和分享 JS 代码:同一页面链接平滑跳转有兴趣的朋友可以移步看看。 [...]