- Автор: Чен Даютоу
- гитхаб:KRISACHAN
предисловие
В ежедневном развитии мыscrollЭто слово определенно не является незнакомым.
Например, использование JS для работы как тигр, потому что вы не привыкли к стилю браузера по умолчанию.пользовательская полоса прокрутки.
Или swoosh~ он сразу достигнет вершинывернуться к вершине.
Или куда вы хотите пойти?навигация по заголовку.
Но в прошлой разработке реализовать эти функции было не так просто.
Например, мы хотим реализовать эффект прокруткивернуться к вершинефункция, нам может понадобиться написать эти коды.
let timer = null;
let backTop = document.querySelector("#backTop");
backTop.addEventListener("click", () => {
cancelAnimationFrame(timer);
let startTime = +new Date();
let scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
let totalTime = 300;
timer = requestAnimationFrame(() => {
let lastTime = totalTime - Math.max(0, startTime - +new Date() + totalTime);
document.documentElement.scrollTop = document.body.scrollTop =
(lastTime * -scrollTop) / totalTime + scrollTop;
timer = requestAnimationFrame(func);
if (lastTime === totalTime) {
cancelAnimationFrame(timer);
}
});
});
(Отказ от ответственности: псевдокод не проверен, если есть ошибка, пожалуйста, простите меня.)
Эй, это означает написать анимацию и постоянно изменять расстояние вертикальной прокрутки текущей страницы, пока оно не станет равным 0.
(Толпа, поедающая дыню: «Трудно? Ты слишком хорош, дядя!»)
Но на самом деле со временемweb apiтак же какcssПоскольку спецификация продолжает улучшаться, функции, которые мы когда-то считали громоздкими для реализации, стали проще. Ниже мы можем вместе обсудить эти улучшения.
Семейство прокрутки в веб-API
Приезжаем в Канкансемья прокруткиинтересный API.
прокрутить и прокрутить
scroll()а такжеscrollToМетод используется для прокрутки до определенной координаты в данном элементе.Elementинтерфейс.
Синтаксис следующий:
-
scroll/scrollTo(x, y)-
x: абсцисса позиции, в которую должен быть перемещен элемент. -
y: ордината позиции, в которую должен быть перемещен элемент.
-
-
scroll/scrollTo(options)optionsСвойства поддержкиleft,topтак же какbehavior-
top: абсцисса позиции, в которую должен быть перемещен элемент. -
left: ордината позиции, в которую должен быть перемещен элемент. -
behavior: режим движения элемента, если онauto, анимационный эффект отсутствует, еслиsmooth, плавная прокрутка.
-
Давайте перейдем к каштанам Канкан:
Приведенный выше пример взят из репозитория MDN на GitHub.dom-examples
Основной код JS выглядит следующим образом:
let scrollOptions;
const form = document.querySelector("form");
const leftInput = document.getElementById("left");
const topInput = document.getElementById("top");
const scrollInput = document.getElementById("scroll");
form.addEventListener("submit", e => {
e.preventDefault();
scrollOptions = {
left: leftInput.value,
top: topInput.value,
behavior: scrollInput.checked ? "smooth" : "auto"
};
window.scrollTo(scrollOptions);
});
scrollBy
scrollBy()Метод заключается в том, чтобы прокрутить элемент на определенное расстояние.Elementинтерфейс.
Синтаксис следующий:
-
scrollBy(x, y)
-
x: абсцисса позиции, в которую должен быть перемещен элемент. -
y: ордината позиции, в которую должен быть перемещен элемент.
-
-
scrollBy(options)
optionsСвойства поддержкиleft,topтак же какbehavior-
top: абсцисса позиции, в которую должен быть перемещен элемент. -
lef:: ордината позиции, в которую должен быть перемещен элемент. -
behavior: режим движения элемента, если онauto, анимационный эффект отсутствует, еслиsmooth, плавная прокрутка.
-
Еще каштан:
Основной код выглядит следующим образом:
let scrollOptions;
const form = document.querySelector("form");
const leftInput = document.getElementById("left");
const topInput = document.getElementById("top");
const scrollInput = document.getElementById("scroll");
form.addEventListener("submit", e => {
e.preventDefault();
scrollOptions = {
left: leftInput.value,
top: topInput.value,
behavior: scrollInput.checked ? "smooth" : "auto"
};
window.scrollBy(scrollOptions);
});
Ммммм, да, просто поставьscrollToизменить наscrollByВот и все. очень умно~
Давайте посмотрим на совместимость трех вышеуказанных API:
Мммм, совместимость неплохая.
(дынные массы: у IE нет прав человека???????)
Element.scrollIntoView
Element.scrollIntoView()метод прокрутки текущего элемента в видимую область окна браузера.
Синтаксис следующий:
-
scrollIntoView(alignToTop)
alignToTopявляется логическим значением, если не заполнено, по умолчанию используетсяtrue. эквивалентно{block: 'start', inline: ‘nearest‘}.если значение
true, верхняя часть элемента будет выровнена по верхней части видимой области области прокрутки, в которой он находится. еслиfalse, он выравнивается по нижнему краю. эквивалентно{block: 'end', inline: 'nearest'} -
scrollIntoView(scrollIntoViewOptions)
scrollIntoViewOptionsОбъект со следующими свойствами:-
behavior: режим движения элемента, если онauto, анимационный эффект отсутствует, еслиsmooth, плавная прокрутка. -
block: определяет выравнивание по вертикали, значение может бытьstart,center,endилиnearestодин. По умолчаниюnearest. -
inline: определяет выравнивание в горизонтальном направлении, значение может бытьstart,center,endилиnearestодин. По умолчаниюnearest.
-
Давай, позволь мне объяснить тебеblockа такжеinlineЧто происходит с необязательным значением :
-
start: Выровняйте по волосам отца текущего элемента (вверху). -
center: Выровняйте по животу (середине) текущего элемента. -
end: Выровнять по jio (нижней части) текущего элемента. -
nearest: Принцип близости, иди где находишься, если ты посередине, то не сдвинешься.
еслиblock, как будто элемент стоит (сверху вниз), если онinline, как если бы элемент лежал (слева направо). Конечно, предполагается, что по умолчаниюwriting-mode: horizontal-tb.
Маленький круглый? Приезжайте в каштаны Kangkang:код спрей.IO/Антияпонское производство 77/…
Ну, это значит убить Мэтта, о нет,scrollсемейные характеристики. (Брошенные или готовые к заброшенным не будут написаны выше.)
Наконец, давайте также посмотрим на совместимость:
Ну да ладно, IE можно использовать. . .
До сих пор семейство Kill Matt в нашей веб-AP, о нет, было представлено семейство прокрутки, напримерElement.scrollIntoViewIfNeedТакого API, которое не красит волосы (не стандартное) внедрять не будет.Если интересно, можете пойти и посмотреть, что оно умеет.
CSS scroll
После совместного использования JS вscroll, давайте посмотрим на CSSscroll.
scroll-behavior
Мы говорим об этом JS в приведенном вышеscrollКогда слово упоминается несколько раз, называется «behavior".
Мммм, так что вы, ребята, догадались об этомscroll-behaviorс JSbehaviorЭто имеет значение?
Ну да, как вы уже догадались, это имеет значение.
(Толпа, поедающая дыни: «Никому нет дела до тебя~»)
scroll-behaviorс вышеуказаннымscrollв APIbehaviorТо же самое используется для определения эффекта анимации при прокрутке страницы.
если определить какsmooth, когда страница инициирует операцию прокрутки, будет эффект прокрутки, если онauto, он такой же, как и раньше, он мгновенно перемещается в указанное положение. Это относится к чему-то вроде щелчка#hashПерейти к тому же триггеру, вместо того, чтобы двигать полосу прокрутки.
Эффект можно посмотреть в DEMO в первом разделе этой статьи.
Совместимость следующая:
Scroll Snap
CSS Scroll Snapотносительно новый независимый модуль в CSS, его первая официальная версияМодуль CSS Scroll Snap Уровень 1Он также был выпущен 19 марта 2019 года.
Модуль привязки прокрутки CSSКогда контейнер страницы перестает прокручиваться, его можно захватить и автоматически переместить в указанную позицию указанного элемента.
Дайте мне милю giaogiao! Это замечательная функция~
Он разделен на две части, одна часть действует на контейнер прокрутки, а другая часть действует на относительные дочерние элементы прокрутки.Конкретные отношения следующие:
| Действует на прокручиваемые контейнеры | Действует при прокрутке дочерних элементов |
|---|---|
| scroll-snap-type | scroll-snap-align |
| scroll-padding | scroll-snap-stop |
| scroll-margin |
scroll-snap-type
scroll-snap-typeАтрибуты определяют, можно ли захватить и выровнять текущий контейнер прокрутки, а также направление и строгость реализации.
Его необязательные значения направления:
-
x: привязка к положению на оси X -
y: привязка к положению по оси Y -
block: фиксирует положение на оси блока (логически то же самое, что и y) -
inline: привязка к положению на встроенной оси (логически то же самое, что и x) -
both: Привязка к положению в обоих направлениях
Его необязательные строгие значения:
-
none: по умолчанию, Мммм, ничего не делать -
proximity: воспринимаемое значение. Если элемент попадает в диапазон позиции захвата контейнера, он будет захвачен и прокручен. В противном случае это не имеет значения. Что касается диапазона, он должен составлять около 45% позиции (измерено вручную, Конкретных подробностей W3C не сообщил.Алгоритм,угадайте,хахаха). -
mandatory: Надежное значение, пока есть параметры, оно обязательно выровняется, когда вы перестанете прокручивать.
Давайте перейдем к Канкану, каков эффект этой штуки:
Приведенное выше DEMO взято из MDN.scroll-snap-type
scroll-snap-align
scroll-snap-alignСвойство задает положение привязанного дочернего элемента, к которому привязывается контейнер привязки. Необязательные значения следующие:
-
none: По умолчанию ничего не делать 0.0. -
start: Совместите с начальным положением. -
end: Выровняйте с конечным положением. -
center: Выравнивание по центру.
Эффект следующий:
Приведенное выше DEMO от Энди Адамса.scroll-snap-align
scroll-snap-stop
потому чтоScroll Snapэлементы будут иметь несколько позиций привязки, иscroll-snap-stopВы можете выбрать, будет ли вас захватывать после достижения этих позиций, или вас будут захватывать только тогда, когда вы достигнете указанной позиции. Необязательные атрибуты следующие:
-
normal: значение по умолчанию, при прокрутке положение привязки можно игнорировать. -
always: При прокрутке положение привязки нельзя игнорировать, и положение первого элемента привязки должно быть позиционировано.
Каштаны бывают следующие:
Приведенное выше DEMO взято из MDN.scroll-snap-stop
scroll-margin
scroll-marginявляется сокращенным свойством, за которым следуетmarginКроме того, есть различные логические свойства на выбор. Он устанавливает размер внешней границы между элементом и полосой прокрутки. Давайте посмотрим на разницу между двумя анимациями.
когда мы нажимаем#hashпри прыжках.
Нормальная операция:
h3 {
}
Добавленscroll-margin-top:
h3 {
scroll-margin-top: 5rem;
}
Вышеупомянутое DEMO взято из книги Криса Койера.Fixed Headers and Jump Links? The Solution is scroll-margin-top
Из приведенных выше двух DEMO мы можем ясно сравнить, предполагая#hashЭлементы навигации были измененыscroll-marginтогда последнее положение прыжка будетscroll-marginЗначение ограничено.
Мало того, давайте посмотрим на следующее DEMO:
Вышеупомянутая ДЕМО-версия от Энди Адамса.scroll-margin
когда мы устанавливаемscroll-marginКогда элемент скролла попадает в видимую область скролла, браузерscroll-marginзначение, перейдите в соответствующую позицию.
scroll-marginПереопределенными свойствами являются следующие:
scroll-margin-topscroll-margin-rightscroll-margin-bottomscroll-margin-leftscroll-margin-blockscroll-margin-inlinescroll-margin-block-startscroll-margin-inline-startscroll-margin-block-endscroll-margin-inline-end
scroll-padding
scroll-paddingа такжеscroll-marginтипа, только сpaddingа такжеmarginТо же самое, есть разница между внутренними и внешними полями.
Приходите на ДЕМО:
Вышеупомянутая ДЕМО-версия от Энди Адамса.scroll-padding
scroll-paddingПереопределенные свойства также имеют следующее:
scroll-padding-topscroll-padding-rightscroll-padding-bottomscroll-padding-leftscroll-padding-blockscroll-padding-inlinescroll-padding-block-startscroll-padding-inline-startscroll-padding-block-endscroll-padding-inline-end
Вышеупомянутая совместимость API выглядит следующим образом:
CSS overscroll
overscroll-behavior
overscroll-behaviorВпервые опубликовано W3C в июне 2019 г.CSS Transition Scrolling Behavior Module Уровень 1единственное имущество в нем.
overscroll-behaviorПозволяет контролировать поведение браузера при прокрутке до границ.
Это также сокращенное свойство, и конкретные свойства:
-
overscroll-behavior-x: при нормальных обстоятельствах обрабатывается поведение, когда горизонтальная полоса прокрутки прокручивается до границы. -
overscroll-behavior-y: при нормальных обстоятельствах обрабатывается поведение, когда полоса прокрутки по вертикальной оси прокручивается до границы. -
overscroll-behavior-inline:а такжеoverscroll-behavior-xТакой же. -
overscroll-behavior-block:а такжеoverscroll-behavior-yТакой же
Необязательные значения:
-
auto: По умолчанию. -
contain: Когда элемент прокручивается до границы, это больше не влияет на соседние прокручиваемые элементы. -
none: когда элемент прокручивается до границы, это не только не влияет на соседние прокручиваемые элементы, но даже прокрутка до границы по умолчанию будет заблокирована.
Каштаны бывают следующие:
использовалoverscroll-behavior: contain;
По умолчанию
Совместимость следующая:
внеклассная поза
старые и новые логические свойства
Не знаю, обращали ли вы внимание на значения вышеперечисленных атрибутов, кроме обычногоx,y,top,right,bottomа такжеleftКроме того, есть четыре менее распространенных значенияblock,inline,startа такжеend.
Так что же это такое?
На самом деле это потому, что W3C преднамеренно изменила логические свойства CSS, чтобы позаботиться о письменных привычках незападных стран.
Для таких стран, как наша страна или США, документы располагаются сверху вниз, слева направо,top,right,bottomа такжеleftЭто легко понять.
Однако в таких странах, как Япония или Аравия, чей порядок письма отличается от нашего, будут логически необоснованные места, такие как:
- В Аравии их
padding-leftСобственно направление нашеpadding-right - В Японии их
padding-leftСобственно направление нашеpadding-top
В свете вышеизложенного это довольно странно. Поэтому W3C выходит с новыми логическими атрибутами, и сравнение между старыми и новыми выглядит следующим образом:
| старое логическое свойство | новое логическое свойство |
|---|---|
| top | inset-block-start |
| bottom | inset-block-end |
| left | inset-inline-start |
| right | inset-inline-end |
| margin-top | margin-block-start |
| margin-right | margin-inline-end |
| margin-bottom | margin-block-end |
| margin-left | margin-inline-start |
| border-top | border-block-start |
| border-right | border-inline-end |
| border-bottom | border-block-end |
| border-left | border-inline-start |
| padding-top | padding-block-start |
| padding-right | padding-inline-end |
| padding-bottom | padding-block-end |
| padding-left | padding-inline-start |
| width | inline-size |
| height | block-size |
Подводя итог, абсциссаinline, ординатаblock, начинается сstart, заканчивающийся наend.
Наконец-то спецэффект
это эксплойтscroll-behavior: smoothЭффект, написанный характеристиками, мы пошли играть с друзьями раньше, мы провели много мероприятий. Одна из игр - «Ты угадал, я угадал».Как планировщик, рыбья голова, естественно, не могла упустить эту возможность, поэтому он использовал свои навыки, чтобы покрасоваться.
Давайте сначала посмотрим на эффект.
Адрес источника здесь:
код спрей.IO/Антияпонское производство 77/…
Поскольку код слишком длинный, он не опубликован полностью, но основная логика заключается в использованииscroll-behavior: smooth;контролировать#hashЭффект прыжка, чтобы не загрязнять урл, заодно использоватьhistory apiдля поддержания нормального URL. Наверное соус фиолетовый:
let pageIndex = 1;
const urlChangeHandler = event => {
const { newURL } = event;
const current = newURL.replace(/.+\#page\-(\d)/, "$1");
pageIndex = +current;
console.log(pageIndex);
history.pushState(
{},
window.location.href,
window.location.origin + window.location.pathname
);
};
window.onhashchange = urlChangeHandler;
Вы также можете попытаться добавить интереса к своей жизни с помощью поз, которые вы освоили~
постскриптум
Люди, которые едят дыни: я прочитал всю статью, но не увидел ничего связанного с ниндзюцу? Ложись на мой трафик и теряй деньги.
Рыба голова: почему нет? Что вы подразумеваете, побаловать меня теперь, когда вы злитесь на меня?
использованная литература
- scrollIntoView block vs inline
- CSSOM View Module
- Element.scrollIntoView()
- CSS Scroll Snap Module Level 1
- CSS TRICK scroll-snap-type
- MDN scroll-snap-type
- CSS TRICK scroll-snap-align
- scroll-snap-stop
- scroll-margin
- scroll-padding
- Fixed Headers and Jump Links? The Solution is scroll-margin-top
- caniuse
постскриптум
Если вам нравится обсуждать технологии или у вас есть какие-либо комментарии или предложения по этой статье, вы можете добавить друзей Yutou в WeChat для совместного обсуждения.Конечно, Yutou также надеется поговорить с вами о жизни, хобби и поболтать. WeChat ID Fish Head: krisChans95