Existe uma maneira de tornar uma DIV não selecionável?

140

Aqui estão algumas perguntas interessantes sobre CSS para você!

Eu tenho uma área de texto com um plano de fundo transparente sobrepondo algum texto que eu gostaria de usar como uma espécie de marca d'água. O texto é grande e ocupa a maior parte da área de texto. Parece bom, o problema é que, quando o usuário clica na área de texto, às vezes seleciona o texto da marca d'água. Quero que o texto da marca d'água nunca seja selecionável. Eu esperava que, se algo fosse mais baixo no índice z, não seria selecionável, mas os navegadores não parecem se importar com as camadas do índice z ao selecionar itens. Existe um truque ou maneira de fazê-lo para que este DIV nunca seja selecionável?

Whozumommy
fonte
Você ficaria feliz com uma solução javascript?
joshcomley

Respostas:

203

Eu escrevi uma extensão simples do jQuery para desativar a seleção há algum tempo: Desativando a seleção no jQuery . Você pode invocá-lo através$('.button').disableSelection();

Como alternativa, usando CSS (cross-browser):

.button {
        user-select: none;
        -moz-user-select: none;
        -khtml-user-select: none;
        -webkit-user-select: none;
        -o-user-select: none;
} 
aleemb
fonte
@kasperTaeymans obrigado por apontar isso. atualizou o snippet.
aleemb
@kasperTaeymans Mas está em um rascunho de trabalho do W3C ... eu o incluiria por precaução.
Camilo Martin
2
Para não tirar nada da resposta original, que eu votei, mas tem mais de 3 anos. Então, adicionei uma resposta abaixo ( stackoverflow.com/questions/924916/… ) com uma configuração adicional para a interface de toque.
Anne Gunn
Era isso que eu queria para o cabeçalho móvel de inicialização! Obrigado!
Desenvolvedor
62

O código CSS a seguir funciona em um navegador quase moderno:

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

Para o IE, você deve usar JS ou inserir atributo na tag html.

<div id="foo" unselectable="on" class="unselectable">...</div>
KimKha
fonte
Qual é o objetivo de unselectable="on". Você pode dar uma referência, por favor
usuário
4
Encontrei aqui: msdn.microsoft.com/en-us/library/hh801966(v=vs.85).aspx Mas, na verdade, testei no IE e funciona corretamente.
KimKha
1
Não tenho certeza. Mas <code> unselectable = "on" </code> pode estar incluído no IE, e o validador W3C não aceita esse atributo.
KimKha
Embora funcione em navegadores modernos, ainda não foi especificado pelo W3C.
Ciro Santilli escreveu
41

Apenas atualizando a resposta original e muito votada do aleemb com algumas adições ao css.

Usamos a seguinte combinação:

.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;
}

Recebemos a sugestão de adicionar a entrada webkit-touch em:
http://phonegap-tips.com/articles/essential-phonegap-css-webkit-touch-callout.html

Abr 2015: Apenas atualizando minha própria resposta com uma variação que pode ser útil. Se você precisar tornar o DIV selecionável / não selecionável em tempo real e desejar usar o Modernizr , o seguinte funcionará perfeitamente em javascript:

    var userSelectProp = Modernizr.prefixed('userSelect');
    var specialDiv = document.querySelector('#specialDiv');
    specialDiv.style[userSelectProp] = 'none';
Anne Gunn
fonte
aplicar user-select: nonea um divnão tem efeito algum. tenho certeza que user-selecté apenas para texto. existem outras maneiras de tornar uma divseleção não selecionável?
Oldboy # 18/17
22

Como Johannes já sugeriu, uma imagem de plano de fundo é provavelmente a melhor maneira de conseguir isso apenas no CSS.

Uma solução JavaScript também teria que afetar o "dragstart" para ser eficaz em todos os navegadores populares.

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);

Rico

kim3er
fonte
13

Você pode usar pointer-events: none;no seu CSS

div {
  pointer-events: none;
}
Barragem Linh
fonte
6

você pode tentar isso:

<div onselectstart="return false">your text</div>
Fortega
fonte
1
Ainda é possível selecionar com um clique duplo.
ceving 14/12/2015
6

Uma simples imagem de plano de fundo para a área de texto não seria suficiente?

Joey
fonte
1
Bem, eu quis dizer a marca d'água, mas uma imagem de fundo transparente pode funcionar também. Além disso, você não deve telha imagens muito pequenas como alguns navegadores obter abysmally lenta nesse caso :)
Joey
Especialmente porque um png transparente de 1000x1000 (ou gif) tem apenas 4kb.
21919 Ryan Florence
Mais como 1 KiB, na verdade :-)
Joey
4

Os navegadores WebKit (por exemplo, Google Chrome e Safari) têm uma solução CSS semelhante à Mozilla-user-select: none da Mozilla

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

Também no IOS, se você quiser se livrar das sobreposições cinza semitransparentes que aparecem no toque, adicione css:

-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-touch-callout: none;
Artjom Kurapov
fonte
-1

Usar

onselectstart = "return false"

impede a cópia do seu conteúdo.

Anuraj
fonte
4
Esta solução foi publicada por outras pessoas.
Davidconfused
-1

Certifique-se de definir a posição explicitamente como absoluta ou relativa para que o z-index funcione para a seleção. Eu tive um problema semelhante e isso resolveu para mim.

Eric Grotke
fonte
-2

Não tem certeza do seu caso de uso, mas você pode torná-lo arrastável.

Costa
fonte
É uma resposta desagradável, mas válida.
Rusty