Веб

Вертикальная прокрутка CSS: как сделать прокрутку div только по вертикали

Узнайте, как создавать вертикально прокручиваемые div с помощью свойств CSS overflow-y и overflow-x. Полное руководство с примерами и советами по совместимости с браузерами.

Как сделать div только вертикально прокручиваемым в CSS? Я пробовал использовать код <div id="" style="overflow:scroll; height:400px;">, но он позволяет прокрутку в обе стороны. Какое CSS-свойство или значение нужно, чтобы ограничить прокрутку только вертикальным направлением?

Чтобы сделать div прокручиваемым только вертикально с помощью CSS, необходимо использовать свойство overflow-y для вертикальной прокрутки и свойство overflow-x для отключения горизонтальной прокрутки. Правильный подход — установить overflow-y: scroll или overflow-y: auto в сочетании с overflow-x: hidden, чтобы ограничить прокрутку только вертикальным направлением.

Содержание

Понимание свойств CSS Overflow

CSS предоставляет три основных свойства overflow, которые контролируют поведение контента, когда он превышает размеры своего контейнера:

  • overflow: Сокращенное свойство, которое одновременно устанавливает и overflow-x, и overflow-y
  • overflow-x: Контролирует поведение переполнения по горизонтали (слева направо)
  • overflow-y: Контролирует поведение переполнения по вертикали (сверху вниз)

Каждое из этих свойств принимает несколько значений:

  • visible (по умолчанию): Контент не обрезается и может выходить за пределы контейнера
  • hidden: Контент обрезается, и полосы прокрутки не отображаются
  • scroll: Полосы прокрутки всегда отображаются, даже если контент не переполняет
  • auto: Полосы прокрутки отображаются только тогда, когда контент переполняет
  • inherit: Принимает значение переполнения от родительского элемента

Теперь вот где становится интересно. Проблема вашего текущего подхода с использованием overflow: scroll заключается в том, что он применяет одинаковое поведение прокрутки как к горизонтальному, так и к вертикальному направлениям, создавая полосы прокрутки в обоих направлениях, когда контент переполняет в любом из измерений. Это на самом деле довольно распространенная проблема среди разработчиков, которые только знакомятся со свойствами CSS overflow.

Решения для вертикальной прокрутки

Решение 1: Использование overflow-y с overflow-x

Самый прямой подход — явно контролировать каждое направление отдельно:

css
.scrollable-div {
  height: 400px;
  overflow-y: scroll;  /* Включает вертикальную прокрутку */
  overflow-x: hidden; /* Отключает горизонтальную прокрутку */
}

Решение 2: Использование overflow-y: auto

Для более чистого подхода, когда полосы прокрутки появляются только при необходимости:

css
.scrollable-div {
  height: 400px;
  overflow-y: auto;   /* Вертикальная полоса прокрутки только при переполнении контента */
  overflow-x: hidden; /* Нет горизонтальной прокрутки */
}

Решение 3: Использование сокращенного свойства overflow

Также можно использовать сокращенное свойство overflow с отдельными значениями для каждой оси:

css
.scrollable-div {
  height: 400px;
  overflow: hidden auto; /* Первое значение — overflow-x, второе — overflow-y */
}

Честно говоря, хотя overflow: hidden auto и работает, он используется реже и может быть менее читабельным, чем явные свойства overflow-x и overflow-y. Большинство разработчиков, с которыми я работал, предпочитают явный подход для лучшей ясности кода.

Практические примеры и реализация

Базовый вертикально прокручиваемый div

Вот полный пример, который вы можете использовать:

html
<!DOCTYPE html>
<html lang="en">
<head>
    <style>
        .vertical-scroll {
            width: 300px;
            height: 200px;
            border: 2px solid #333;
            padding: 10px;
            overflow-y: auto;  /* Только вертикальная прокрутка */
            overflow-x: hidden; /* Нет горизонтальной прокрутки */
        }
        
        .content {
            /* Контент, превышающий высоту контейнера */
            height: 500px;
            background: linear-gradient(to bottom, #f0f0f0, #e0e0e0);
        }
    </style>
</head>
<body>
    <div class="vertical-scroll">
        <div class="content">
            <p>Этот контент намного выше контейнера, поэтому будет включена вертикальная прокрутка. Однако ширина ограничена, поэтому горизонтальная прокрутка не произойдет.</p>
            <!-- Еще контент... -->
        </div>
    </div>
</body>
</html>

Адаптивная вертикальная прокрутка

Для современного адаптивного дизайна вы можете захотеть объединить вертикальную прокрутку с гибким размером:

css
.responsive-scroll {
    max-height: 400px;
    overflow-y: auto;
    overflow-x: hidden;
    width: 100%;
    /* Другие стили */
}

Многоколоночный макет с вертикальной прокруткой

При работе с колоночными макетами вам может потребоваться обеспечить последовательную вертикальную прокрутку:

css
.column-container {
    display: flex;
    gap: 20px;
}

.scrollable-column {
    flex: 1;
    height: 400px;
    overflow-y: auto;
    overflow-x: hidden;
    border: 1px solid #ddd;
    padding: 10px;
}

Совместимость с браузерами и лучшие практики

Поддержка в разных браузерах

Свойства overflow-x и overflow-y хорошо поддерживаются во всех современных браузерах:

  • Chrome, Firefox, Safari, Edge: Полная поддержка
  • Internet Explorer: Частичная поддержка (IE9+ поддерживает оба свойства)

Согласно документации Mozilla Developer Network, эти свойства имеют отличную совместимость с браузерами и могут использоваться в производственных средах без префиксов поставщиков. Тем не менее, всегда стоит тестировать на целевых браузерах, особенно если вы поддерживаете более старые версии.

Вопросы производительности

При реализации вертикальной прокрутки учтите эти лучшие практики производительности:

  1. Используйте overflow-y: auto вместо overflow-y: scroll, когда это возможно, так как он отображает полосы прокрутки только при необходимости
  2. Избегайте чрезмерных значений высоты, которые вызывают ненужную прокрутку
  3. Рассмотрите CSS containment для лучшей производительности с прокручиваемыми контейнерами:
    css
    .scrollable-div {
      contain: content;
      overflow-y: auto;
      overflow-x: hidden;
    }
    

Вопросы доступности

  • Убедитесь, что прокручиваемый контент имеет соответствующее управление фокусом
  • Предоставьте четкие визуальные индикаторы для прокручиваемых областей
  • Протестируйте навигацию с клавиатуры внутри прокручиваемых контейнеров
  • Рассмотрите атрибуты ARIA для пользовательских реализаций прокрутки

Распространенные проблемы и их решение

Проблема 1: Все еще появляется горизонтальная полоса прокрутки

Если вы все еще видите горизонтальные полосы прокрутки, проверьте наличие:

  • Контента с фиксированной шириной, превышающей контейнер
  • Изображений или элементов, которые слишком широкие
  • Отступов или полей, вызывающих переполнение
  • Проблем с box-sizing

Решение:

css
.scrollable-div {
    box-sizing: border-box; /* Включить отступы и границу в ширину элемента */
    overflow-y: auto;
    overflow-x: hidden;
    /* Добавьте это для обработки проблемного контента */
    word-wrap: break-word;
    white-space: normal;
}

Проблема 2: Поведение прокрутки на сенсорных устройствах

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

css
.scrollable-div {
    -webkit-overflow-scrolling: touch; /* Плавная прокрутка на iOS */
    overflow-y: auto;
    overflow-x: hidden;
}

Проблема 3: Вложенные прокручиваемые контейнеры

При наличии вложенных прокручиваемых элементов поведение прокрутки может быть непредсказуемым. Рассмотрите возможность установки overflow: hidden на родительских контейнерах для иерархического контроля поведения прокрутки.

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

Для более плавного опыта прокрутки, особенно на настольных компьютерах:

css
.scrollable-div {
    overflow-y: auto;
    overflow-x: hidden;
    scroll-behavior: smooth; /* Плавная CSS-прокрутка */
}

Заключение

Чтобы создать div, который прокручивается только вертикально, используйте комбинацию overflow-y: auto (или overflow-y: scroll) и overflow-x: hidden. Этот подход дает вам точный контроль над поведением прокрутки при сохранении чистого и читаемого CSS-кода. Помните о совместимости с браузерами, последствиях для производительности и требованиях доступности при реализации вертикальной прокрутки в ваших веб-проектах.

Источники

  1. Mozilla Developer Network - Overflow CSS Property
  2. MDN - Overflow-x and Overflow-y Properties
  3. W3C CSS Overflow Module Level 3
  4. CSS-Tricks - Complete Guide to CSS Scroll Snap
  5. Can I Use - Overflow Properties
Авторы
Проверено модерацией
Модерация