Pour les ancres qui agissent comme des boutons (par exemple, des questions , des balises , des utilisateurs , etc. en haut de la page Débordement de pile) ou des onglets, existe-t-il un moyen standard CSS de désactiver l'effet de surbrillance si l'utilisateur sélectionne accidentellement le texte?
Je me rends compte que cela pourrait être fait avec JavaScript, et un peu de recherche sur Google a donné l' -moz-user-select
option Mozilla uniquement .
Existe-t-il un moyen conforme aux normes pour y parvenir avec CSS, et sinon, quelle est l'approche des "meilleures pratiques"?
css
cross-browser
highlight
textselection
Peter Mortensen
la source
la source
::selection { background: transparent; } ::-moz-selection { background: transparent; }
postcss
etautoprefixer
et de la version du navigateur, puispostcss
faire tout cool.Réponses:
MISE À JOUR janvier 2017:
Selon Puis-je utiliser , le
user-select
est actuellement pris en charge dans tous les navigateurs, à l'exception d'Internet Explorer 9 et des versions antérieures (mais a malheureusement encore besoin d'un préfixe de fournisseur).Toutes les variantes CSS correctes sont:
Notez que cela
user-select
est en cours de normalisation (actuellement dans un projet de travail du W3C ). Il n'est pas garanti de fonctionner partout, et il pourrait y avoir des différences d'implémentation entre les navigateurs et, à l'avenir, les navigateurs pourraient abandonner la prise en charge.Plus d'informations peuvent être trouvées dans la documentation de Mozilla Developer Network .
la source
<div onselectstart="return false;">
à ma div principale.standard-user-select
. alors nous n'aurons pas ces problèmes. bien que pour une compatibilité ascendante, nous devrions également inclure les autres. alors maintenant le code devient-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, beaucoup mieux.Dans la plupart des navigateurs, cela peut être réalisé en utilisant des variations propriétaires sur la
user-select
propriété CSS , initialement proposées puis abandonnées dans CSS 3 et maintenant proposées dans CSS UI Level 4 :Pour Internet Explorer <10 et Opera <15, vous devrez utiliser l'
unselectable
attribut de l'élément que vous souhaitez ne pas pouvoir sélectionner. Vous pouvez définir cela en utilisant un attribut en HTML:Malheureusement, cette propriété n'est pas héritée, ce qui signifie que vous devez mettre un attribut dans la balise de début de chaque élément à l'intérieur du
<div>
. Si c'est un problème, vous pouvez utiliser à la place JavaScript pour le faire récursivement pour les descendants d'un élément:Mise à jour du 30 avril 2014 : cette traversée d'arbre doit être réexécutée chaque fois qu'un nouvel élément est ajouté à l'arborescence, mais il semble d'après un commentaire de @Han qu'il est possible d'éviter cela en ajoutant un
mousedown
gestionnaire d'événements qui se positionneunselectable
sur la cible du un événement. Voir http://jsbin.com/yagekiji/1 pour plus de détails.Cela ne couvre toujours pas toutes les possibilités. Bien qu'il soit impossible d'initier des sélections dans des éléments non sélectionnables, dans certains navigateurs (Internet Explorer et Firefox, par exemple), il est toujours impossible d'empêcher les sélections qui commencent avant et se terminent après l'élément non sélectionnable sans rendre l'ensemble du document non sélectionnable.
la source
*.foo
et.foo
sont précisément équivalentes (dans le deuxième cas, le sélecteur universel (*
) est implicite), donc à l'exception des bizarreries du navigateur, je ne vois pas que l'inclusion de la*
volonté nuira performance. C'est une habitude de longue date que j'inclus le*
, ce que j'ai commencé à faire pour la lisibilité: il indique explicitement en un coup d'œil que l'auteur a l'intention de faire correspondre tous les éléments.Une solution JavaScript pour Internet Explorer est:
la source
ondragstart
!body.onselectstart = function(e) { if (e.target.nodeName != "INPUT" && e.target.nodeName != "TEXTAREA") { e.preventDefault(); return false; } return true; }
input
éléments même si j'utiliseuser-select: none
. j'ai besoin de savoir comment éviter celaJusqu'à ce que la propriété de sélection d' utilisateur de CSS 3 soit disponible, les navigateurs basés sur Gecko prennent en charge la
-moz-user-select
propriété que vous avez déjà trouvée. Les navigateurs WebKit et Blink prennent en charge-webkit-user-select
propriété.Bien sûr, cela n'est pas pris en charge dans les navigateurs qui n'utilisent pas le moteur de rendu Gecko.
Il n'y a pas de moyen rapide et facile conforme aux «normes»; l'utilisation de JavaScript est une option.
La vraie question est, pourquoi voulez-vous que les utilisateurs ne soient pas en mesure de mettre en évidence et vraisemblablement de copier et coller certains éléments? Je n'ai pas rencontré une seule fois où je voulais ne pas laisser les utilisateurs mettre en évidence une certaine partie de mon site Web. Plusieurs de mes amis, après avoir passé de nombreuses heures à lire et à écrire du code, utiliseront la fonction de surbrillance pour se souvenir de l'endroit où ils se trouvaient sur la page ou pour fournir un marqueur afin que leurs yeux sachent où regarder ensuite.
Le seul endroit où j'ai pu voir que cela était utile est si vous avez des boutons pour les formulaires qui ne doivent pas être copiés et collés si un utilisateur copie et colle le site Web.
la source
Si vous souhaitez désactiver la sélection de texte sur tout sauf sur les
<p>
éléments, vous pouvez le faire en CSS (faites attention à ce-moz-none
qui permet de remplacer les sous-éléments, ce qui est autorisé dans les autres navigateurs avecnone
):la source
p, input { -webkit-user-select: text; -khtml-user-select: text; -moz-user-select: text; -o-user-select: text; user-select: text; }
-moz-none
et cenone
sont les mêmes.ul>* { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: -moz-none; -o-user-select: none; user-select: none; }
[sélectionne tout dans une liste non ordonnée, et la rend non sélectionnable, plutôt que de mettre à la corbeille tout l'arborescence de la vue.] Merci pour la leçon. Ma liste de boutons a fière allure et répond correctement au tapotement d'écran et à la pression, plutôt que de lancer un IME (widgets du presse-papiers Android).Dans les solutions des réponses précédentes, la sélection est arrêtée, mais l'utilisateur pense toujours que vous pouvez sélectionner du texte car le curseur change toujours. Pour le garder statique, vous devrez définir votre curseur CSS:
Cela rendra votre texte totalement plat, comme il le serait dans une application de bureau.
la source
user-select: none;
, pensant que la norme serait adoptée à ce jour, mais malheureusement ce n'est pas le cas. Vous fait vous demander ce que les membres du comité des normes pourraient encore débattre. "Non, vous les gars ... Je pense vraiment que ça devrait êtreuser-select: cant;
parce que c'est comme plus descriptif, vous savez?" "Nous en avons déjà parlé, Mike. Nous devrions omettre l'apostrophe, et c'est une mauvaise forme!" "Assez, tout le monde! Nous débattrons à nouveau de cette question le mois prochain. La réunion du Comité des normes est ajournée!"Vous pouvez le faire dans Firefox et Safari (Chrome aussi?)
la source
Solution de contournement pour WebKit :
Je l'ai trouvé dans un exemple CardFlip.
la source
transparent
de lieu de rgba fonctionne également dans Chrome 42 sur Android.J'aime la solution hybride CSS + jQuery.
Pour rendre tous les éléments à l'intérieur
<div class="draggable"></div>
non sélectionnables, utilisez ce CSS:Et puis, si vous utilisez jQuery, ajoutez ceci dans un
$(document).ready()
bloc:Je suppose que vous voulez toujours que tous les éléments d'entrée soient interactifs, d'où le
:not()
pseudo-sélecteur. Vous pourriez utiliser'*'
place si vous ne vous en souciez pas.Mise en garde: Internet Explorer 9 peut ne pas avoir besoin de cette pièce jQuery supplémentaire, vous pouvez donc y ajouter une vérification de version.
la source
-moz-user-select: Normal;
jQuery.browser
est obsolète depuis la version 1.3 et a été supprimé dans la version 1.9 - api.jquery.com/jQuery.browserCe n'est pas le meilleur moyen, cependant.
la source
title
comme attribut.user-select
ne fonctionnent pas.Vous pouvez utiliser CSS ou JavaScript pour cela.
La méthode JavaScript est prise en charge dans les anciens navigateurs, comme les anciennes versions d'Internet Explorer également, mais si ce n'est pas votre cas, utilisez la méthode CSS:
HTML / JavaScript:
HTML / CSS:
la source
Pour Internet Explorer en plus, vous devez ajouter une pseudo-classe
focus
(.ClassName: focus) etoutline-style: none
.la source
className
classe. Voir ce JSBin .Essayez d'insérer ces lignes dans le CSS et appelez le "disHighlight" à la propriété de classe:
la source
Une mise à jour rapide du hack
Si vous utilisez la valeur
none
pour toutes lesuser-select
propriétés CSS (y compris les préfixes du navigateur), il y a un problème qui peut toujours survenir.Comme le dit CSS-Tricks , le problème est:
WebKit permet toujours de copier le texte, si vous sélectionnez des éléments autour de lui.
Vous pouvez également utiliser celui ci-dessous pour sélectionner
enforce
un élément entier, ce qui signifie que si vous cliquez sur un élément, tout le texte encapsulé dans cet élément sera sélectionné. Pour cela, tout ce que vous avez à faire est de changer la valeurnone
enall
.la source
Pour ceux qui ont du mal à obtenir la même chose dans le navigateur Android avec l'événement tactile, utilisez:
la source
Si vous utilisez Less et Bootstrap, vous pouvez écrire:
la source
la source
Travail
CSS:
Cela devrait fonctionner, mais cela ne fonctionnera pas pour les anciens navigateurs. Il y a un problème de compatibilité du navigateur.
la source
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.
Avec SASS (syntaxe SCSS)
Vous pouvez le faire avec un mixin :
Dans une balise HTML:
Essayez-le dans ce CodePen .
Si vous utilisez un préfixeur automatique, vous pouvez supprimer d'autres préfixes.
Compatibilité du navigateur ici .
la source
Mis à part la propriété Mozilla uniquement, non, il n'y a aucun moyen de désactiver la sélection de texte avec juste CSS standard (à partir de maintenant).
Si vous remarquez, Stack Overflow ne désactive pas la sélection de texte pour leurs boutons de navigation, et je déconseille de le faire dans la plupart des cas, car il modifie le comportement de sélection normal et le rend en conflit avec les attentes d'un utilisateur.
la source
Cela fonctionne dans certains navigateurs:
Ajoutez simplement vos éléments / identifiants souhaités devant les sélecteurs séparés par des virgules sans espaces, comme ceci:
Les autres réponses sont meilleures; cela devrait probablement être considéré comme un dernier recours / fourre-tout.
la source
Supposons qu'il y en ait deux
div
comme ceci:Réglez le curseur par défaut afin qu'il donne une sensation non sélectionnable à l'utilisateur.
la source
Cela sera utile si la sélection des couleurs n'est pas non plus nécessaire:
... tous les autres correctifs du navigateur. Cela fonctionnera dans Internet Explorer 9 ou version ultérieure.
la source
color: inherit;
peut - être.Ajoutez ceci à la première div dans laquelle vous souhaitez désactiver la sélection de texte:
la source
REMARQUE:
La bonne réponse est correcte dans la mesure où elle vous empêche de pouvoir sélectionner le texte. Cependant, cela ne vous empêche pas de pouvoir copier le texte, comme je le montrerai avec les prochaines captures d'écran (à partir du 7 novembre 2014).
Comme vous pouvez le voir, nous n'avons pas pu sélectionner les numéros, mais nous avons pu les copier.
Testé sur: Ubuntu , Google Chrome 38.0.2125.111.
la source
Pour obtenir le résultat dont j'avais besoin, j'ai trouvé que je devais utiliser les deux
::selection
etuser-select
la source
Cela se fait facilement avec:
Alternativement:
Disons que vous en avez un
<h1 id="example">Hello, World!</h1>
. Vous devrez supprimer le innerHTML de celah1
, dans ce cas Hello, World . Ensuite, vous devrez aller sur CSS et faire ceci:Maintenant, il pense simplement qu'il s'agit d'un élément de bloc, et non de texte.
la source
Ce n'est pas du CSS, mais cela vaut la peine d'être mentionné:
jQuery UI Désactiver la sélection :
la source
Vérifiez ma solution sans JavaScript:
jsFiddle
Menu contextuel avec ma technique appliquée: http://jsfiddle.net/y4Lac/2/
la source
Bien que ce pseudo-élément soit dans les ébauches de CSS Selectors Level 3, il a été supprimé pendant la phase de recommandation du candidat, car il semblait que son comportement était sous-spécifié, en particulier avec les éléments imbriqués, et l'interopérabilité n'était pas réalisée.
Il est en cours de discussion dans Comment :: la sélection fonctionne sur les éléments imbriqués .
Bien qu'il soit implémenté dans les navigateurs, vous pouvez faire une illusion de texte non sélectionné en utilisant la même couleur et la même couleur d'arrière-plan lors de la sélection que dans la conception de l'onglet (dans votre cas).
Conception CSS normale
Sur sélection
Interdire aux utilisateurs de sélectionner le texte soulèvera des problèmes de convivialité.
la source