Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   проблема реализации плавного скролла по id в меню сайта (https://javascript.ru/forum/dom-window/77473-problema-realizacii-plavnogo-skrolla-po-id-v-menyu-sajjta.html)

ichor 11.05.2019 10:56

проблема реализации плавного скролла по id в меню сайта
 
Добрый день! Я новичок JS. Прошу помочь в поиске варианта реализации перехода по href на указанный id с плавным скроллом. Я нашел и внедрил в сайт следующий скрипт:

function filterPath(string) {
			  return string.replace(/^\//,'').replace(/(index|default).[a-zA-Z]{3,4}$/,'').replace(/\/$/,'');
			}
		
		var locationPath = filterPath(location.pathname);
		
				$('a[href*=#]').each(function() {
				  var thisPath = filterPath(this.pathname) || locationPath;
					  if (locationPath == thisPath && (location.hostname == this.hostname || !this.hostname) && this.hash.replace(/#/,'')) {
						var $target = $(this.hash), target = this.hash;
							if (target) {
								  $(this).click(function(event) {

									event.preventDefault();
									var targetOffset = $target.offset().top;
										$('html, body').animate({scrollTop: targetOffset}, 1000, 'easeInOutSine', function() {
										  location.hash = target;
										});
								  });
							}
					  }
				});


этот вариант работает, в стандартном варианте. Но мне надо чтобы страница по # не "докручивалась" на 60 px до верха страницы. Я попробовал внести изменения: location.hash = target - 60 и var targetOffset = $target.offset().top - 60. Скрипт заработал корректно, но в адресной строке браузера пропадает название id и пишет http://домен/#NaN, а надо, к примеру, http://домен/#contacts. Заранее спасибо.

ichor 14.05.2019 20:33

неужели сложно помочь? столько просмотров и ни одной мысли (((

рони 14.05.2019 20:44

Цитата:

Сообщение от ichor
var targetOffset = $target.offset().top - 60

это должно работать.

ichor 14.05.2019 22:53

не поможет, после скролла до # - 60 в конце перебрасывает все-равно на #. срабатывает location.hash = target.

рони 14.05.2019 23:58

Цитата:

Сообщение от ichor
location.hash = target.

history.pushState(null, null, target);

nikoshot 15.05.2019 13:26

Попробуй вот это код.. только замени свой клас блока где твое меню..
 
//ancor
        $(document).ready(function() {
            $(".menu .menu_item").on("click", "a", function(event) {
                //отменяем стандартную обработку нажатия по ссылке
                event.preventDefault();

                //забираем идентификатор бока с атрибута href
                var id = $(this).attr('href'),

                    //узнаем высоту от начала страницы до блока на который ссылается якорь
                    top = $(id).offset().top;

                //анимируем переход на расстояние - top за 1500 мс
                if (window.innerWidth <= 768) {
                    $('body,html').animate({
                        scrollTop: top - 50
                    }, 1500);
                } else {
                    $('body,html').animate({
                        scrollTop: top + 50 + 'px'
                    }, 1500);
                }
                $('.menu, .main').removeClass('open');
            });
        });

ichor 04.07.2019 22:59

Рони, спасибо! заработало


Часовой пояс GMT +3, время: 03:04.