Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сохранение информации при переходе на другую старинцу (https://javascript.ru/forum/misc/86057-sokhranenie-informacii-pri-perekhode-na-druguyu-starincu.html)

Сергей Ракипов 23.08.2024 10:08

Сохранение информации при переходе на другую старинцу
 
У меня есть вот такой скрипт

document.addEventListener('DOMContentLoaded', function () {
      // Находим все ссылки с классом anchor_link
      var links = document.querySelectorAll('.anchor_link');

      // Добавляем обработчик событий на каждую ссылку
      links.forEach(function (link) {
        link.addEventListener('click', function (event) {
          // Получаем href ссылки
          var href = this.getAttribute('href');

          // Проверяем, является ли ссылка абсолютной или относительной (переход на другую страницу)
          if (href.startsWith('#')) {
            // Отменяем стандартное поведение ссылки
            event.preventDefault();

            // Получаем ID якоря из атрибута href ссылки
            var targetId = href;
            var targetElement = document.querySelector(targetId);

            // Проверяем, существует ли элемент с данным ID
            if (targetElement) {
              // Расчитываем позицию элемента относительно верхней части документа
              var targetPosition = targetElement.getBoundingClientRect().top + window.scrollY;

              // Вычисляем новую позицию с отступом 60 пикселей
              var offsetPosition = targetPosition - 60;

              // Вызов функции для плавной прокрутки
              smoothScrollTo(offsetPosition);
            }
          } else {
            // Если это не якорная ссылка, просто переходим по адресу
            window.location.href = href;
          }
        });
      });

      function smoothScrollTo(targetPosition) {
        const startPosition = window.scrollY;
        const distance = targetPosition - startPosition;
        const duration = 500; // Длительность анимации в миллисекундах
        let startTime = null;

        function animation(currentTime) {
          if (!startTime) startTime = currentTime;
          const timeElapsed = currentTime - startTime;
          const progress = Math.min(timeElapsed / duration, 1); // Нормализуем значение от 0 до 1

          // Используем функцию easing (к примеру, easeInOutQuad)
          const easing = easeInOutQuad(progress);

          window.scrollTo(0, startPosition + distance * easing);

          if (timeElapsed < duration) {
            requestAnimationFrame(animation);
          }
        }

        // Начинаем анимацию
        requestAnimationFrame(animation);
      }

      function easeInOutQuad(t) {
        return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
      }
    });


<p><a href="sample.html#a" class="anchor_link">ссылка1</a></p>
    <p><a href="sample.html#d" class="anchor_link">ссылка2</a></p>
    <p><a href="#c3" class="anchor_link">ссылка3</a></p>
    <p><a href="#d4" class="anchor_link">ссылкаd</a></p>
    <p><a href="#e5" class="anchor_link">ссылкаe</a></p>


И мне нужно что бы при переходе на другую страницу отступ от верхней границы браузера сохранялся в 60 пиксилей.

Я пробывал записывать в локам стендж и потом затирать его но не получилось по другому не понимаю как.

Aetae 23.08.2024 16:15

Во-первых: пропиши своим ссылкам scroll-margin-top:
.anchor_link[href^="#"] {
  scroll-margin-top: 60px;
}

Возможно это решит твою проблему. Но если нет - опиши подробнее чего ты хочешь?

Чтобы при переходе скроллило к той же секции что была на предыдущей странице? Или чтобы по умолчанию любая страница открывалась проскроленной на 60px? Или ещё что?

Сергей Ракипов 24.08.2024 01:36

Нужно что когда идет переход по ссылки с якорь (по умолчанию якорь прижмет к верхней страницы браузера) нужно что бы было проскроленный отступ в 60 пиксилей. Объясню зачем у меня блок который фиксированный в top в 60 пикселей и когда идет переход это фиксированный блок перекрывает. Делать отступ не вариант так как у меня может быть сплошной текст и нужно что бы была ссылка на конкретное слов в тексте.

Aetae 24.08.2024 03:33

scroll-margin-top
как раз задаёт отступ от верхней границы браузера при скролле к якорю. Я таки тупанул, надо его, конечно, не к ссылкам применять, а к самим якорям.

<body>
<style>
.fixed {
  top: 0;
  left: 0;
  height: 60px;
  width: 100%;
  position: sticky; 

  background: #f00;
  display: flex;
  align-items: center;
  justify-content: center;
  -webkit-text-fill-color: #fff;;
}
:root {
  scroll-behavior: smooth;
}
.anchor { 
  scroll-margin-top: 60px;
}
/* 
или просто
* { 
  scroll-behavior: smooth;
  scroll-margin-top: 60px;
}
*/
</style>
<div class="fixed">
  <a href="#word">go to anchor</a>
</div>
<hr style="height:1000px" />
<span id="word" class="anchor">слово</span>
<hr style="height:1000px" />

Сергей Ракипов 25.08.2024 05:15

Aetae,
Спасибо


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