Заголовок Headroom.js с начальным статическим состоянием
Я использую замечательный плагин Headroom.js для создания заголовка с автоматическим скрытием. Заголовок является статическим с самого начала и закрепляется после смещения (при прокрутке вниз), а затем возвращается к статическому (при возврате вверх).
Вот что я сделал: http://codepen.io/netgloo/pen/KmGpBL
но у меня есть 2 проблемы:
- прокрутка сверху вниз: когда заголовок закрепляется, я вижу, что он скользит вниз и внезапно скользит вверх
- прокрутка вверх от средней страницы: когда заголовок приходит к смещению, он исчезает, но мне нужно держать его прикрепленным к вершине
Кто-то может дать мне помощь или идеи? Спасибо
Вот как я инициализирую плагин:
var myElement = document.querySelector("header");
var headroom = new Headroom(myElement, {
"offset": 150,
"tolerance": 0,
});
headroom.init();
1 ответ
headroom.js
Скрипт в основном обрабатывает добавление / удаление некоторых классов для вас. Это зависит от вас, чтобы добавить соответствующие стили для достижения желаемого эффекта. Давайте начнем с самой простой части, HTML:
HTML
<header>
Header
</header>
Это оно!
Теперь для настройки JS:
JS
var myElement = document.querySelector("header");
var headroom = new Headroom(myElement, {
"offset": 220,
"tolerance": {
up: 0,
down: 0
},
"classes": {
"initial": "header--fixed",
"pinned": "slideDown",
"unpinned": "slideUp",
"top": "top",
"notTop" : "not-top",
}
});
headroom.init();
Первая строка выбирает header
элемент. Второй создает новый Headroom
объект с использованием значений конфигурации. Я установил значения, основываясь на том эффекте, который, по вашему мнению, вы пытаетесь достичь - заголовок должен соскользнуть, когда страница быстро прокручивается, и должен появиться, когда страница прокручивается вверх.
offset
из 205px - это расстояние от вершины, когда заголовок может быть закреплен.
tolerance
5px - допуск прокрутки до изменения состояния.
И, наконец, мы собираемся определить классы, которые будут добавлены к элементу для разных состояний. При запуске элементу будет присвоен класс header--fixed
, При закреплении элемент получит дополнительный slideDown
учебный класс. А при откреплении элемент получит дополнительный slideUp
учебный класс.
Последняя строка инициализирует headroom
объект.
Используя классы на основе состояния, мы теперь можем создать CSS, необходимый для достижения желаемого эффекта.
CSS
Начнем с .header--fixed
учебный класс:
.header--fixed {
position: absolute;
top: 0;
width: 100%;
}
main {
padding-top: 110px;
}
Это устанавливает начальное размещение заголовка (вверху) и устанавливает отступ для основного содержимого страницы, чтобы оно не охватывалось заголовком.
Далее нам нужно определить стили для различных состояний - .top
, .not-top
, .slideDown
а также .slideUp
:
.header--fixed.top {
transition: none;
transform: translateY(0);
}
.header--fixed.not-top {
position: fixed;
transform: translateY(-100%);
}
.header--fixed.slideDown.not-top {
transition: transform 0.3s ease-in-out;
transform: translateY(0);
}
.header--fixed.slideDown.top {
transition: transform 0.3s ease-in-out;
position: fixed;
}
.header--fixed.slideUp.not-top {
transition: transform 0.3s ease-in-out;
transform: translateY(-100%);
}
.header--fixed.slideUp.top {
transform: translateY(-100%);
position: absolute;
}
Большинство из этих стилей связаны с настройкой положения и перехода для каждого состояния. Короче говоря, .not-top
Класс применяется, когда страница прокручивается ниже заголовка. .top
применяется, когда страница прокручивается ближе к верху (в пределах высоты заголовка).
В дополнение к этому критическому CSS вам понадобится CSS для стилизации заголовка - цвет фона, шрифт и т. Д. Это может быть применено путем нацеливания на header
элемент или header--fixed
учебный класс.
Последняя часть и суть проблемы - сброс заголовка, когда страница прокручивается обратно до самого верха - т.е. window.pageYOffset
из 0
, Когда страница достигает этой точки, нам нужно удалить .slideDown
класс, поэтому заголовок прокручивается вместе со страницей.
window.addEventListener('scroll', function() {
if (window.pageYOffset === 0) {
myElement.classList.remove('slideDown')
}
})
Полный код
Собрав все это вместе, мы получим следующее:
// Headroom.js
// https://github.com/WickyNilliams/headroom.js
var myElement = document.querySelector("header");
var headroom = new Headroom(myElement, {
"offset": 220,
"tolerance": {
up: 0,
down: 0
},
"classes": {
"initial": "header--fixed",
"pinned": "slideDown",
"unpinned": "slideUp",
"top": "top",
"notTop" : "not-top",
}
});
headroom.init();
// When the page is at the top, remove the slideDown class.
window.addEventListener('scroll', function() {
if (window.pageYOffset === 0) {
myElement.classList.remove('slideDown')
}
})
.header--fixed {
position: absolute;
top: 0;
width: 100%;
}
.header--fixed.top {
transition: none;
transform: translateY(0);
}
.header--fixed.not-top {
position: fixed;
transform: translateY(-100%);
}
.header--fixed.slideDown.not-top {
transition: transform 0.3s ease-in-out;
transform: translateY(0);
}
.header--fixed.slideDown.top {
transition: transform 0.3s ease-in-out;
position: fixed;
}
.header--fixed.slideUp.not-top {
transition: transform 0.3s ease-in-out;
transform: translateY(-100%);
}
.header--fixed.slideUp.top {
transform: translateY(-100%);
position: absolute;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
text-align: center;
}
header {
background: #4ECDC4;
padding: 40px;
font: normal 30px/1 sans-serif;
}
main {
padding: 110px 0 0 0;
}
<script src="https://unpkg.com/headroom.js"></script>
<header>
Header
</header>
<main>
<p>Lorem ipsum 1</p>
<p>Lorem ipsum 2</p>
<p>Lorem ipsum 3</p>
<p>Lorem ipsum 4</p>
<p>Lorem ipsum 5</p>
<p>Lorem ipsum 6</p>
<p>Lorem ipsum 7</p>
<p>Lorem ipsum 8</p>
<p>Lorem ipsum 9</p>
<p>Lorem ipsum 10</p>
<hr>
<p>Lorem ipsum 1</p>
<p>Lorem ipsum 2</p>
<p>Lorem ipsum 3</p>
<p>Lorem ipsum 4</p>
<p>Lorem ipsum 5</p>
<p>Lorem ipsum 6</p>
<p>Lorem ipsum 7</p>
<p>Lorem ipsum 8</p>
<p>Lorem ipsum 9</p>
<p>Lorem ipsum 10</p>
<hr>
<p>Lorem ipsum 1</p>
<p>Lorem ipsum 2</p>
<p>Lorem ipsum 3</p>
<p>Lorem ipsum 4</p>
<p>Lorem ipsum 5</p>
<p>Lorem ipsum 6</p>
<p>Lorem ipsum 7</p>
<p>Lorem ipsum 8</p>
<p>Lorem ipsum 9</p>
<p>Lorem ipsum 10</p>
<hr>
<p>Lorem ipsum 1</p>
<p>Lorem ipsum 2</p>
<p>Lorem ipsum 3</p>
<p>Lorem ipsum 4</p>
<p>Lorem ipsum 5</p>
<p>Lorem ipsum 6</p>
<p>Lorem ipsum 7</p>
<p>Lorem ipsum 8</p>
<p>Lorem ipsum 9</p>
<p>Lorem ipsum 10</p>
<hr>
<p>Lorem ipsum 1</p>
<p>Lorem ipsum 2</p>
<p>Lorem ipsum 3</p>
<p>Lorem ipsum 4</p>
<p>Lorem ipsum 5</p>
<p>Lorem ipsum 6</p>
<p>Lorem ipsum 7</p>
<p>Lorem ipsum 8</p>
<p>Lorem ipsum 9</p>
<p>Lorem ipsum 10</p>
<hr>
<p>Lorem ipsum 1</p>
<p>Lorem ipsum 2</p>
<p>Lorem ipsum 3</p>
<p>Lorem ipsum 4</p>
<p>Lorem ipsum 5</p>
<p>Lorem ipsum 6</p>
<p>Lorem ipsum 7</p>
<p>Lorem ipsum 8</p>
<p>Lorem ipsum 9</p>
<p>Lorem ipsum 10</p>
<hr>
<p>Lorem ipsum 1</p>
<p>Lorem ipsum 2</p>
<p>Lorem ipsum 3</p>
<p>Lorem ipsum 4</p>
<p>Lorem ipsum 5</p>
<p>Lorem ipsum 6</p>
<p>Lorem ipsum 7</p>
<p>Lorem ipsum 8</p>
<p>Lorem ipsum 9</p>
<p>Lorem ipsum 10</p>
<hr>
<p>Lorem ipsum 1</p>
<p>Lorem ipsum 2</p>
<p>Lorem ipsum 3</p>
<p>Lorem ipsum 4</p>
<p>Lorem ipsum 5</p>
<p>Lorem ipsum 6</p>
<p>Lorem ipsum 7</p>
<p>Lorem ipsum 8</p>
<p>Lorem ipsum 9</p>
<p>Lorem ipsum 10</p>
<hr>
<p>Lorem ipsum 1</p>
<p>Lorem ipsum 2</p>
<p>Lorem ipsum 3</p>
<p>Lorem ipsum 4</p>
<p>Lorem ipsum 5</p>
<p>Lorem ipsum 6</p>
<p>Lorem ipsum 7</p>
<p>Lorem ipsum 8</p>
<p>Lorem ipsum 9</p>
<p>Lorem ipsum 10</p>
<hr>
<p>Lorem ipsum 1</p>
<p>Lorem ipsum 2</p>
<p>Lorem ipsum 3</p>
<p>Lorem ipsum 4</p>
<p>Lorem ipsum 5</p>
<p>Lorem ipsum 6</p>
<p>Lorem ipsum 7</p>
<p>Lorem ipsum 8</p>
<p>Lorem ipsum 9</p>
<p>Lorem ipsum 10</p>
<hr>
</main>
И с этим у нас есть все, что нам нужно. Для рабочего примера с CSS, выполненного в SCSS, как ваш пример, см. Этот Codepen.