這種方法遵循不引人注目的DHTML的原則,使每個人都可以輕鬆使用。為了使解決方案工作,腳本需要由某些東西運行;我們將代碼從第一步(在鏈接上循環以找到內部的鏈接)將代碼放入函數ss_fixalllinks()中,並使用Scott Andrew的函數將其綁定到窗口的Onload事件中:
>ss_addEvent(window,"load",ss_fixAllLinks);
整個代碼看起來像這樣:
function ss_fixAllLinks() {
// Get a list of all links in the page
var allLinks = document.getElementsByTagName('a');
// Walk through the list
for (var i=0;ivar 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',smoothScroll);
}
}
}
function smoothScroll(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.nodeType == 3) {
target = target.parentNode;
}
// Paranoia; check this is an A tag
if (target.nodeName.toLowerCase() != 'a') return;
// Find the 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;ivar lnk = allLinks[i];
if (lnk.name && (lnk.name == anchor)) {
destinationLink = lnk;
break;
}
}
// 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();
}
}
function ss_scrollWindow(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;
}
}
function ss_getCurrentYPos() {
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;
}
function ss_addEvent(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;
}
}
var ss_INTERVAL;
var ss_STEPS = 25;
ss_addEvent(window,"load",ss_fixAllLinks);
>
>常見問題(常見問題解答)關於使用JavaScript平滑滾動的問題 var element = document.queryselector('#myElement'); 您可以通過在鏈接上添加“單擊”事件的事件偵聽器來實現錨鏈接的平滑滾動。如果事件處理程序,您可以防止鏈接的默認操作,即立即導航到目標元素,而是使用scrollintoview方法平滑滾動到目標元素。以下是一個示例: scrollTop: $("#myElement").offset().top Can I implement smooth scrolling with CSS instead JavaScript? 是的,您可以通過不使用scrollto或ScrollIntoview方法或設置它來設置'auto'來通過JavaScript禁用JavaScript的光滑滾動。這將使滾動瞬間而不是光滑。
emelt.scrollintoview({crathion:'smooth'smooth'});
>此代碼將平滑地滾動窗口,並使用id“ myElement”。 JavaScript得到了大多數現代瀏覽器的支持,包括Chrome,Firefox,Safari和Edge。但是,Internet Explorer不支持它。您可以查看MDN Web文檔上的兼容性表以獲取最新信息。
我可以控制光滑滾動的速度嗎?
>平滑滾動的速度由瀏覽器確定,並且不能用JavaScript直接控制。但是,您可以使用window.requestanimationframe方法來創建一個自定義的平滑滾動函數。>如何通過javaScript實現平滑滾動以進行錨鏈接?
document.queryselectorall('a [href^=“#”]')。 document.queryselector(this.getAttribute('href'))。 scrollIntoview({{
行為:'smooth'
});
});
});
});
>
此代碼將在頁面上添加平穩的scroll scrolls。
是的,使用JavaScript平滑滾動時,您可以添加滾動偏移量。您可以通過從scollto方法中的y坐標或scrollintoview方法中的y坐標中減去所需的偏移來做到這一點。
This code will smoothly scroll the window to the element with the id ‘myElement’ over a period of 2 seconds.
是的,您可以使用滾動行為屬性通過CSS實現平滑的滾動。您可以將此屬性設置為在HTML或身體元素上“平滑”,以使整個頁面平滑滾動。但是,此方法比JavaScript方法具有較少的瀏覽器支持。
如何測試光滑的滾動是否正常工作?
>您可以通過簡單地嘗試在頁面上滾動來測試平滑滾動是否正常工作。如果滾動光滑而不是瞬間,則可以正常工作。您還可以使用瀏覽器中的開發人員工具來檢查滾動行為。 我可以使用JavaScript使用JavaScript的光滑滾動嗎?
以上是用JavaScript使內部鏈接順利滾動的詳細內容。更多資訊請關注PHP中文網其他相關文章!