javascript - Auto scroll (horizontally) is not happening to show the active anchor link when too many links are present -
i have many anchor links in navigation , different sections corresponding it. on scrolling top bottom or bottom top intended link sets active. working fine. if active link not present in visible menu (hides off limits) menu link not visible. have attached screenshot of menu , code i'm using. please suggest.
thanks lot in advance
var scrolltop = $(window).scrolltop(); $(document).ready(function() { if($('.pn-productnav_wrapper').length >0 ){ var stickynavtop = $('.pn-productnav_wrapper').offset().top; var stickynav = function(){ var scrolltop = $(window).scrolltop(); if (scrolltop > stickynavtop) { $('#sticky').addclass('sticky1'); $('.mainsectionpad').addclass('sectiontop'); } else { $('#sticky').removeclass('sticky1'); $('.mainsectionpad').removeclass('sectiontop'); } }; stickynav(); $(window).on('scroll', function() { stickynav(); pagescrollingup(); }); } }); function pagescrollingup(){ if( /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.useragent) ) { $('a.page-scroll').bind('click', function(event) { var $anchor = $(this); $('html, body').stop().animate({ scrolltop: $($anchor.attr('href')).offset().top-150 }, 1500); event.preventdefault(); }); } else{ $('a.page-scroll').bind('click', function(event) { var $anchor = $(this); $('html, body').stop().animate({ scrolltop: $($anchor.attr('href')).offset().top-90 }, 1500); event.preventdefault(); }); } } var settings = { navbartravelling: false, navbartraveldirection: "", navbartraveldistance: 150 } document.documentelement.classlist.remove("no-js"); document.documentelement.classlist.add("js"); // out advancer buttons var pnadvancerleft = document.getelementbyid("pnadvancerleft"); var pnadvancerright = document.getelementbyid("pnadvancerright"); var pnproductnav = document.getelementbyid("pnproductnav"); var pnproductnavcontents = document.getelementbyid("pnproductnavcontents"); if($('#pnproductnav').length >0 ) { pnproductnav.setattribute("data-overflowing", determineoverflow(pnproductnavcontents, pnproductnav)); // handle scroll of horizontal container var last_known_scroll_position = 0; var ticking = false; function dosomething(scroll_pos) { pnproductnav.setattribute("data-overflowing", determineoverflow(pnproductnavcontents, pnproductnav)); } pnproductnav.addeventlistener("scroll", function() { last_known_scroll_position = window.scrolly; if (!ticking) { window.requestanimationframe(function() { dosomething(last_known_scroll_position); ticking = false; }); } ticking = true; }); pnadvancerleft.addeventlistener("click", function() { // if in middle of move return if (settings.navbartravelling === true) { return; } // if have content overflowing both sides or on left if (determineoverflow(pnproductnavcontents, pnproductnav) === "left" || determineoverflow(pnproductnavcontents, pnproductnav) === "both") { // find how far panel has been scrolled var availablescrollleft = pnproductnav.scrollleft; // if space available less 2 lots of our desired distance, move whole amount // otherwise, move amount in settings if (availablescrollleft < settings.navbartraveldistance * 2) { pnproductnavcontents.style.transform = "translatex(" + availablescrollleft + "px)"; } else { pnproductnavcontents.style.transform = "translatex(" + settings.navbartraveldistance + "px)"; } // want transition (this set in css) when moving remove class prevent pnproductnavcontents.classlist.remove("pn-productnav_contents-no-transition"); // update our settings settings.navbartraveldirection = "left"; settings.navbartravelling = true; } // update attribute in dom pnproductnav.setattribute("data-overflowing", determineoverflow(pnproductnavcontents, pnproductnav)); }); pnadvancerright.addeventlistener("click", function() { // if in middle of move return if (settings.navbartravelling === true) { return; } // if have content overflowing both sides or on right if (determineoverflow(pnproductnavcontents, pnproductnav) === "right" || determineoverflow(pnproductnavcontents, pnproductnav) === "both") { // right edge of container , content var navbarrightedge = pnproductnavcontents.getboundingclientrect().right; var navbarscrollerrightedge = pnproductnav.getboundingclientrect().right; // know how space have available scroll var availablescrollright = math.floor(navbarrightedge - navbarscrollerrightedge); // if space available less 2 lots of our desired distance, move whole amount // otherwise, move amount in settings if (availablescrollright < settings.navbartraveldistance * 2) { pnproductnavcontents.style.transform = "translatex(-" + availablescrollright + "px)"; } else { pnproductnavcontents.style.transform = "translatex(-" + settings.navbartraveldistance + "px)"; } // want transition (this set in css) when moving remove class prevent pnproductnavcontents.classlist.remove("pn-productnav_contents-no-transition"); // update our settings settings.navbartraveldirection = "right"; settings.navbartravelling = true; } // update attribute in dom pnproductnav.setattribute("data-overflowing", determineoverflow(pnproductnavcontents, pnproductnav)); }); pnproductnavcontents.addeventlistener( "transitionend", function() { // value of transform, apply current scroll position (so scroll pos first) , remove transform var styleoftransform = window.getcomputedstyle(pnproductnavcontents, null); var tr = styleoftransform.getpropertyvalue("-webkit-transform") || styleoftransform.getpropertyvalue("transform"); // if there no transition want default 0 , not null var amount = math.abs(parseint(tr.split(",")[4]) || 0); pnproductnavcontents.style.transform = "none"; pnproductnavcontents.classlist.add("pn-productnav_contents-no-transition"); // lets set scroll position if (settings.navbartraveldirection === "left") { pnproductnav.scrollleft = pnproductnav.scrollleft - amount; } else { pnproductnav.scrollleft = pnproductnav.scrollleft + amount; } settings.navbartravelling = false; }, false ); // handle setting active link pnproductnavcontents.addeventlistener("click", function(e) { var links = [].slice.call(document.queryselectorall(".pn-productnav_link")); links.foreach(function(item) { item.setattribute("aria-selected", "false"); }) e.target.setattribute("aria-selected", "true"); }) function determineoverflow(content, container) { var containermetrics = container.getboundingclientrect(); var containermetricsright = math.floor(containermetrics.right); var containermetricsleft = math.floor(containermetrics.left); var contentmetrics = content.getboundingclientrect(); var contentmetricsright = math.floor(contentmetrics.right); var contentmetricsleft = math.floor(contentmetrics.left); if (containermetricsleft > contentmetricsleft && containermetricsright < contentmetricsright) { return "both"; } else if (contentmetricsleft < containermetricsleft) { return "left"; } else if (contentmetricsright > containermetricsright) { return "right"; } else { return "none"; } } }[enter image description here][1] [1]: https://i.stack.imgur.com/bn0yi.png
Comments
Post a Comment