Есть ли способ сделать DIV недоступным для выбора?


144

Вот вам интересный вопрос по CSS!

У меня есть текстовое поле с прозрачным фоном, наложенное на ТЕКСТ, который я хотел бы использовать как своего рода водяной знак. Текст большой и занимает большую часть текстового поля. Выглядит красиво, проблема в том, что когда пользователь нажимает на текстовое поле, он иногда вместо этого выбирает текст водяного знака. Я хочу, чтобы текст водяного знака нельзя было выбирать. Я ожидал, что если что-то будет ниже в z-index, его нельзя будет выбрать, но браузеры, похоже, не заботятся о слоях z-index при выборе элементов. Есть ли уловка или способ сделать так, чтобы этот DIV никогда не выбирался?


Вы были бы довольны решением для javascript?
joshcomley

Ответы:


210

Некоторое время назад я написал простое расширение jQuery, чтобы отключить выделение: Отключение выделения в jQuery . Вы можете вызвать его через$('.button').disableSelection();

В качестве альтернативы, используя CSS (кроссбраузерность):

.button {
        user-select: none;
        -moz-user-select: none;
        -khtml-user-select: none;
        -webkit-user-select: none;
        -o-user-select: none;
} 

@kasperTaeymans спасибо, что указали на это. обновил фрагмент.
алемб

@kasperTaeymans Но он есть в рабочем проекте W3C ... Я бы включил его на всякий случай.
Камило Мартин

2
Чтобы ничего не убирать из исходного ответа, за который я проголосовал, но ему 3+ года. Поэтому я добавил ответ ниже ( stackoverflow.com/questions/924916/… ) с дополнительной настройкой для сенсорного интерфейса.
Anne Gunn

Это то, что я хотел для подвижного модального заголовка начальной загрузки! Благодарность!
DmitryBoyko

63

Следующий код CSS работает почти в современном браузере:

.unselectable {
    -moz-user-select: -moz-none;
    -khtml-user-select: none;
    -webkit-user-select: none;
    -o-user-select: none;
    user-select: none;
}

Для IE вы должны использовать JS или вставить атрибут в тег html.

<div id="foo" unselectable="on" class="unselectable">...</div>

Какая цель unselectable="on". Дайте ссылку, пожалуйста
пользователь

4
Я нашел здесь: msdn.microsoft.com/en-us/library/hh801966(v=vs.85).aspx Но я действительно тестировал в IE, и он работает правильно.
KimKha

1
Я не уверен. Но <code> unselectable = "on" </code> может быть включен в IE, а валидатор W3C не принимает этот атрибут.
KimKha

Хотя он работает в современных браузерах, он еще не определен W3C.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

44

Просто обновите оригинальный, получивший множество голосов ответ aleemb с парой дополнений к css.

Мы использовали следующую комбинацию:

.unselectable {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    -o-user-select: none;
    user-select: none;
}

Мы получили предложение добавить запись webkit-touch от:
http://phonegap-tips.com/articles/essential-phonegap-css-webkit-touch-callout.html

2015, апрель: просто обновляю свой ответ, добавляя вариант, который может пригодиться. Если вам нужно сделать выбор / отмену выбора DIV на лету и вы хотите использовать Modernizr , в javascript аккуратно работает следующее:

    var userSelectProp = Modernizr.prefixed('userSelect');
    var specialDiv = document.querySelector('#specialDiv');
    specialDiv.style[userSelectProp] = 'none';

применение user-select: noneк a не divимеет никакого эффекта. я почти уверен, что user-selectэто только для текста. есть ли другие способы сделать divневозможным выбор?
oldboy

22

Как уже предположил Йоханнес, фоновое изображение, вероятно, лучший способ добиться этого только в CSS.

Решение JavaScript также должно влиять на «перетаскивание», чтобы оно было эффективным во всех популярных браузерах.

JavaScript:

<div onselectstart="return false;" ondragstart="return false;">your text</div>

jQuery:

var _preventDefault = function(evt) { evt.preventDefault(); };
$("div").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);

Богатый


14

Вы можете использовать pointer-events: none;в своем CSS

div {
  pointer-events: none;
}

Это именно то, что мне нужно, чтобы мой <hr /> не захватил выделение из скрытого div. Благодарность!
Джейсон

6

вы можете попробовать это:

<div onselectstart="return false">your text</div>

1
Еще можно выбрать двойным щелчком.
се

6

Разве не хватит простого фонового изображения для текстовой области?


1
Ну, я скорее имел в виду водяной знак, но прозрачное фоновое изображение тоже может работать. Также не стоит размещать очень маленькие изображения мозаикой, так как некоторые браузеры в этом случае работают ужасно медленно :)
Джоуи,

Тем более, что прозрачный png (или gif) размером 1000x1000 всего 4кб.
Райан Флоренс,

На самом деле больше похоже на 1 KiB :-)
Joey

4

Браузеры WebKit (например, Google Chrome и Safari) имеют решение CSS, аналогичное Mozilla -moz-user-select: none

.no-select{    
    -webkit-user-select: none;
    cursor:not-allowed; /*makes it even more obvious*/
}

2

Также в IOS, если вы хотите избавиться от серых полупрозрачных оверлеев, появляющихся при касании, добавьте css:

-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-touch-callout: none;

-1

Использовать

onselectstart = "вернуть ложь"

это предотвращает копирование вашего контента.


4
Это решение было опубликовано другими.
dazedconfused

-1

Убедитесь, что вы явно задали положение как абсолютное или относительное, чтобы z-index работал при выборе. У меня была аналогичная проблема, и это решило ее для меня.


-3

Не уверен в вашем варианте использования, но вы можете сделать его перетаскиваемым.


Это неприятный, но верный ответ.
Расти
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.