Подтвердить что ты не робот

Плавные ссылки привязки прокрутки БЕЗ jQuery

Можно ли использовать гладкую прокрутку для ссылок привязки, но без jQuery? Я создаю новый сайт, и я не хочу использовать jQuery.

4b9b3361

Ответ 1

Используя функцию здесь: анимацию JavaScript и изменив ее, чтобы изменить свойство (не только свойство стиля), вы можете попробовать что-то вроде этого:

function animate(elem, style, unit, from, to, time, prop) {
    if (!elem) {
        return;
    }
    var start = new Date().getTime(),
        timer = setInterval(function () {
            var step = Math.min(1, (new Date().getTime() - start) / time);
            if (prop) {
                elem[style] = (from + step * (to - from))+unit;
            } else {
                elem.style[style] = (from + step * (to - from))+unit;
            }
            if (step === 1) {
                clearInterval(timer);
            }
        }, 25);
    if (prop) {
          elem[style] = from+unit;
    } else {
          elem.style[style] = from+unit;
    }
}

window.onload = function () {
    var target = document.getElementById("div5");
    animate(document.scrollingElement || document.documentElement, "scrollTop", "", 0, target.offsetTop, 2000, true);
};

DEMO: https://jsfiddle.net/zpu16nen/

Удостоверьтесь, что размер окна достаточно маленький, поэтому на самом деле есть полоса прокрутки и может прокручиваться до 5-го div.

И нет, это не требовало воссоздания 25% jQuery.

Это, очевидно, очень сильно изменилось в зависимости от того, что на самом деле означает ваш вопрос (например, когда изменяется хэш окна или что-то в этом роде).

Обратите внимание, что с jQuery это легко:

$(document).ready(function () {
    $("html, body").animate({
        scrollTop: $("#div5").offset().top
    }, 2000);
});

DEMO: http://jsfiddle.net/7TAa2/1/

Просто сказать...

Ответ 2

Расширение этого ответа: fooobar.com/questions/33843/...

После определения вашей функции scrollTo вы можете передать элемент, который хотите прокрутить в функции.

function scrollTo(element, to, duration) {
    if (duration <= 0) return;
    var difference = to - element.scrollTop;
    var perTick = difference / duration * 10;

    setTimeout(function() {
        element.scrollTop = element.scrollTop + perTick;
        if (element.scrollTop === to) return;
        scrollTo(element, to, duration - 10);
    }, 10);
}

Если у вас есть div с id = "footer"

<div id="footer" class="categories">…</div>

В script, который вы запускаете для прокрутки, вы можете запустить это,

elmnt = document.getElementById("footer");
scrollTo(document.body, elmnt.offsetTop, 600);

И у вас это есть. Плавная прокрутка без jQuery. Вы можете поиграть с этим кодом на консоли своего браузера и настроить его по своему вкусу.

Ответ 3

На самом деле, есть более легкий и простой способ сделать это: https://codepen.io/ugg0t/pen/mqBBBY

function scrollTo(element) {
  window.scroll({
    behavior: 'smooth',
    left: 0,
    top: element.offsetTop
  });
}

document.getElementById("button").addEventListener('click', () => {
  scrollTo(document.getElementById("8"));
});
div {
  width: 100%;
  height: 200px;
  background-color: black;
}

div:nth-child(odd) {
  background-color: white;
}

button {
  position: absolute;
  left: 10px;
  top: 10px;
}
<div id="1"></div>
<div id="2"></div>
<div id="3"></div>
<div id="4"></div>
<div id="5"></div>
<div id="6"></div>
<div id="7"></div>
<div id="8"></div>
<div id="9"></div>
<div id="10"></div>
<button id="button">Button</button>

Ответ 4

Использовать этот:

let element = document.getElementById("box");

element.scrollIntoView();
element.scrollIntoView(false);
element.scrollIntoView({block: "end"});
element.scrollIntoView({behavior: "instant", block: "end", inline: "nearest"});

ДЕМО: https://jsfiddle.net/anderpo/x8ucc5ak/1/

Ответ 5

Переходы CSS3 с селектором :target могут дать хороший результат без взлома JS. Я просто размышлял над тем, следует ли это делать, но без JQuery он становится немного грязным. Подробнее см. этот вопрос.

Ответ 7

Вариант Vanilla js с использованием requestAnimationFrame с упрощениями и всеми поддерживаемыми браузерами:

const requestAnimationFrame = window.requestAnimationFrame ||
    window.webkitRequestAnimationFrame ||
    window.mozRequestAnimationFrame ||
    window.oRequestAnimationFrame ||
    window.msRequestAnimationFrame;

function scrollTo(to) {
    const start = window.scrollY || window.pageYOffset
    const time = Date.now()
    const duration = Math.abs(start - to) / 3;

    (function step() {
        var dx = Math.min(1, (Date.now() - time) / duration)
        var pos = start + (to - start) * easeOutQuart(dx)

        window.scrollTo(0, pos)

        if (dx < 1) {
            requestAnimationFrame(step)
        }
    })()
}

Любое смягчение поддерживается!

Ответ 8

Моя любимая библиотека для прокрутки в настоящее время - Zenscroll из-за широкого спектра функций и небольшого размера (в настоящее время только 3,17 КБ).

В будущем, возможно, будет более целесообразно использовать встроенную функциональность scrollIntoView, но, поскольку сегодня на большинстве производственных площадок ее придется заполнять по причине отсутствия поддержки IE, я рекомендую использовать Zenscroll вместо этого во всех случаях.

Ответ 9

Поведение Smooth Scroll с полифиллом...

Пример:

document.querySelectorAll('a[href^="#"]').addEventListener("click", function(event) {
  event.preventDefault();
  document.querySelector(this.getAttribute("href")).scrollIntoView({ behavior: "smooth" });
});

Репозиторий: https://github.com/iamdustan/smoothscroll

Ответ 10

вы можете использовать эту библиотеку javascript, чтобы добавить плавную прокрутку ко всем вашим внутренним ссылкам. Вы также можете добавить конфигурацию, чтобы обеспечить ссылки для игнорирования. У вас может быть подробный обзор. https://codingninjascodes.github.io/SmoothScrollJs/

Ответ 11

Это обновленная версия от @Ian

// Animated scroll with pure JS
// duration constant in ms
const animationDuration = 600;
// scrollable layout
const layout = document.querySelector('main');
const fps = 12;  // in ms per scroll step, less value - smoother animation
function scrollAnimate(elem, style, unit, from, to, time, prop) {
    if (!elem) {
        return;
    }
    var start = new Date().getTime(),
        timer = setInterval(function () {
            var step = Math.min(1, (new Date().getTime() - start) / time);
            var value =  (from + step * (to - from)) + unit;
            if (prop) {
                elem[style] = value;
            } else {
                elem.style[style] = value;
            }
            if (step === 1) {
                clearInterval(timer);
            }
        }, fps);
    if (prop) {
        elem[style] = from + unit;
    } else {
        elem.style[style] = from + unit;
    }
}

function scrollTo(hash) {
    const target = document.getElementById(hash);
    const from = window.location.hash.substring(1) || 'start';
    const offsetFrom = document.getElementById(from).offsetTop;
    const offsetTo = target.offsetTop;
    scrollAnimate(layout,
        "scrollTop", "", offsetFrom, offsetTo, animationDuration, true);
    setTimeout(function () {
      window.location.hash = hash;
    }, animationDuration+25)
};

// add scroll when click on menu items 
var menu_items = document.querySelectorAll('a.mdl-navigation__link');
menu_items.forEach(function (elem) {
    elem.addEventListener("click",
        function (e) {
            e.preventDefault();
            scrollTo(elem.getAttribute('href').substring(1));
        });
});

// scroll when open link with anchor 
window.onload = function () {
    if (window.location.hash) {
        var target = document.getElementById(window.location.hash.substring(1));
        scrollAnimate(layout, "scrollTop", "", 0, target.offsetTop, animationDuration, true);
    }
}

Ответ 12

Вот простое решение в чистом JavaScript. Использует преимущества свойства прокрутки CSS : smooth

function scroll_to(id) {       
    document.documentElement.style.scrollBehavior = 'smooth'
    element = document.createElement('a');
    element.setAttribute('href', id)
    element.click();
}

Использование:

Скажем, у нас есть 10 дел:

<div id='df7ds89' class='my_div'>ONE</div>
<div id='sdofo8f' class='my_div'>TWO</div>
<div id='34kj434' class='my_div'>THREE</div>
<div id='gbgfh98' class='my_div'>FOUR</div>
<div id='df89sdd' class='my_div'>FIVE</div>
<div id='34l3j3r' class='my_div'>SIX</div>
<div id='56j5453' class='my_div'>SEVEN</div>
<div id='75j6h4r' class='my_div'>EIGHT</div>
<div id='657kh54' class='my_div'>NINE</div>
<div id='43kjhjh' class='my_div'>TEN</div>

Мы можем перейти к выбранному идентификатору:

scroll_to('#657kh54')

Вы просто вызываете эту функцию в своем событии щелчка (например, нажмите кнопку, затем перейдите к div # 9).

Результат:

enter image description here

Конечно, в реальной жизни это выглядит намного плавнее.

FIDDLE

К сожалению, IE и Safari не поддерживают scrollBehavior = 'smooth' с 2019 года

enter image description here MDN Web Docs

Ответ 13

Для всех, кто в 2019 году, сначала вы добавляете прослушиватель событий

  document.getElementById('id').addEventListener('click', () => scrollTo())

затем вы целитесь в элемент и идете к нему плавно

function scrollTo() {
    let target = document.getElementById('target');
    target.scrollIntoView({
        behavior: "smooth", 
        block: "end", 
        inline: "nearest"
    })
}

Ответ 14

Попробуйте этот код здесь:

window.scrollTo({
        top: 0,
        left: 0,
        behavior: 'smooth'
    });