/*Вспомогательные стили для демонстрации появления кнопки*/
body {
height: 4000px; /*имитируем много контента на странице*/
}
/*Стили по-умолчанию*/
.up-btn {
background-color: #444; /*Цвет фона*/
color: #fff; /*Цвет текста в кнопке*/
padding: 20px; /*Внутренний отступ*/
position: fixed; /*Фиксированное позиционирование*/
bottom: 20px; /*Снизу*/
right: 20px; /*Справа*/
cursor: pointer; /*«Рука» при наведении*/
opacity: 0; /*Прозрачность 0%*/
visibility: hidden; /*Видимость на странице*/
transition: .3s all; /*Плавность изменения 3 миллисекунды*/
}
/*Активный класс*/
.up-btn.is-show {
opacity: 1; /*Прозрачность 100%*/
visibility: visible; /*Видимость на странице*/
}
/*
Трюк с opacity и visibility нужен, потому что display none и block появляются резко. Им никак не настроишь плавности. А вот opacity и visibility плавность появления настроить можно.
*/
Дали body огромную высоту, для того, чтобы скроллить, это только для примера.
Для кнопки сделали позиционирование внизу справа, по-умолчанию кнопка скрыта. Показывать ее будет дополнительный класс is-show, который мы будем добавлять в js.
javascript
Первое — клик и скроллинг вверх.
(1) Создаем событие клика по классу .js-scroll top (2) У элемента html и body вызываем функцию. animate и (3) Анимируем параметр scrollTop: 0 (4) за 1000 мс(1 сек)
Почему scrollTop должен быть 0? Потому, что это означает начало страницы.
Какие будут условия для показа и скрытия? Позиция скролла в текущий момент времени. Это мы можем проверить, привязав событие scroll на window — окно браузера.
$(window).scroll(function() {
});
Теперь при прокрутке мы должны получать позицию скролла. Это можно сделать с помощью метода. scrollTop()
$(window).scrollTop()
if (Если расстояние сверху больше, чем 200 пикселей) {
добавляем класс, который показывает кнопку
} else {
удаляем класс, который показывает кнопку
}
Представим, что у на главной странице вашего сайта подвал внизу и все ок, но вот на странице контактов контента мало и подвал находится не внизу страницы, а посередине, как здесь:
Демо проблемы
Как-то я делал javascript реализацию подсчета высоты и автоматическую подстройку, но постоянно возникали проблемы с отступами и я решил, что это необходимо сделать на css.
Решать проблему будем с помощью flex grid.
html
Для начала создадим html-код, тут нам понадобиться всего 2 элемента: content и footer. В content будет лежать шапка и контент сайта, отдельно будет футер.
<body>
<div class="content">
<p>I am content</p>
</div>
<div class="footer">
<p>I am footer</p>
</div>
</body>
Белая полоса справа на сайте — частый и сложный вопрос, особенно для начинающих разработчиков.
Видеоурок
В чем проблема
Белая полоса может появляться по многим причинам, но если коротко, это«вывалившиеся» за сайт элементы, либо огромные отступы(margin) вправо.
Они могут быть скрыты, неочевидны, сразу можно не разобраться, что вылезает за границу сайта и создает эту белую полосу.
Пришлось повозится, чтобы создать эту ситуацию xD
Обычно пытаешься это решить, а вот создавать — впервые.
Проблема
Итак, нашлась проблема — появилась белая полоса. Вы уже знаете, что это выпавшие за границу элементы сайта или их отступы.
Нам нужно их найти. Иногда, они видны сразу, как здесь:
Нашли проблемные блоки
Иногда, они не видны совсем, и по сайту сплошняком идет белая полоса, это уже сложнее. Я в таких случая просто удаляю по секции, и смотрю, после какой секции ситуация нормализуется.
После того, как нашел секцию, в ней уже смотрю, какие элементы вызывают эту проблему, напишу несколько.
скрытые модальные окно или меню
flex или grid сетки
заголовки или подзаголовки
Посмотрим на моем примере, что я сделал не так и как исправить ситуацию в моем случае.
У меня 2 проблемы:
css код этого примера
У flex сетки нет свойства flex-wrap, которое отвечает за переброс элементов, в том случае, если места для них на экране нет
Размер и формат заголовка, Заголовок длинный и без пробелов, нужно либо изменить его, либо уменьшить размер.
В jQuery создаем событие клика на кнопку, предварительно проставив классы с префиксом js-. Это делается, чтобы в случае замены классов оформления, код поведения остался цел.
Сейчас нам нужно понять, к какому именно элементу нужно скроллить. Я буду хранить это в data-атрибуте. Это такой атрибут, который вы можете назвать, как душе угодно:
data-vasya
data-lays
data-id
И хранить там информацию. Я буду хранить там селектор элемента, к которому будем скроллить.
Тепер в javascript при клике на кнопку мы будем получать этот атрибут.
var scrollName = $(this).attr('data-scroll');
Что дальше? Нужно найти элемент с таким селектором в dom-дереве. Это можно сделать так:
var scrollName = $(this).attr('data-scroll'),
scrollElem = $(scrollName);
И последний шаг — узнать расстояние от верха страницы до нашего элемента. В этом нам поможет метод offset() и его свойство top
var scrollName = $(this).attr('data-scroll'),
scrollElem = $(scrollName),
scrollTop = scrollElem.offset().top;
Отлично! Осталось добавить анимацию скролла. За это в jQuery отвечает функция animate(), первым аргументом она принимает массив параметров, которые нужно анимировать, второй аргумент — время в миллисекундах, за которое нужно выполнить анимацию.
Мы будем анимировать параметр scrollTop. Вы можете спросить, почему мы указали html и body в качестве элементов для анимации?
Причина, по которой вы должны использовать оба селектора, заключается в несовместимости веб-браузера.
Браузеры Firefox и IE используют ‘html’
Браузеры в «классе webkit» например: Safari, Chrome используют ‘body’.
Зачем нам что-то хранить? Пару дней назад на моем сайте происходил редизайн. Я хотел уведомить пользователя о том, чтобы он не пугался поехавшей верстки и просто очистил кеш нажатием ctrl+f5.
А если пользователь зайдет 10 раз? Каждый раз показывать ему это, зачем? Он уже знает. Для этого мы будем записывать в хранилище то, что пользователь уже просмотрел наше сообщение. В следующий раз оно уже не будет показываться.
html
Первым делом — html. Мы создаем фиксированную панель внизу экрана с текстом и кнопками. Так же добавляем класс для скрытия панели.
<div class="notification js-notification hidden">
<div class="container">
<div class="notification-text">
Мы используем куки-файлы. Продолжая использовать наш сайт, вы соглашаетесь с этим.
</div>
<button class="notification-btn js-notification-btn">OK</button>
</div>
</div>
.js-notification мы добавляем для того, чтобы не использовать для javascript те классы, на которых висит оформление. Мы можем забыть об этом и поменять классы — интерактив сломается. Видя приставку js-, мы не будем менять класс зная, что на нем функционал в js.
.hidden мы добавили сразу же. Дело в том, что пока мы не поняли, смотрел он уже наше сообщение или нет, панель должна быть скрыта, чтобы она не показывалось в самом начале, пока javascript просматривает хранилище. Панель покажется быстрее, чем сообразит javascript.
По css ничего сложного. Думаю многие поймут и справятся. Если будут вопросы — пишите в комментариях или в личку.
javascript
Часто, чтобы написать какой-то код, нужно проговорить его вслух:
«Пользователь заходит на сайт, проверить есть ли в хранилище запись, если ее там нет — добавить класс с панели, если она там есть, ничего не делать. При клике на кнопку, добавлять запись в хранилище и добавлять класс, скрывающий панель.»
Вот и готовая схема кода. Мой руководитель, занимаясь с ученицей, писал на листке такие конструкции:
Если (записи в хранилище нет) {
удалить класс у блока
}
клик по кнопке ({
добавить запись в хранилище
добавить класс, скрывающий панель
})
Когда сложная ситуация, помогает разобраться.
Я немного отвлекся, приступим к js:
// Переменные для панели и кнопки
var panel = document.querySelector('.js-notification'),
panelButton = panel.querySelector('.btn');
Заметьте, переменная panelButton написана по-другому. Она начинается не с document, а с panel(первая переменная), это означает я ищу этот элемент не во всем документе, а только в панели. То есть буду искать ее среди потомков элемента с классом «.js-notification».
Напишем проверку хранилища. Я буду хранить наше сообщение под именем«cookie-message»:
именем«cookie-message»:
if (localStorage['cookie-message'] == undefined) {
panel.classList.remove('hidden');
}
Если в хранилище нет записи — добавляем класс hidden
В итоговый код я добавил строки анимации появления/скрытия. Я объясню их в статье позже.
html
<div class="notification js-notification hidden">
<div class="container">
<div class="notification-text">
Мы используем куки-файлы. Продолжая использовать наш сайт, вы соглашаетесь с этим.
</div>
<button class="notification-btn js-notification-btn">OK</button>
</div>
</div>