Е

Техническое руководство проекта secserpr.ru

Как собирался сайт — по шагам, с кодом и пояснениями
← На сайт
Руководство › Часть II. Стили › 08. scroll-top.css

08. scroll-top.css — стили кнопки «Наверх»

Маленький файл, но в нём есть несколько приёмов, которые полезно понять. Кнопка «Наверх» — это круг в правом нижнем углу, который появляется при прокрутке страницы. Пользователь может быстро вернуться к началу.

Зачем это отдельный файл

Технически стили кнопки «Наверх» могли бы жить в style.css. Но мы вынесли их сюда — по одной причине: изоляция.

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

Правило «одна задача — один файл»

Разделяя стили по файлам, мы получаем предсказуемость: если сломалась кнопка «Наверх», смотрим в scroll-top.css. Если сломался футер — в style.css. Нет путаницы «где-то между 500 строками что-то не так».

Полный файл

scroll-top.css
.scroll-top-btn {
  position: fixed;
  bottom: 30px;
  right: 30px;
  width: 52px;
  height: 52px;
  background: #33ff33;
  color: #000000;
  border: none;
  border-radius: 50%;
  cursor: pointer;
  box-shadow: 0 4px 12px rgba(0,0,0,0.2);
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.2s ease;
  z-index: 999;
  transform: translateY(10px);
}

.scroll-top-btn:hover {
  background: #22cc22;
  transform: translateY(0) scale(1.05);
}

.scroll-top-btn.show {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

.scroll-top-btn svg {
  display: block;
  width: 28px;
  height: 28px;
  stroke: #000000;
  stroke-width: 2.5;
}

@media (max-width: 768px) {
  .scroll-top-btn {
    width: 44px;
    height: 44px;
    bottom: 20px;
    right: 20px;
  }
  .scroll-top-btn svg {
    width: 22px;
    height: 22px;
  }
}

Четыре правила и один медиа-запрос. Разбираем.

Правило 1: базовая кнопка

Позиционирование: fixed

CSS
position: fixed;
bottom: 30px;
right: 30px;

position: fixed — «фиксированное позиционирование». Элемент вырывается из общего потока документа и «прилипает» к окну браузера. При прокрутке страницы он остаётся на месте — как приклеенный к стеклу.

bottom: 30px — расстояние от нижнего края окна. right: 30px — от правого. Отступы одинаковые, 30 пикселей — кнопка стоит «на отшибе», не прилипает вплотную к углу.

┌──────────────────────────────────────────────┐ │ окно браузера │ │ │ │ │ │ │ │ ┌────┐ │ │ │ ↑ │ │ ← 30px от края │ └────┘ │ │ ↑ │ │ 30px │ └──────────────────────────────────────────────┘

Форма и размеры

CSS
width: 52px;
height: 52px;
background: #33ff33;
border-radius: 50%;

Размер 52 × 52. Квадрат. border-radius: 50% — «скругление 50% от размера». У квадрата 52×52 это даёт идеальный круг.

Почему 50%, а не 26px? Оба дадут круг. Но 50% — универсально: если размер кнопки изменится (например, до 60×60), 50% всё равно даст круг. А 26px пришлось бы пересчитывать вручную.

Цвета

CSS
background: #33ff33;
color: #000000;

Фон — тот самый зелёный бренда #33ff33, что и у логотипа. Стрелка внутри — чёрная. Высокий контраст: видно издалека.

Цвет — часть системы

Обратите внимание: #33ff33 появляется в проекте четыре раза: в логотипе, в фавиконе, в активной ссылке меню и здесь, у кнопки «Наверх». Это не случайность — это единый визуальный код. Зелёный = «фирменный акцент».

Тень и центрирование

CSS
box-shadow: 0 4px 12px rgba(0,0,0,0.2);
display: flex;
align-items: center;
justify-content: center;

box-shadow — тень. Тут она заметнее, чем у секций: rgba(0,0,0,0.2) вместо 0.05. Кнопка «парит» над страницей — так пользователь понимает, что она «кликабельная» и независимая от контента.

display: flex вместе с align-items: center и justify-content: center центрируют SVG-стрелку внутри круга. Классический приём центрирования — flexbox.

display: flex; align-items: center; ─► ┌─────────┐ justify-content: center; │ ↑ │ ← SVG центрирован └─────────┘

Главное: скрытое состояние

CSS
opacity: 0;
visibility: hidden;

Два свойства — и оба нужны. Разберём почему.

opacity: 0 — полная прозрачность. Кнопка невидима, но всё ещё занимает место на странице.

visibility: hidden — невидимость. Отличие от opacity — visibility: hidden делает элемент недоступным для клика и невидимым для скринридера. Он как будто не существует.

Почему нужно два свойства, а не одно?

Только opacity: 0 Кнопка прозрачная, но КЛИК по ней всё равно сработает. Невидимая кнопка будет неожиданно реагировать на нажатия. Плохо. Только visibility: hidden Кнопка невидима, но НЕ АНИМИРУЕТСЯ через transition — visibility не плавное свойство. Появление будет резким. opacity + visibility opacity — плавная анимация. visibility — защита от нежелательных кликов. Оба — идеально.

Плавность появления: transition

CSS
transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.2s ease;

Что здесь происходит: три свойства перечислены через запятую, каждое со своими сроками и функциями плавности.

ease — тип кривой анимации. Есть варианты: linear (равномерно), ease (медленно-быстро-медленно), ease-in, ease-out. ease — универсальный, даёт ощущение «естественности».

Слой и смещение

CSS
z-index: 999;
transform: translateY(10px);

z-index: 999 — «слой по вертикали». Чем больше число, тем «ближе» элемент к пользователю. 999 — очень высокий, кнопка всегда поверх всего остального. Даже если где-то всплывёт модальное окно, кнопка «Наверх» не спрячется за ним (ну, если у модалки не будет z-index больше).

transform: translateY(10px) — сдвиг на 10 пикселей вниз. Кнопка изначально «спрятана» чуть ниже своего финального места. Когда появится — «поднимется» на эти 10 пикселей.

Состояние «скрыто» Состояние «показано» ────────────────── ─────────────────── opacity: 0 opacity: 1 visibility: hidden visibility: visible translateY(10px) ──► translateY(0) ▲ │ Кнопка поднимается │ вверх на 10px

Приём называется «анимация появления снизу». Кнопка как будто «выглядывает» из-под экрана. Психологически это приятнее, чем простое «проявление» на месте.

Правило 2: hover

CSS
.scroll-top-btn:hover {
  background: #22cc22;
  transform: translateY(0) scale(1.05);
}

При наведении курсора:

Совокупно: кнопка поднимается и чуть увеличивается. Пользователь чувствует обратную связь от интерфейса.

Правило 3: класс .show

CSS
.scroll-top-btn.show {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

Это правило срабатывает, когда у кнопки есть класс show. Класс ставит JavaScript — когда пользователь прокрутил страницу больше чем на 300 пикселей.

Три свойства переключают кнопку из «скрыто» в «показано»:

Пример: как работает появление

Пользователь открыл страницу. Кнопка в состоянии «скрыто». Пользователь прокрутил вниз. JavaScript отследил прокрутку, увидел, что window.pageYOffset > 300, и добавил классу .scroll-top-btn класс .show. CSS-правило .scroll-top-btn.show тут же переключило прозрачность и видимость, и кнопка плавно «выглянула» снизу.

Правило 4: SVG внутри

CSS
.scroll-top-btn svg {
  display: block;
  width: 28px;
  height: 28px;
  stroke: #000000;
  stroke-width: 2.5;
}

Стрелка — это SVG-иконка, вставленная прямо в HTML кнопки. Правила для неё:

Медиа-запрос: мобильная версия

CSS
@media (max-width: 768px) {
  .scroll-top-btn {
    width: 44px;
    height: 44px;
    bottom: 20px;
    right: 20px;
  }
  .scroll-top-btn svg {
    width: 22px;
    height: 22px;
  }
}

На мобильных кнопка чуть меньше и ближе к краю.

Пропорции важнее размеров

Обратите внимание: если кнопка 52×52, а иконка 28×28, то отношение 28/52 ≈ 0.54. После уменьшения: 44×44, иконка 22×22 — отношение 22/44 = 0.5. Почти то же самое. Мы не «сжимаем на глаз», а сохраняем пропорции. Так элемент выглядит естественно в любом размере.

Итог

На этом Часть II. Стили завершена. Мы разобрали оба CSS-файла: style.css (9 секций) и scroll-top.css. Дальше — Часть III. Скрипты, где разберём script.js и scroll-top.js.