5606 votes

Règle CSS pour désactiver la mise en évidence de la sélection de texte

Pour les ancres qui agissent comme des boutons (par exemple, Questions , Tags , Utilisateurs en haut de la page Stack Overflow) 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 une petite recherche sur Google m'a permis de trouver la version de Mozilla uniquement. -moz-user-select option.

Existe-t-il un moyen normalisé d'y parvenir avec CSS et, dans le cas contraire, quelle est la meilleure approche ?

8 votes

Peuvent être des éléments à l'intérieur de l'élément witch h

10 votes

Il y a un bug dans certains navigateurs où le fait de "Tout sélectionner" (CTRL+A et CMD+A) sélectionne encore des choses. Ce problème peut être résolu en utilisant une couleur de sélection transparente : ::selection { background: transparent; } ::-moz-selection { background: transparent; }

15 votes

Je me permets d'insister sur le fait qu'il ne faut pas faire cela. D'après mon expérience, j'ai plus souvent qu'à mon tour vouloir pour sélectionner un texte qui sert également de bouton, afin de le copier-coller ailleurs. Il serait incroyablement exaspérant de ne pas pouvoir le faire parce qu'un développeur web s'est ingénié à désactiver volontairement cette fonction pour moi. Alors, s'il vous plaît, ne le faites pas à moins que vous n'en ayez très envie, très pour une bonne raison.

7941voto

Blowsie Points 25114

Toutes les variantes correctes de CSS sont :

-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;

Vous trouverez de plus amples informations ici .

39 votes

Joli code molokoloco :D , bien que je resterais personnellement loin de l'utiliser, car parfois vous pouvez avoir besoin de valeurs différentes pour différents navigateurs, et il s'appuie sur JavaScript. Créer une classe et l'ajouter à votre élément ou appliquer les css à votre type d'élément dans votre feuille de style est une solution à toute épreuve.

62 votes

'user-select'- Valeurs : none | text | toggle | element | elements | all | inherit - w3.org/TR/2000/WD-css3-userint-20000216

333 votes

C'est ridicule ! il y a tellement de façons différentes de faire la même chose. créons une nouvelle norme pour les sélections de l'utilisateur. nous l'appellerons standard-user-select Cependant, pour des raisons de compatibilité ascendante, nous devrions également inclure les autres. Le code devient donc -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.

905voto

Tim Down Points 124501

Dans la plupart des navigateurs, cela peut être réalisé en utilisant des variations propriétaires de la fonction proposé-mais-maintenant-défini CSS3 user-select propriété :

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

   /*
     Introduced in IE 10.
     See http://ie.microsoft.com/testdrive/HTML5/msUserSelect/
   */
   -ms-user-select: none;
   user-select: none;
}

Pour IE < 10 et Opera, vous devrez utiliser l'option unselectable de l'élément que vous souhaitez rendre non sélectionnable. Vous pouvez définir ce paramètre à l'aide d'un attribut en HTML :

<div id="foo" unselectable="on" class="unselectable">...</div>

Malheureusement, cette propriété n'est pas héritée, ce qui signifie que vous devez placer un attribut dans la balise de début de chaque élément à l'intérieur de la balise <div> . Si cela pose un problème, vous pouvez utiliser JavaScript pour effectuer cette opération de manière récursive pour les descendants d'un élément :

function makeUnselectable(node) {
    if (node.nodeType == 1) {
        node.setAttribute("unselectable", "on");
    }
    var child = node.firstChild;
    while (child) {
        makeUnselectable(child);
        child = child.nextSibling;
    }
}

makeUnselectable(document.getElementById("foo"));

Mise à jour du 30 avril 2014 : Cette traversée de l'arbre doit être ré-exécutée chaque fois qu'un nouvel élément est ajouté à l'arbre, mais il semble, d'après un commentaire de @Han, qu'il est possible d'éviter cela en ajoutant un mousedown qui définit unselectable sur la cible de l'événement. Voir http://jsbin.com/yagekiji/1 pour les détails.


Cela ne couvre toujours pas toutes les possibilités. S'il est impossible d'initier des sélections dans des éléments non sélectionnables, dans certains navigateurs (IE et Firefox, par exemple), il est encore 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.

32 votes

Vous devriez supprimer le sélecteur * de votre exemple, il est vraiment inefficace et il n'y a pas vraiment besoin de l'utiliser dans votre exemple, n'est-ce pas ?

70 votes

@Blowsie : Je ne pense pas que ce soit le cas : la spécification CSS 2 stipule que *.foo y .foo sont précisément équivalents (dans le second cas, le sélecteur universel ( * ) est implicite), donc sauf bizarrerie du navigateur, je ne vois pas en quoi le fait d'inclure l'élément * nuira à la performance. J'ai pris l'habitude depuis longtemps d'inclure les * que j'ai commencé à faire à l'origine pour des raisons de lisibilité : il indique explicitement au premier coup d'œil que l'auteur a l'intention de faire correspondre tous les éléments.

40 votes

Oooh après quelques lectures supplémentaires, il semble que * soit seulement inefficace lorsqu'il est utilisé comme clé (le sélecteur le plus à droite), c'est-à-dire .unselectable * . Plus d'informations ici code.google.com/speed/page-speed/docs/

205voto

Pekka 웃 Points 249607

Une solution JavaScript pour IE est

onselectstart="return false;"

59 votes

N'oubliez pas ondragstart !

147voto

pinouchon Points 7706

Si vous voulez désactiver la sélection de texte sur tout sauf sur <p> vous pouvez le faire en CSS (attention à la balise -moz-none qui permet de passer outre dans les sous-éléments, ce qui est autorisé dans d'autres navigateurs avec la fonction none ) :

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

p {
    -webkit-user-select: text;
    -khtml-user-select: text;
    -moz-user-select: text;
    -o-user-select: text;
    user-select: text;
}

13 votes

Veillez également à ce que les champs de saisie soient sélectionnables : p, input { -webkit-user-select: text; -khtml-user-select: text; -moz-user-select: text; -o-user-select: text; user-select: text; }

11 votes

N'hésitez pas à désactiver les attentes de l'interface utilisateur du navigateur pour TOUS les codes, à l'exception d'un seul. Qu'en est-il des éléments de liste <li /> texte, par exemple ?

0 votes

Juste une mise à jour... selon MDN depuis Firefox 21 -moz-none y none sont les mêmes.

116voto

seanmonstar Points 5011

Vous pouvez le faire dans Firefox et Safari (Chrome aussi ?)

::selection { background: transparent; }
::-moz-selection { background: transparent; }

128 votes

Je vous déconseille de le faire, car cela ne résout pas le problème, à savoir la désactivation de la sélection de texte, mais la cache simplement. Cela peut conduire à une mauvaise utilisation, car si je fais glisser mon curseur sur la page, je pourrais sélectionner n'importe quel texte arbitraire sans le savoir. Cela peut entraîner toutes sortes de "bogues" étranges en matière d'utilisation.

2 votes

Ne fonctionne pas sur les images PNG avec des zones transparentes : La sélection se fait toujours en bleu clair Y a-t-il une solution ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X