Кнопка «Наверх»: как создать с CSS и jQuery

Кнопка «Вверх к началу» — это то, что многие из вас, вероятно, видели на многих веб-сайтах. Это стрелка, которая появляется в правом нижнем углу веб-страницы при ее прокрутке. Когда вы нажимаете, она возвращает вас к началу страницы. Если вы хотите добавить кнопку «Наверх» в процессе разработки сайта, или просто интересуетесь, как вы можете создать её самостоятельно, добро пожаловать на борт!

featured_image


Вернуться наверх

Наш код будет состоять из двух частей, стилей CSS и маленького скрипта jQuery. Давайте начнем с CSS.


CSS стили для кнопки

Мы начнем с создания стилей и разметки для нашей кнопки. Вот часть HTML:

<link rel=“stylesheet” href=“https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css”>

<a id=“button”></a>

Кнопка будет состоять только из одного якорного тега с id кнопка. Мы также включаем ссылку на библиотеку FontAwesome, чтобы можно было использовать значок для нашей кнопки.

Начальные стили для кнопки будут выглядеть так:

#button {
  display: inline-block;
  background-color: #FF9800;
  width: 50px;
  height: 50px;
  text-align: center;
  border-radius: 4px;
  margin: 30px;
  position: fixed;
  bottom: 30px;
  right: 30px;
  transition: background-color .3s;
  z-index: 1000;
}
#button:hover {
  cursor: pointer;
  background-color: #333;
}
#button:active {
  background-color: #555;
}

Поскольку кнопка является элементом связки, а связки по умолчанию являются встроенными элементами, нам нужно изменить свойство display на встроенный блок, чтобы мы могли назначать ему размер.

Давайте сделаем квадратную кнопку 50х50 px с закругленными углами в 4px. Мы придадим ей ярко-оранжевый цвет и по 30px с каждой стороны. Фиксированная позиция всегда позволяет нашей кнопке оставаться в том же месте, когда мы прокручиваем страницу, а z-index очень большого значения, что кнопка всегда перекрывает другие элементы веб-сайта. Когда мы наводим курсор на кнопку, курсор меняется на указатель, а фон становится темно-серым. Чтобы сделать переход плавным, мы назначим переход на 0,3 секунды для свойства background-color. Также, когда мы нажимаем кнопку, цвет фона также изменяется и становится немного светлее.


Добавляем иконку

Сейчас наша кнопка пустая, давайте добавим на неё иконку. Мы делаем это, добавляя ::after псевдо=элемент типа этого:

#button::after {
  content: "\f077";
  font-family: FontAwesome;
  font-weight: normal;
  font-style: normal;
  font-size: 2em;
  line-height: 50px;
  color: #fff;
}


Мы собираемся выбрать значок из самой популярной библиотеки шрифтов FontAwesome. Начнем с иконкой Chevron Up.

Чтобы отобразить её в псевдоэлементе, установите значение FontAwesome для тега font-family и назначьте значение Unicode для вашего значка в content.

Также убедитесь, что высота вашей линии равна высоте вашего значка, если вы хотите, чтобы он был центрирован по горизонтали.


Добавляем функциональность с jQuery

В этом подразделе мы поговорим о том, как собственно сделать кнопку рабочей. Самый простой способ это сделать — использовать JavaScript библиотеку  jQuery. Для начала нам нужно добавить jQuery в HTML разметку. Добавьте эту строку прямо перед тем как закрыть тег body.

<script src=”https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js”></script>

Сейчас мы можем написать наш скрипт используя синтаксис jQuery.  Добавьте этот скрипт после строки jQuery:

<script>

jQuery(document).ready(function() {
  
  var btn = $('#button');

  $(window).scroll(function() {
    if ($(window).scrollTop() > 300) {
      btn.addClass('show');
    } else {
      btn.removeClass('show');
    }
  });

  btn.on('click', function(e) {
    e.preventDefault();
    $('html, body').animate({scrollTop:0}, '300');
  });

});

</script>

Давайте поближе посмотрим на этот скрипт. Вы, наверно, заметили первую строку кода:


jQuery(document).ready(function() {

Запускать код внутри этой функции стоит только в том случае, если документ полностью загружен. Это отличный способ предотвратить ошибки, если ваш код JavaScript хочет внести изменения в части веб-страницы, которые не полностью загружены в браузере. Код, который мы запускаем после документа, полностью загружен и состоит из двух основных блоков кода, каждый из которых выполняет свою собственную работу. Первая часть скрипта заставляет нашу кнопку появляться и исчезать после того, как прокрутка страницы достигает определенной точки. Вторая часть делает прокрутку страницы вверх после нажатия на кнопку. Давайте рассмотрим каждый из них подробно.


Появление и исчезновение кнопки

Вот код, который отвечает за эту функцию:

var btn = $('#button');

  $(window).scroll(function() {
    if ($(window).scrollTop() > 300) {
      btn.addClass('show');
    } else {
      btn.removeClass('show');
    }
  });

Сначала мы объявляем переменную btn и назначаем ей ID button, так что нам будет легче обратиться к нему позже в коде. Также это помогает JavaScript быстрее выполнять вычисления. Как только мы сохраним элемент в переменной, JavaScript не будет нуждаться в поиске по всей странице много раз, когда нам нужно будет использовать ее снова в нашем коде.

.scroll()

В jQuery есть удобная функция .scroll().

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

$(window).scroll(function() {

Внутри функции мы постелили утверждение if/else:

if ($(window).scrollTop() > 300) {
      btn.addClass('show');
    } else {
      btn.removeClass('show');
    }

То, что мы пытаемся сделать здесь, это проверить вертикальное положение полосы прокрутки и сделать, чтобы наша кнопка появлялась, когда прокрутка ниже определенной точки, и исчезала, когда она находится выше этой точки.

Чтобы получить текущую позицию полосы прокрутки, мы собираемся использовать встроенный метод jQuery .scrollTop(). Он просто возвращает несколько пикселей, которые скрыты над прокручиваемой областью.

Таким образом, каждый раз, когда мы прокручиваем страницу, JavaScript проверяет, сколько пикселей скрыто, и сравнивает их с числом. В нашем случае это количество до 300, но вы можете изменить его, если хотите.

Если мы пройдем 300px, то мы добавим класс show к нашей кнопке, который заставит её появиться. Если число меньше 300, мы удаляем этот класс. Добавление и удаление классов является еще одной причиной популярности jQuery. Мы можем сделать это с помощью двух простых методов addClass() и removeClass(). Однако у нас пока нет класса show в нашем CSS, поэтому добавим его:

if ($(window).scrollTop() > 300) {
      btn.addClass('show');
    } else {
      btn.removeClass('show');
    }

По умолчанию ваша кнопка будет скрыта, поэтому нам нужно добавить еще несколько правил в элемент #button:

#button {
  transition: background-color .3s, 
    opacity .5s, visibility .5s;
  opacity: 0;
  visibility: hidden;
}

Чтобы сделать переход плавным, давайте добавим еще два значения в атрибут перехода, непрозрачность и видимость, установленные на 0,5 секунды.


Подъём наверх

Вторая часть скрипта позволяет вам подняться наверх, после нажатия на кнопку.

btn.on('click', function(e) {
    e.preventDefault();
    $('html, body').animate({scrollTop:0}, '300');
  });


Первый метод jQuery, который мы видим здесь это on(). Его первым параметром является «click» JavaScript-событие, которое происходит каждый раз, когда мы кликаем мышей в нашем браузере. Второй параметр — это функция обработки, которая запускается, как только происходит событие.

Функция обработки принимает параметр события. Мы можем назвать все, что захотим, но обычно предпочтительнее e или event. Нам нужен параметр события, чтобы передать его функции и использовать для метода preventDefault().

Метод e.preventDefault() предотвращает случайное действие события, например, ссылка не приводит нас к следующей странице. В нашем случае это не имеет решающего значения, поскольку наш якорный элемент не имеет атрибута href и в любом случае не приведет нас к новой странице, но всегда лучше дважды проверить.

.animate()

Метод jQuery .animate() — это тот, который выполняет весь трюк.

$('html, body').animate({scrollTop:0}, '300');

Первый параметр метода .animate() — это список свойств, которые мы должны анимировать. Наше свойство называется scrollTop, и мы хотим, чтобы оно имело значение 0. Тип этого параметра является простым объектом, поэтому нам нужно использовать фигурные скобки и записывать наши значения, используя синтаксис парой ключ / значение.

Второй параметр — это скорость, с которой мы хотим, чтобы наша анимация запускалась. Он измеряется в миллисекундах, и чем выше число, тем медленнее анимация. Значение по умолчанию — 400, но изменим его на 300.

Наконец, мы применяем метод animate к HTML и элементам body на нашей странице.

Теперь каждый раз, когда мы нажимаем кнопку, это возвращает нас в начало страницы.


Демо

Финальную версию вы можете посмотреть в демо CodePen. Я также добавила примеры текста для демонстрации.

Посмотрите на код кнопки «Наверх» Мэтью Кейна (@matthewcain) на CodePen.


Завершение

Кнопка «Наверх» полезный инструмент в дизайне интерфейса страницы. И если на вашем сайте будет такая, она сделает взаимодействие посетителей с сайтом намного удобнее. Этот гайд поможет вам разобраться в CSS и JavaScript, даже если вы не веб-разработчик. Надеюсь, что пост был вам полезен и у вас непременно получится сделать такую кнопку!

2 комментариев

  1. Виктор

    Привет! Я начинающий разработчик. Уже знал ранее как сделать подобное. Зашёл из любопытства. Хорошая статья. Мне понравилась. Обычно комменты не пишу, но в этот раз действительно стоит, т.к. я раскрыл для себя огромную тайну злосчастного е (event). Ранее встречал этот е в с# событиях обработчиков визуальных элементов (речь о winforms), но не понимал почему e. Сколько ж форумов перечитал. Оказалось все так просто. Событие принимает аргумент. Сижу даже смешно над собой). Спасибо TM! Про preventDefault не совсем понятно написано. Прочитал на learn.javascript. А так статья на миллион!)

    • Анна Рогозянская

      Здравствуйте, спасибо за отзыв! Будем стараться и дальше:)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>