Отключение выделения текста в HTML с помощью CSS

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам потребовалось запретить возможность выделения текста на вашем сайте, примените CSS свойство user-select: none;. Ниже представлен пример, как отключить выделение текста на всей странице:

CSS
Скопировать код
* {
  user-select: none; /* Искусство невозможности выделения */
}
Кинга Идем в IT: пошаговый план для смены профессии

Поддержка устаревших браузеров

В старыми версиями браузеров, такими как Internet Explorer или Opera, для отключения выделения используется атрибут unselectable. Рассмотрим пример:

HTML
Скопировать код
<div unselectable="on" class="no-select">
  Не трогать (вспоминаем перевод из песни? Нет? Оставим это).
</div>
JS
Скопировать код
var elems = document.querySelectorAll('.no-select');
Array.prototype.forEach.call(elems, function(el) {
  el.setAttribute('unselectable', 'on');
});

Невозможность выделения и динамическое содержимое

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

JS
Скопировать код
function makeUnselectable(node) {
    if (node.nodeType == 1) {
        node.setAttribute("unselectable", "on");
    }
    var child = node.firstChild;
    while (child) {
        makeUnselectable(child);
        child = child.nextSibling;
    }
}

// Пример использования:
makeUnselectable(document.getElementById('content'));

Предотвращение событий mousedown на уровне обработки событий

В случаях, когда CSS не справляется с задачей, JavaScript приходит на помощь, чтобы запретить перетаскивание элементов:

JS
Скопировать код
document.addEventListener('mousedown', function(e) {
  e.preventDefault();  // Запрещает выделение или перетаскивание
  e.stopPropagation(); // Прекращает дальнейшее распространение события
}, false);

Использование jQuery упрощает управление подобными событиями:

JS
Скопировать код
$(document).on('mousedown', function(e) {
  e.preventDefault();
}).on('mouseup', function() {
  $(this).off('mousedown');
});

Префиксы производителей и псевдо-стили выделения

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

CSS
Скопировать код
.no-select {
  -webkit-user-select: none; /* Safari */
  -moz-user-select: none;    /* Firefox */
  -ms-user-select: none;     /* IE 10+ и Edge */
  user-select: none;         /* Общепризнанный формат */
}

Если вы ранее стилизовали выделение с помощью ::selection или ::-moz-selection, то не забудьте соответствующим образом настроить их:

CSS
Скопировать код
.no-select::selection,
.no-select::-moz-selection {
  background: none;
}

Пользовательский опыт и доступность

Помните о важности пользовательского опыта и доступности при отключении выделения текста. Любые ограничения должны быть аргументированы с точки зрения UX.

Другие способы предотвращения взаимодействия

Чтобы запретить перетаскивание изображений без воздействия на выделение текста, мы предлагаем следующее решение:

CSS
Скопировать код
img {
  pointer-events: none; /* Перетаскивание изображений запрещено */
}

В старых браузерах можно использовать прозрачное наложение:

HTML
Скопировать код
<img src="image.jpg" draggable="false">
<div class="overlay" style="position: absolute; width: imageWidth; height: imageHeight; top: imageTop; left: imageLeft;"></div>

Визуализация

Ваш сайт – это своего рода музей:

Markdown
Скопировать код
До: 🖼️🔓 – Взаимодействие без ограничений

После добавления user-select: none;:

CSS
Скопировать код
.exhibit { user-select: none; }

Страница таким образом преобразуется:

Markdown
Скопировать код
После: 🖼️🔒 – Только просмотр, без возможности прикоснуться

Ваши тексты защищены, как настоящие произведения искусства. 🚫👆

Точность поведения при выделении

Динамические элементы и стандарты обновления

В динамическом контенте своевременное обновление пользовательского интерфейса обеспечит плавность взаимодействия:

JS
Скопировать код
document.addEventListener('mousemove', function(e) {
  // Здесь укажите логику обновления интерфейса
});

Уровни изображений с использованием z-index

При наличии слоевых элементов используйте z-index для управления их уровнями:

CSS
Скопировать код
.overlay {
  z-index: 10; /* Закладка должна находиться выше изображения, которое она перекрывает */
}

Удаление слушателей событий

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

JS
Скопировать код
$(window).on('mouseup', function() {
  $(document).off('mousemove'); /* Удаляем ненужные обработчики */
});

Полезные материалы

  1. user-select – CSS: Cascading Style Sheets | MDN
  2. user-select | CSS-Tricks
  3. CSS user-select property | W3Schools
  4. How to disable text selection highlighting – Stack Overflow
  5. Selection and Range | JavaScript.info
  6. "user-select" | Can I use... Support tables for HTML5, CSS3, etc