Skip to content

feat(#1932): implement smooth scrolling for anchor navigation across site #1965

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: gh-pages
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions js/app.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,56 @@
$(function(){
var doc = $(document);

// Configuration for smooth scrolling
var scrollDuration = 500;
var headerOffset = 120;

// Smooth scroll function
function smoothScrollToElement(target) {
var $target = $(target);

// Handle IDs with dots (like express.urlencoded)
if (!$target.length && typeof target === 'string' && target.indexOf('.') > -1) {
var targetId = target.replace('#', '');
$target = $('[id="' + targetId + '"]');
}

if ($target.length) {
$('html, body').animate({
scrollTop: $target.offset().top - headerOffset
}, scrollDuration);
return true;
}
return false;
}

// top link
$('#top').click(function(e){
$('html, body').animate({scrollTop : 0}, 500);
return false;
});

// Smooth scrolling for all anchor links
$(document).on('click', 'a[href^="#"]:not([href="#"]):not([href="#top"])', function(e) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
$(document).on('click', 'a[href^="#"]:not([href="#"]):not([href="#top"])', function(e) {
$("#api-doc").on('click', 'a[href^="#"]:not([href="#"]):not([href="#top"])', function(e) {

We should minimize the scope of this click event. Currently, $(document).on('click'...) attaches the handler to all anchor links with # across every page. However, smooth scrolling is only needed on API pages, since the TOC exists only there. Scoping it to #api-doc avoids unnecessary event handling and prevents inconsistent anchor # behavior on other pages. Also, checking "#api-doc" exist on page is required before applying click event.

var href = $(this).attr('href');
if (smoothScrollToElement(href)) {
e.preventDefault();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please remove this line https://github.com/expressjs/expressjs.com/blob/gh-pages/js/menu.js#L186 ? Since default behavior stopped here.

// Update URL after scroll
if (history.pushState) {
history.pushState(null, null, href);
}
}
});

// Handle direct hash navigation on page load
$(window).on('load', function() {
if (window.location.hash) {
setTimeout(function() {
smoothScrollToElement(window.location.hash);
}, 300);
}
});

// scrolling links
var added;
doc.scroll(function(e){
Expand Down
Loading