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?


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

@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>

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

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


13

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

div {
  pointer-events: none;
}

6

você pode tentar isso:

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

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?


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*/
}

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;

-1

Usar

onselectstart = "return false"

impede a cópia do seu conteúdo.


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.


-2

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


É uma resposta desagradável, mas válida.
Rusty
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.