A habilidade de destacar texto e outros objetos foi formada entre os usuários de computador há muitos anos. Destacamos o conteúdo das páginas da web por vários motivos. Talvez você precise copiar o texto e citá-lo em algum lugar, talvez - é simplesmente mais fácil para alguém ler o texto, destacando seus fragmentos. Em dispositivos móveis, no entanto, destacando algo mais difícil. Por exemplo, isso me irrita. Não gosto de destacar o conteúdo das páginas da web no telefone. Esta operação parece estar de alguma forma "errada". Neste artigo, falarei sobre tudo o que você precisa saber sobre seleções de estilo com CSS. Em particular, falaremos sobre o pseudo-elemento e a propriedade
::selection
user-select
. Este artigo tem como objetivo mostrar a todos que desejam que o CSS trabalhe com seleções e como usar métodos diferentes para trabalhar com seleções.O básico
No MDN, você pode aprender que um pseudoelemento ::selection
permite aplicar estilos a partes de um documento que foi selecionado pelo usuário (por exemplo, usando o mouse).Para usá-lo, ::selection
basta usar a seguinte construção:p::selection {
color: #fff;
background-color: #000;
}
Texto selecionadoAqui está um exemplo com o qual você pode experimentar.Propriedades suportadas :: seleção
Vale ressaltar que o pseudoelemento ::selection
suporta apenas propriedades color
, background
e text-shadow
.Personalize seus próprios efeitos de seleção
E se precisarmos fazer a seleção parecer especial? Por exemplo, para que a seleção tenha uma certa altura ou algum histórico interessante? Veja a figura a seguir.Um exemplo de uma seleção especial de seleçãoIsso é possível, embora exija algum esforço. Veja como é feita a seleção mostrada acima:- Um pseudoelemento é adicionado, com o mesmo texto que selecionamos. Em seguida, o pseudoelemento é definido como uma propriedade
height: 50%
e uma cor de fundo branco. - O pseudoelemento está localizado acima do texto de origem.
Se você agora selecionar o texto, o pseudoelemento irá sobrepor 50% do texto na vertical. Isso nos permite simular o efeito que precisamos.p {
position: relative;
color: #fff;
}
p:after {
content: attr(data-content);
position: absolute;
color: #000;
top: 0;
left: 0;
width: 100%;
height: 50%;
background-color: #fff;
}
p::selection {
background: rgba(76, 125, 225, 0.18);
}
Eu aprendi sobre essa técnica aqui .Outra opção para esta seleção é apresentada abaixo. Aqui, em vez de uma seleção sólida, implementei a seleção como um gradiente de CSS. O ponto aqui é usar um gradiente de branco com uma altura de 50% e preencher o elemento uma vez com a imagem de plano de fundo usando o valor no-repeat
ao definir a propriedade background
.h1:after {
content: attr(data-content);
position: absolute;
color: #000;
top: 0;
left: 0;
width: 100%;
background: linear-gradient(#fff, #fff) top/100% 50% no-repeat;
}
A figura a seguir ilustra essa técnica.Implementando o destaque do gradienteEspero que eu tenha conseguido explicar claramente essa idéia. Aqui está um exemplo de trabalho.Animação de seleção
Trabalhando no exemplo anterior, fiz a seguinte pergunta: "É realista animar a seleção?". Por exemplo, no processo de seleção de texto, a altura da seleção é de 50%. E quando o ponteiro do mouse é movido para o lado, a altura da seleção aumenta para 80%. Como fazer isso? Mas assim:p {
transition: background 0.3s ease-out;
}
p:hover:after {
background-size: 100% 80%;
}
Texto no processo de seleçãoTexto após a seleção ser concluídaAqui está um vídeo que demonstra a seleção animada.Texto de várias linhas
Infelizmente, a técnica de ajuste de seleção acima não é adequada para texto de várias linhas. No entanto, para implementar algo semelhante a esse texto, você precisa recorrer aos recursos do JavaScript e colocar cada palavra em um elemento inline (minúsculo), por exemplo, em <span>
. Depois que cada palavra aparece em seu próprio elemento <span>
, um pseudoelemento deve ser adicionado a cada um desses elementos. E depois disso, o efeito descrito acima pode ser aplicado ao texto de múltiplas linhas.Aqui está um script para colocar cada palavra em um <span>
contêiner:let paragraph = document.querySelector(".text");
const words = paragraph.textContent.split(" ");
paragraph.innerHTML = "";
words.forEach(function (word) {
let wordItem = document.createElement("span");
wordItem.setAttribute("data-word", word);
wordItem.innerHTML = word + " ";
paragraph.appendChild(wordItem);
});
Depois disso, os elementos <span>
devem ser estilizados. Em seguida, para cada um deles, você precisa adicionar um pseudoelemento:span {
position: relative;
font-size: 1.25rem;
line-height: 1.4;
}
span::after {
content: attr(data-word);
position: absolute;
left: 0;
right: 0;
top: -0.28em;
height: 75%;
padding-top: 0.14em;
background: #fff;
pointer-events: none;
}
span::selection {
background: rgba(#4C7DE1, 0.18);
}
Se você observar esse design na prática, verifica-se que ele funciona, mas não exatamente como você poderia esperar. Um exemplo de destaque de texto com várias linhas é mostrado abaixo. Você pode perceber que a seleção parece irregular.Seleçãonão homogênea Eu diria que essa seleção de múltiplas linhas não é muito boa e que não deve ser usada em escala global. Talvez deva ser usado apenas, digamos, para organizar a seleção de um parágrafo específico.Aqui, com essa seleção, você pode experimentar.Uso criativo :: seleção e sombra de texto
Como uma das propriedades que o pseudoelemento suporta ::selection
é text-shadow
que podemos tentar obter alguns efeitos interessantes usando algumas sombras do texto. Estamos explorando as possibilidades que essa idéia nos abre.▍ Destaque com longas sombras
O texto selecionado lança longas sombras.Veja como implementar esse efeito:p::selection {
color: #444444;
background: #ffffff;
text-shadow: 1px 0px 1px #cccccc, 0px 1px 1px #eeeeee, 2px 1px 1px #cccccc, 1px 2px 1px #eeeeee, 3px 2px 1px #cccccc, 2px 3px 1px #eeeeee, 4px 3px 1px #cccccc, 3px 4px 1px #eeeeee, 5px 4px 1px #cccccc, 4px 5px 1px #eeeeee, 6px 5px 1px #cccccc, 5px 6px 1px #eeeeee, 7px 6px 1px #cccccc;
}
Effect Efeito de texto de estrutura de tópicos
O texto selecionado torna-se contornoEsta ideia foi encontrada neste artigo. Estamos falando do fato de que, usando a propriedade,text-shadow
você pode simular o efeito do texto de estrutura de tópicos.p::selection {
color: #fff;
text-shadow:
-1px -1px 0 #000,
1px -1px 0 #000,
-1px 1px 0 #000,
1px 1px 0 #000;
}
Effect Efeito de desfoque
O texto selecionado parece desfocado.Outroefeito interessante que pode ser aplicado ao texto selecionado é desfocá-lo. A linha inferior é usar a propriedade ao definir a cor do textocolor: transparent
. As sombras definidas com a ajudatext-shadow
não desaparecerão em lugar algum, o que dará o efeito desejado.p::selection {
color: transparent;
text-shadow: 0 0 3px #fff;
}
Tenho certeza de que você poderá criar muitos outros exemplos de text-shadow
seleções de estilo. Esta propriedade nos oferece possibilidades ilimitadas.Textos de sombra e desempenho
Não é recomendável usar estilos muito complexos ao personalizar text-shadow
. O fato é que o entusiasmo excessivo por essa propriedade leva a problemas de desempenho. Aqui está um vídeo mostrando um exemplo de tais problemas.Usando estilos muito sofisticados para personalizar a seleção de textoO efeito neon apresentado aqui é muito complexo. Observe que, quando esse texto é selecionado, há um atraso perceptível entre o momento em que o texto é selecionado e o momento em que a estilização é aplicada. Além disso, preste atenção ao fato de que o que não deve aparecer na parte superior e esquerda. Portanto, peço que você o use comtext-shadow
cuidado.Os elementos do formulário se destacam?
Uma resposta curta para a pergunta no título desta seção será "sim". Parece-me que isso está errado: você seleciona a página, mas acontece que o conteúdo dentro dos campos de entrada também é destacado. Aqui está como fica.O conteúdo dentro dos campos de entrada é destacado eaqui também é possível selecionar o texto dentro do botão. Na seção dedicada auser-select
, discutiremos se os usuários devem ou não destacar as formas dos elementos.Aqui está um exemplo.Investigando a Propriedade Selecionada pelo Usuário
A propriedade user-select
nos permite definir a capacidade de selecionar texto específico pelo usuário. Essa propriedade pode ser útil para desativar a capacidade de selecionar texto, o que pode ser útil para limitar a capacidade do usuário de selecionar materiais localizados próximos um do outro. Aqui está um padrão que descreve user-select
.Esta propriedade pode ter os seguintes valores: none, auto, text, contain, all
.Casos de uso selecionados pelo usuário
ExtTexto e ícone
Se o elemento tiver texto e um ícone - na forma de um símbolo ou ícone retirado de alguma fonte, esse ícone será destacado quando o texto for selecionado. Considere o exemplo mostrado na figura a seguir.Botão com texto e íconeAqui está o código para este botão:<button>Our Services<span aria-hidden="true">▼</span></button>
Quando você seleciona este item, ele se parece com o mostrado abaixo.Botão dedicadoIsso é completamente desnecessário. Observe que a marcação usa um atributoaria-hidden
que oculta o ícone dos leitores de tela. Para resolver o problema de destacar o que você não precisa destacar, podemos usar o seguinte estilo:button span[aria-hidden="true"] {
user-select: none;
}
Isso permite proibir a seleção do ícone. E, ao mesmo tempo, que se ligam a proibição de seleção para o atributo aria-hidden
. Como resultado, tudo o que não deve se destacar, provavelmente, não deve estar visível para os leitores de tela.▍ Bandeiras
Esse comportamento das bandeiras me incomoda quando, ao definir ou desmarcar uma bandeira, eu acidentalmente seleciono o texto de sua descrição. Aqui está como fica.O texto da descrição do sinalizador é selecionado aleatoriamente.Você poderesolver esse problema denominando o elemento da<label>
seguinte maneira:label {
user-select: none;
}
All Destaque todo o texto
O valor all
que uma propriedade pode receber user-select
permite obter um efeito interessante. Se o elemento pai tiver essa propriedade com esse valor, todo o texto contido nesse elemento poderá ser selecionado com um clique. Isso pode ser útil para trabalhar com conteúdo de texto, que deve ser destacado por inteiro. Por exemplo, para destacar fragmentos de código disponíveis em uma página:.embed-code {
user-select: all;
}
Um fragmento de texto criado com esse estilo pode ser selecionado com um clique.Aplicativos da web
O aplicativo da web deve ser percebido pelo usuário como um aplicativo real. É possível selecionar o texto do botão em aplicativos regulares? Não, você não pode. É importante que os aplicativos da Web reflitam os recursos familiares dos aplicativos regulares, mesmo que sejam projetados usando HTML e CSS.Considere alguns exemplos da vida.▍Slack
No Slack, você pode realçar rótulos e campos de entrada. No entanto, os textos dos botões não são destacados.As legendas dos botões não são destacadas.Veja outro exemplo.A assinatura na barra de título da janela modal é destacada.Adata do bate-papo não pode ser selecionada.A data não pode ser alocadaEm geral - me parece estranho que no aplicativo você possa selecionar alguns textos que, ao que parece, não devem apoiar a seleção. Existem lugares na interface do Slack em que é usadouser-select: none
, mas há menos lugares do que você poderia esperar. Por exemplo, para mim, como usuário, não há benefício em destacar o título de uma janela modal.▍Noção
A abordagem para a seleção de elementos implementados no Noção, eu gosto mais. Esse aplicativo da Web é mais como um aplicativo real, e não como um site, qualquer parte do qual pode ser destacada.O que não deve se destacar não se destaca:nem um único fragmento de texto é destacado nesta figura. É exatamente isso que você pode esperar de um aplicativo.Não use a seleção global desativada
Não é recomendável desativar a seleção globalmente. Ao usar a seleção de desativação, tente desativá-la apenas para elementos para os quais não faz sentido. Para fazer isso, você pode criar uma classe auxiliar. Por exemplo - isto:.disable-selection {
-webkit-user-select:text;
-moz-user-select:text;
-ms-user-select:text;
user-select:text;
}
Padrão ruim
Há um padrão UX que eu realmente não gosto. Consiste em mostrar um aviso ao tentar realçar o texto. Isso irrita e faz o usuário sentir como se estivesse tentando controlar sua interação com o site. Um exemplo desse padrão é mostrado abaixo.Desativar realce com exibição de notificaçãoNão faça isso.Destaque em dispositivos móveis
Há uma propriedade -webkit-touch-callout
para o iOS Safari que deve desativar a exibição da dica de ferramenta padrão exibida quando o texto é selecionado. Tentei usar essa propriedade, mas ela não funciona.p {
-webkit-touch-callout: none;
}
Os estilos ::selection
também não funcionam.E a propriedade user-select: none
funciona como esperado.Tentei encontrar um exemplo real ilustrando esse problema. Copiei um pedaço de texto da Wikipedia. Ao mesmo tempo, o texto que era completamente desnecessário para mim foi copiado (listen)
. Isso é chato.Juntamente com o texto útil, ele é copiado e (escuta)Em vez de permitir que o usuário copie essa “escuta”, seria melhor adicionar um estilo a esse elementouser-select: none
. Como resultado, ao copiar texto contendo esse elemento, ele não será copiado.Sumário
Aqui, examinamos os métodos para personalizar o realce dos elementos da página da web usando CSS. Você pode estar interessado em olhar para este material.Queridos leitores! Como você configura a seleção de texto em seus projetos?