Плавная прокрутка к элементам

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X
#1 23 апреля 2024 в 18:17

Стоит задача сделать плавную прокрутку к элементам шаблона, как на главной странице, так и с других страниц.

Прокрутка должна быть плавной.

Ссылки в меню выглядят так, пример: /#what

Сам якорь прописан так:  <a id=«what»></a>

Добавлен скрипт:

  1. document.addEventListener('DOMContentLoaded', function() {
  2. // Получаем все ссылки с якорями на странице
  3. const anchorLinks = document.querySelectorAll('a[href^="#"]');
  4.  
  5. // Добавляем обработчик события для каждого элемента
  6. anchorLinks.forEach(link => {
  7. link.addEventListener('click', function(event) {
  8. // Предотвращаем стандартное действие ссылки
  9. event.preventDefault();
  10.  
  11. // Получаем ID элемента из href атрибута ссылки
  12. const targetId = this.getAttribute('href').substring(1);
  13. // Находим целевой элемент по ID
  14. const targetElement = document.getElementById(targetId);
  15.  
  16. // Проверяем, что целевой элемент найден
  17. if (targetElement) {
  18. // Используем scrollIntoView с параметром smooth для плавной прокрутки
  19. targetElement.scrollIntoView({ behavior: 'smooth' });
  20. }
  21. });
  22. });
  23. });

Все работает, кроме плавной прокрутки.

Подскажите пжл куда она затерялась? 😀

#2 23 апреля 2024 в 18:35

 Abobo

Сам якорь прописан так:  <a id=«what»></a>

Abobo

А должен быть так: <a id=«#what»></a>

Добавлено спустя 11 минут

И, вообще зачем вам нативный JS, если у InstantCms есть Jquery? Код получится намного меньше и красивее. То же самое что у вас можно описать так:

  1. $(document).ready(function() {
  2. $('a[href^="#"]').on('click', function(event) {
  3. var target = $(this.getAttribute('href'));
  4. if (target.length) {
  5. event.preventDefault();
  6. $('html, body').stop().animate({
  7. scrollTop: target.offset().top
  8. }, 1000);
  9. }
  10. });
  11. });

Демо можно посмотреть тут — https://checkpassword.7oz.ru кликните на пунтк меню «Активность»

#3 23 апреля 2024 в 18:54

 Abobo

Сам якорь прописан так:  <a id=«what»></a>

Abobo

А должен быть так: <a id=«#what»></a>

И, вообще зачем вам нативный JS, если у InstantCms есть Jquery? Код получится намного меньше и красивее. То же самое что у вас можно описать так:

  1. $(document).ready(function() {
  2. $('a[href^="#"]').on('click', function(event) {
  3. var target = $(this.getAttribute('href'));
  4. if (target.length) {
  5. event.preventDefault();
  6. $('html, body').stop().animate({
  7. scrollTop: target.offset().top
  8. }, 1000);
  9. }
  10. });
  11. });

Демо можно посмотреть тут — https://checkpassword.7oz.ru кликните на пунтк меню «Активность»

Foxman23

Благодарю за Ваш вариант, но у меня он что-то не работает. Ищу причину...

#4 23 апреля 2024 в 19:13

 Abobo, не работать может по множеству причин. Например — наличие фиксированного хедера или других элементов, которые могут влиять на позиционирование. Или в CSS что-то может мешать. В любом случае — ищите проблему в консоли. Мой вариант как видно, работает отлично, но на моем сайте)

#5 23 апреля 2024 в 19:23

 Abobo, не работать может по множеству причин. Например — наличие фиксированного хедера или других элементов, которые могут влиять на позиционирование. Или в CSS что-то может мешать. В любом случае — ищите проблему в консоли. Мой вариант как видно, работает отлично, но на моем сайте)

Foxman23

Поправил ссылку в меню, у меня было так прописано: /#what — это для того чтобы якорь работал с других страниц. 

Прописал просто: #what (без слеша)

Стало работать норм. Но, с других страниц теперь формируется другая ссылка, нерабочая.

На главной все ок.

С других страниц, к примру статьи где размещены — не работает...

#6 23 апреля 2024 в 19:36

 Abobo, Ну тогда нужно ваш js надо немного переписать. Примерно так:

  1. $(document).ready(function() {
  2. $('a[href^="#"]').on('click', function(event) {
  3. // Определяем, находимся ли мы на главной странице
  4. var isHomePage = window.location.pathname === '/';
  5.  
  6. // Получаем атрибут href ссылки
  7. var href = $(this).attr('href');
  8.  
  9. // Если мы не на главной странице и ссылка начинается с якоря, добавляем слеш
  10. if (!isHomePage && href.startsWith('#')) {
  11. // Полный путь для перехода на главную страницу с якорем
  12. href = '/' + href;
  13. }
  14.  
  15. // Если мы на главной странице или ссылка не начинается с якоря, используем исходный href
  16. var target = $(href);
  17.  
  18. if (target.length) {
  19. event.preventDefault();
  20. $('html, body').stop().animate({
  21. scrollTop: target.offset().top
  22. }, 1000);
  23. } else if (!isHomePage && href.startsWith('/#')) {
  24. // Если элемент не найден и мы не на главной странице, перенаправляем на главную страницу с якорем
  25. window.location.href = href;
  26. }
  27. });
  28. });
  29.  
Добавлено спустя 7 минут

Так, версия выше немного неправильная. Вот так будет правильно:

  1. $(document).ready(function() {
  2. $('a[href^="#"]').on('click', function(event) {
  3. // Определяем, находимся ли мы на главной странице
  4. var isHomePage = window.location.pathname === '/';
  5.  
  6. // Получаем атрибут href ссылки
  7. var href = $(this).attr('href');
  8.  
  9. // Если мы не на главной странице и ссылка начинается с якоря
  10. if (!isHomePage && href.startsWith('#')) {
  11. // Предотвращаем стандартное действие
  12. event.preventDefault();
  13. // Перенаправляем на главную страницу с якорем
  14. window.location.href = '/' + href;
  15. } else if (isHomePage) {
  16. // Если мы на главной странице, выполняем плавную прокрутку
  17. var target = $(href);
  18. if (target.length) {
  19. event.preventDefault();
  20. $('html, body').stop().animate({
  21. scrollTop: target.offset().top
  22. }, 1000);
  23. }
  24. }
  25. });
  26. });
#7 23 апреля 2024 в 19:40
  • $(document).ready(function() {
  • $('a[href^="#"]').on('click', function(event) {
  • // Определяем, находимся ли мы на главной странице
  • var isHomePage = window.location.pathname === '/';
  •  
  • // Получаем атрибут href ссылки
  • var href = $(this).attr('href');
  •  
  • // Если мы не на главной странице и ссылка начинается с якоря
  • if (!isHomePage && href.startsWith('#')) {
  • // Предотвращаем стандартное действие
  • event.preventDefault();
  • // Перенаправляем на главную страницу с якорем
  • window.location.href = '/' + href;
  • } else if (isHomePage) {
  • // Если мы на главной странице, выполняем плавную прокрутку
  • var target = $(href);
  • if (target.length) {
  • event.preventDefault();
  • $('html, body').stop().animate({
  • scrollTop: target.offset().top
  • }, 1000);
  • }
  • }
  • });
  • });
Foxman23

Спасибо огромное, это то что нужно! Замечательно работает 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 

#8 23 апреля 2024 в 20:44

А можно добавить в стили scroll-behavior developer.mozilla.org/ru/docs/Web/CSS/scroll-behavior и не мучаться… Работать будет на всех ссылках с якорями.

#9 23 апреля 2024 в 20:46

 Zau4man, у ТС несколько страниц на сайте, и с других страниц должен быть переход на главную к блоку #test, который доступен только на главной. Без js тут не выкрутиться

#10 23 апреля 2024 в 22:04

 Foxman23, кликните по Контакты в меню тут demo.zau4man.ru/applicants.html

Переместитесь на главную к блоку Контакты.

И все это благодаря одной строчке

  1. html{scroll-behavior: smooth;}
#11 23 апреля 2024 в 22:10

 Zau4man, вы от меня чего хотите? Да, круто — работает. Но у ТС с самого первого сообщения был вопрос — как сделать на js. Я посоветовала как и привела примеры. Я что-то неправильно сделала? Или вы пытаетесь намекнуть что я глупая, и даю в корне неверные советы?

#12 24 апреля 2024 в 07:06

 Foxman23, в своем первом сообщении я обращался к автору темы. Но вы утвердительно отвергли идею

Без js тут не выкрутиться

Я всего лишь привел рабочий пример.

вы пытаетесь намекнуть

Ничего не пытаюсь. Моё сообщение было к тс. На его некорректность указали вы...

#13 24 апреля 2024 в 08:06

 Zau4man, в вашем первом сообщении непонятно, к кому вы обращаетесь, так что, если неправильно вас поняла, прошу извинить

#14 24 апреля 2024 в 08:29

Или вы пытаетесь намекнуть что я глупая, и даю в корне неверные советы?

Foxman23

Глупых людей не бывает :))) На самом деле решение от Заучмена, простое и лаконичное, я вот например не совсем понял ТС зачем ему решение на JS, хотя может там есть специфика.

#15 24 апреля 2024 в 19:38

Всем спасибо!

Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.