Para âncoras que funcionam como botões (por exemplo, Perguntas , Tags , Usuários , etc. na parte superior da página Estouro de pilha) ou guias, existe uma maneira padrão de CSS de desativar o efeito de destaque se o usuário selecionar acidentalmente o texto?
Sei que isso pode ser feito com JavaScript, e um pouco de pesquisa no Google resultou no Mozilla-only -moz-user-select
opção .
Existe uma maneira compatível com os padrões para fazer isso com CSS e, se não, qual é a abordagem de "melhores práticas"?
css
cross-browser
highlight
textselection
Peter Mortensen
fonte
fonte
::selection { background: transparent; } ::-moz-selection { background: transparent; }
postcss
eautoprefixer
e conjunto versão do navegador, em seguida,postcss
fazer tudo legal.Respostas:
ATUALIZAÇÃO janeiro de 2017:
De acordo com Posso usar , o
user-select
atualmente é suportado em todos os navegadores, exceto o Internet Explorer 9 e versões anteriores (mas, infelizmente, ainda precisa de um prefixo de fornecedor).Todas as variações corretas de CSS são:
Observe que
user-select
está em processo de padronização (atualmente em um rascunho de trabalho do W3C ). Não é garantido que funcione em todos os lugares, e pode haver diferenças na implementação entre navegadores e, no futuro, os navegadores podem dispensar o suporte.Mais informações podem ser encontradas na documentação do Mozilla Developer Network .
fonte
<div onselectstart="return false;">
à minha div principal.standard-user-select
. então não teremos esses problemas. embora para compatibilidade com versões anteriores também devamos incluir os outros. então agora o código se torna-webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; standard-user-select: none;
. ah, muito melhor.Na maioria dos navegadores, isso pode ser alcançado usando variações proprietárias na
user-select
propriedade CSS , originalmente propostas e depois abandonadas no CSS 3 e agora propostas no nível 4 da UI do CSS :Para Internet Explorer <10 e Opera <15, você precisará usar o
unselectable
atributo do elemento que você deseja que não seja selecionado. Você pode definir isso usando um atributo em HTML:Infelizmente, essa propriedade não é herdada, o que significa que você deve colocar um atributo na tag de início de cada elemento dentro do
<div>
. Se isso for um problema, você poderá usar o JavaScript para fazer isso recursivamente para os descendentes de um elemento:Atualização 30 de abril de 2014 : Esse percurso de árvore precisa ser executado novamente sempre que um novo elemento é adicionado à árvore, mas parece que, a partir de um comentário de @Han, é possível evitar isso adicionando um
mousedown
manipulador de eventos que defineunselectable
o destino do evento. Consulte http://jsbin.com/yagekiji/1 para obter detalhes.Isso ainda não cobre todas as possibilidades. Embora seja impossível iniciar seleções em elementos não selecionáveis, em alguns navegadores (Internet Explorer e Firefox, por exemplo), ainda é impossível impedir seleções que iniciam antes e terminam após o elemento não selecionável sem tornar todo o documento não selecionável.
fonte
*.foo
e.foo
são precisamente equivalentes (no segundo caso, o seletor universal (*
) está implícito), impedindo as peculiaridades do navegador, não vejo como*
isso prejudique desempenho. É um hábito de longa data meu incluir o*
que eu originalmente comecei a fazer para facilitar a leitura: ele declara explicitamente que o autor pretende combinar todos os elementos.Uma solução JavaScript para o Internet Explorer é:
fonte
ondragstart
!body.onselectstart = function(e) { if (e.target.nodeName != "INPUT" && e.target.nodeName != "TEXTAREA") { e.preventDefault(); return false; } return true; }
input
elementos, mesmo que eu useuser-select: none
. eu preciso saber como evitar issoAté que a propriedade user-select do CSS 3 fique disponível, os navegadores baseados no Gecko suportam a
-moz-user-select
propriedade que você já encontrou. Os navegadores WebKit e Blink suportam o-webkit-user-select
propriedade.Obviamente, isso não é suportado em navegadores que não usam o mecanismo de renderização Gecko.
Não existe uma maneira rápida e fácil de cumprir os "padrões"; usar JavaScript é uma opção.
A verdadeira questão é: por que você deseja que os usuários não sejam capazes de destacar e, presumivelmente, copiar e colar certos elementos? Não me deparei com uma única vez que desejava não permitir que os usuários destacassem uma determinada parte do meu site. Vários de meus amigos, depois de passar muitas horas lendo e escrevendo códigos, usarão o recurso de destaque como uma maneira de lembrar onde estavam na página ou fornecer um marcador para que seus olhos saibam onde procurar em seguida.
O único lugar em que pude ver isso útil é se você tiver botões para formulários que não devem ser copiados e colados se um usuário copiar e colar o site.
fonte
Se você deseja desativar a seleção de texto em tudo, exceto nos
<p>
elementos, é possível fazer isso em CSS (observe o-moz-none
que permite substituir os subelementos, o que é permitido em outros navegadores comnone
):fonte
p, input { -webkit-user-select: text; -khtml-user-select: text; -moz-user-select: text; -o-user-select: text; user-select: text; }
-moz-none
enone
são os mesmos.ul>* { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: -moz-none; -o-user-select: none; user-select: none; }
[seleciona tudo em uma lista não ordenada e a torna não selecionável, em vez de destruir toda a árvore da visualização.] Obrigado pela lição. Minha lista de botões está ótima e está respondendo corretamente à tela tocando e pressionando, em vez de iniciar um IME (widgets da área de transferência do Android).Nas soluções das respostas anteriores, a seleção é interrompida, mas o usuário ainda pensa que você pode selecionar o texto porque o cursor ainda muda. Para mantê-lo estático, você precisará definir o cursor CSS:
Isso tornará seu texto totalmente plano, como seria em um aplicativo de desktop.
fonte
user-select: none;
, pensando que o padrão seria adotado até agora, mas, infelizmente, não. Faz você se perguntar o que as pessoas no comitê de padrões ainda poderiam estar debatendo. "Não, pessoal ... eu realmente acho que deveria seruser-select: cant;
porque é mais descritivo, sabe?" "Já falamos sobre isso, Mike. Teríamos que omitir o apóstrofo, e isso é péssimo!" "Chega, pessoal! Vamos deliberar sobre esse assunto novamente no próximo mês. A reunião do Comitê de Padrões foi encerrada!"Você pode fazer isso no Firefox e Safari (Chrome também?)
fonte
Solução alternativa para o WebKit :
Eu o encontrei em um exemplo do CardFlip.
fonte
transparent
no lugar de rgba também funciona no Chrome 42 no Android.Eu gosto da solução híbrida CSS + jQuery.
Para tornar todos os elementos internos
<div class="draggable"></div>
não selecionáveis, use este CSS:E então, se você estiver usando jQuery, adicione isso dentro de um
$(document).ready()
bloco:Eu acho que você ainda deseja que quaisquer elementos de entrada sejam interativos, daí o
:not()
pseudo-seletor. Você poderia usar'*'
se não se importa.Advertência: o Internet Explorer 9 pode não precisar dessa parte extra do jQuery, portanto, convém adicionar uma verificação de versão.
fonte
-moz-user-select: Normal;
jQuery.browser
foi descontinuado a partir da versão 1.3 e foi removido na versão 1.9 - api.jquery.com/jQuery.browserNão é o melhor caminho, no entanto.
fonte
title
como atributo.user-select
não funcionam.Você pode usar CSS ou JavaScript para isso.
A maneira JavaScript é suportada em navegadores mais antigos , como versões antigas do Internet Explorer, mas se não for o seu caso, use a maneira CSS:
HTML / JavaScript:
HTML / CSS:
fonte
Além disso, para o Internet Explorer, você precisa adicionar a pseudo classe
focus
(.ClassName: focus) eoutline-style: none
.fonte
className
classe. Veja este JSBin .Tente inserir essas linhas no CSS e chame a propriedade "disHighlight" na classe:
fonte
Uma atualização rápida de hackers
Se você usar o valor
none
para todas asuser-select
propriedades CSS (incluindo os prefixos do navegador), haverá um problema que ainda pode ocorrer por isso.Como o CSS-Tricks diz, o problema é:
O WebKit ainda permite que o texto seja copiado, se você selecionar elementos ao seu redor.
Você também pode usar o abaixo para
enforce
que um elemento inteiro seja selecionado, o que significa que, se você clicar em um elemento, todo o texto envolvido nesse elemento será selecionado. Para isso, basta alterar o valornone
paraall
.fonte
Para aqueles que têm problemas para conseguir o mesmo no navegador Android com o evento de toque, use:
fonte
Se você estiver usando Menos e Bootstrap, poderá escrever:
fonte
fonte
Trabalhando
CSS:
Isso deve funcionar, mas não funcionará para os navegadores antigos. Há um problema de compatibilidade do navegador.
fonte
This is because through our site compatibility work, we have experienced that many authors of (especially mobile) sites only use -webkit- prefixed CSS, thereby ignoring other vendor prefixes and not even including an unprefixed equivalent. This leads to a reduced user experience on Opera and Firefox, which don’t receive the same shiny effects such as transitions, gradients and the like, even if the browser supported those effects.
Com SASS (sintaxe SCSS)
Você pode fazer isso com um mixin :
Em uma tag HTML:
Experimente neste CodePen .
Se você estiver usando um autoprefixer, poderá remover outros prefixos.
Compatibilidade do navegador aqui .
fonte
Além da propriedade somente do Mozilla, não, não há como desativar a seleção de texto apenas com CSS padrão (a partir de agora).
Se você perceber, o Stack Overflow não desabilita a seleção de texto para os botões de navegação, e eu recomendaria não fazer isso na maioria dos casos, pois modifica o comportamento normal da seleção e o conflito com as expectativas do usuário.
fonte
Isso funciona em alguns navegadores:
Basta adicionar os elementos / IDs desejados na frente dos seletores separados por vírgulas sem espaços, da seguinte forma:
As outras respostas são melhores; isso provavelmente deve ser visto como último recurso / alcance.
fonte
Suponha que haja dois
div
s assim:Defina o cursor como padrão para que ele dê uma sensação não selecionável ao usuário.
fonte
Isso será útil se a seleção de cores também não for necessária:
... todas as outras correções do navegador. Ele funcionará no Internet Explorer 9 ou posterior.
fonte
color: inherit;
talvez.Adicione isso à primeira div na qual você deseja desativar a seleção de texto:
fonte
NOTA:
A resposta correta está correta, pois impede que você possa selecionar o texto. No entanto, isso não impede que você possa copiar o texto, como mostrarei nas próximas capturas de tela (a partir de 7 de novembro de 2014).
Como você pode ver, não conseguimos selecionar os números, mas conseguimos copiá-los.
Testado em: Ubuntu , Google Chrome 38.0.2125.111.
fonte
Para obter o resultado que eu precisava, descobri que precisava usar ambos
::selection
euser-select
fonte
Isso é feito facilmente com:
Alternativamente:
Digamos que você tenha um
<h1 id="example">Hello, World!</h1>
. Você terá que remover o HTML internoh1
, nesse caso Olá, Mundo . Então você terá que ir para CSS e fazer o seguinte:Agora, ele simplesmente pensa que é um elemento de bloco, e não um texto.
fonte
Isso não é CSS, mas vale a pena mencionar:
Desativar seleção da interface do usuário do jQuery :
fonte
Verifique minha solução sem JavaScript:
jsFiddle
Menu pop-up com minha técnica aplicada: http://jsfiddle.net/y4Lac/2/
fonte
Embora esse pseudoelemento estivesse nos rascunhos do nível 3 dos seletores de CSS, ele foi removido durante a fase de recomendação do candidato, pois parecia que seu comportamento era subespecificado, especialmente com elementos aninhados, e a interoperabilidade não foi alcançada.
Está sendo discutido em Como :: seleção funciona em elementos aninhados .
Apesar de estar sendo implementado nos navegadores, você pode criar uma ilusão de que o texto não está sendo selecionado usando a mesma cor e cor de plano de fundo na seleção do design da guia (no seu caso).
Design CSS normal
Na seleção
Não permitir que os usuários selecionem o texto levantará problemas de usabilidade.
fonte