Haben Sie schon einmal (oder sich selbst) Text in ein <textarea> oder <input> Feld gesetzt, nicht weil es Teil eines Formulars war, sondern weil es die Auswahl eines ganzen Textblocks erleichterte. Eingabefelder wie diese haben AuswahlGrenzen, was bedeutet, dass Sie hineinklicken und zum Beispiel Alles auswählen können, um nur den Text innerhalb des Eingabefelds zu erhalten.
Es gibt eine CSS-Eigenschaft, mit der wir dies erreichen können, ohne ein nicht besonders semantisch passendes Formulareingabefeld verwenden zu müssen.
Es ist die Eigenschaft user-select, und sie funktioniert so
.force-select-all {
user-select: all;
}
Autoprefixer erledigt das für Sie, aber wenn Sie es manuell machen, benötigen Sie dies für die beste Browserunterstützung
.force-select-all {
-webkit-user-select: all; /* Covers Blink-land & Firefox (yup) */
user-select: all; /* Someday */
}
Ein Beispiel, fragen Sie?
Ich finde den häufigsten Anwendungsfall für diese Art von Sache ist: „Hier ist ein serverseitig generierter, kopierbarer Einbettungscode für unser Ding™“. Stellen Sie sich den Einbettungscode für YouTube- oder Vimeo-Videos vor

Macht Sinn auf einer Seite wie meinem alten HTML-Ipsum, das dringend ein Update benötigt.
Eine Demo
Wie wäre es mit einem etwas anderen Anwendungsfall, einer Cheat Sheet, die einige einfache Code-Schnipsel enthält, die kopiert werden sollen
Siehe den Pen SVG Shape Cheatsheet (user-select: all; demo) von Chris Coyier (@chriscoyier) auf CodePen.
Mehr zum Thema Präfixe
Eigentlich gibt Ihnen Autoprefixer
.force-select-all {
-webkit-user-select: all;
-moz-user-select: all;
-ms-user-select: all;
user-select: all;
}
Was verständlich ist, weil
- Es ist seltsam, nur
-webkit-für Firefox zu verwenden, obwohl es es akzeptiert - Edge unterstützt
allnicht, aber es unterstütztnonemit einem Präfix, daher präfigiert es die Eigenschaft immer
Nehmen wir an, Sie mögen die erzwungene Auswahl nicht, aber die Auswahlgrenzen schon.
Darum geht es beim Wert contain. Er lässt die Textauswahl so verhalten, als ob sie innerhalb eines Eingabefelds stattfinden würde
.select-text-like-you-would-within-a-textarea {
/* Not supported anywhere yet */
user-select: contain;
}
Leider noch keine Unterstützung. IE/Edge unterstützt jedoch eine proprietäre Version
.ie-version-of-contain {
-ms-user-select: element;
}
Jetzt haben wir also none, all und contain. Es gibt auch text, das den Text wie „normalen“ Text auswählbar macht.
Wenn Sie den Wert jemals zurücksetzen müssen, sollten Sie auto verwenden, da dies der Wert ist, der das Element in seinen normalen Zustand zurückversetzt (z. B. würde ein <p> zu Text zurückkehren, ein <textarea> zu contain).
Ausgewählten Text stylen
Da wir hier über die Textauswahl sprechen, denken Sie daran, dass Sie ausgewählten Text stylen können
::-moz-selection { background: yellow; }
::selection { background: yellow; }
Obwohl… ich könnte empfehlen, diese nicht zu kombinieren, da das automatische Textauswahlverhalten bereits ein *wenig seltsam* ist, so dass dies in Kombination mit einem völlig anderen Auswahlstil verwirrend sein könnte, bis zu dem Punkt, an dem eine Person nicht versteht, was passiert.
Oder zumindest die ::selection seitenweit anwenden, nicht spezifisch für isolierte Bereiche.
Der klassische JavaScript-Weg
Keine Edge-Unterstützung könnte ein Dealbreaker für Sie sein. Wenn die automatische Textauswahl geschäftskritisch ist, sollten Sie sich einfach an ein Eingabefeld und JavaScript halten.
Super einfaches Beispiel
Siehe den Pen Simplest Select von Chris Coyier (@chriscoyier) auf CodePen.
Ich bin sicher, Sie könnten viel ausgefallener werden, z. B. indem Sie Inline-Event-Handler vermeiden und „Okay, ich habe hineingeklickt und Sie haben Ihren Text ausgewählt, ich verstehe, jetzt hören Sie damit auf, damit ich nur einen Teil von Ihnen auswählen kann“ berücksichtigen – was sicherlich möglich ist.
Pseudo-Elemente
Ob zum Guten oder Schlechten, user-select: text; könnte eine Möglichkeit sein, Pseudo-Elemente (wie ::before oder ::after) auswählbar zu machen, was sie derzeit in keinem Browser sind. Es ist wahrscheinlich gut, dass man sie nicht auswählen kann, da Pseudo-Elemente auch nicht für AT gelesen werden sollen (da sie kein „Inhalt“ sind). Aber es ist schon seltsam, Text auf einem Bildschirm zu sehen, den man nicht auswählen kann, daher würde ich nicht überrascht sein, in welche Richtung auch immer die Browser sich entscheiden.
Mobil
Für iOS gibt es noch etwas anderes, das Sie vielleicht verwenden möchten
.prevent-touch-callout {
-webkit-touch-callout: none;
}
Nicht speziell über die Auswahl, aber wenn Sie die Textauswahl verhindern, verhindern Sie wahrscheinlich auch die Interaktion im Allgemeinen. MDN
Wenn ein Ziel auf iPhone OS berührt und gehalten wird, zeigt Safari ein Informations-Callout über den Link an. Diese Eigenschaft erlaubt es, dieses Verhalten zu deaktivieren.
Kopieren erzwingen?
Da wir über die erzwungene Textauswahl sprechen, können wir auch das Kopieren in die Zwischenablage erzwingen? Das geht tatsächlich. Früher gab es eine Flash-basierte Methode dafür, aber wie wir alle wissen, ist Flash ziemlich tot. Chrome hat gerade einen weiteren Todesstoß angekündigt. IE 10 unterstützte dieses execCommand Ding, und wie es sich herausstellt, scheint das die Sache zu sein, auf die sich die Browser einigen. Ich habe diese Demo aus dem Google-Artikel von Matt Gaunt geschnappt
Siehe den Pen Copy Text with a Button (Google Example) von Chris Coyier (@chriscoyier) auf CodePen.
Sieht so aus, als funktioniert das in Blink-Land, Firefox und Edge, also… cool.
Weitere Informationen
- user-select auf MDN – mehr Details hier zu Präfixen und proprietären Werten.
- Can I Use zur Unterstützung – speziell für den
none-Wert - Aktuelle Version des Standards – soweit ich das beurteilen kann
- Dokument von Google mit einigen interessanten Details zur Unterstützung und Links zu relevanten Bugs.
Puh
Das waren viele Worte für eine so einfache Sache. Gute Arbeit, Team.
Ich glaube, Sie haben das Wichtigste versteckt! Begeistert von Non-Flash-C&P.
Bitte tun Sie das nicht. Es ist wirklich nervig. Wenn Sie Ihren Benutzern „helfen“ wollen, machen Sie einfach einen Kopier-Button oder so etwas.
Ich hasse es, Sie namentlich zu nennen, aber ich sehe dogmatische Antworten wie diese viel zu oft. Das einzige „Nie tun“ auf dem Web ist „Nie sagen, nie tun“.
Das ist schon in Ordnung. Ich persönlich finde es sehr nervig und würde persönlich vorziehen, wenn Leute es nie tun würden. Ich kann mir keine Anwendungsfälle vorstellen, bei denen das Überschreiben der erwarteten Auswahlinteraktion besser ist als die normale Interaktion, aber ich bin offen dafür, völlig falsch zu liegen. Ich finde es nur ein wenig vermessen, einen Benutzer zu zwingen, auf eine bestimmte Weise zu interagieren, wenn es ziemlich unmöglich ist, alle Gründe zu bedenken, warum er den Text auswählen könnte. Deshalb denke ich, dass der Button wahrscheinlich der beste Weg ist, damit umzugehen. Er ist vollständig opt-in.
Ich unterstütze das. Ich möchte regelmäßig nur die Einbettungs-URL von einem Video, zum Beispiel auf YouTube oder Vimeo, greifen, um sie in ein CMS-Feld einzufügen. Da ich nicht nur einen Teil davon auswählen kann, muss ich ihn in einen Texteditor einfügen, um ihn zu bearbeiten.
Die Button-Idee würde gut funktionieren und wäre meiner Meinung nach viel expliziter. Klicken Sie hier zum Kopieren, oder hier ist der Text, wenn Sie nur einen Teil davon benötigen.
Ich muss Tegan und Adam hier zustimmen, zumindest wenn es um
user-select: allgeht. Ich kann mir keine Situation vorstellen, in der Sie mit 100%iger Sicherheit wissen, dass der Benutzer alles auswählen möchte und nicht nur einen Teil davon.Es ist äußerst ärgerlich, wenn jemand Code teilt und verlangt, dass man den gesamten Block auswählt, obwohl man nur eine URL oder etwas daraus benötigt.
Ich reihe mich in die Liste derer ein, die die automatische (und unvermeidliche) Auswahl des gesamten Textes nicht mögen. Oft fand ich mich dabei wieder, dass ich nur *einen Teil* des Textes kopieren wollte und am Ende sagte: „Ugh, *in Ordnung*, ich füge es in einen Texteditor ein und kopiere, was ich will!“
Das Erzwingen der Auswahl des gesamten Inhalts bricht das erwartete Nutzerverhalten, daher ist das aus UX-Sicht ein großes „Nein“ für mich.
Ja, bei Google Maps benötige ich oft nur einen bestimmten Teil des Codes, aber er zwingt mich immer, den gesamten Einbettungscode zu kopieren, sodass ich ihn in einen Texteditor einfügen und dann nur den benötigten Teil extrahieren muss.
Also, user-select: all funktioniert anscheinend nicht in Chrome? Habe gerade Ihr Demo in FF ausprobiert und es funktioniert großartig, die Zeile wird als ausgewählt hervorgehoben. Chrome, nichts. Ich bin auf Windows, macht das einen Unterschied?
Zweite Meinung. Ich sehe es in Chrome 52 nicht funktionieren.
Das Gleiche hier. War enttäuscht, da dies ein echter Trick zu sein schien und nützlich sein könnte.
Könnte es eine Flagge sein? chrome://flags/
Es funktioniert in Chrome 52, wenn about:flags/#enable-experimental-web-platform-features aktiviert ist, und ohne Flagge in Chrome 54 Canary, zumindest.
Ja, die Flagge hat es gebracht! Aber das ist irgendwie traurig. :(
Hallo. Dieses Beispiel http://codepen.io/chriscoyier/pen/dXKxvv funktioniert nicht in Chrome 52.0.2743.116 (64-Bit)
Wie oben erwähnt (aber nach Ihrem Kommentar, glaube ich) chrome://flags/ > Experimental Web Platform features oder about:flags/#enable-experimental-web-platform-features wird es in Chrome 52 aktivieren
Ich persönlich finde, dass ich oft von diesem genervt bin, weil ich versuche, einen bestimmten Teil auszuwählen und es nicht funktioniert. Ich bin mir nicht sicher, ob das üblich ist, aber ich frage mich, ob es besser wäre, es beim mousedown -> mouse drag zu deaktivieren und es nur beim Klicken funktionieren zu lassen?
Das andere Problem ist, dass ich nie weiß, ob das eine Funktion sein wird oder nicht, und erfahre es oft erst, wenn ich mitten in meiner Auswahl bin und es dann unerwartetes Verhalten zeigt. Glauben Sie, es gibt eine Möglichkeit, Benutzern anzuzeigen, dass diese Funktion aktiv ist?
Ich mag die Idee, zu prüfen, ob sie einen Teil auswählen. Ich denke, für die meisten Orte, an denen ich es verwenden würde, wäre ein kleines Popover nach der Auswahl, das die Option gibt, alles auszuwählen.
Wow, nein! Alle guten Screenreader lesen jetzt Pseudo-Element-Inhalte. Als Webentwickler sollten Sie wichtigen Inhalt nicht in Pseudo-Elemente einfügen, da einige Screenreader ihn nicht lesen. Aber nehmen Sie auch nicht an, dass er *nicht* gelesen wird.
(Auch zum Hauptthema des Beitrags. Ich mag die Idee, eine „Alles“-Auswahl zu erzwingen, nicht, aber ich bin mit Klick-zum-Auswählen einverstanden und mag definitiv die Idee, das „Contain“-Verhalten von Textfeldern für „Alles auswählen“ wiederherstellen zu können. Browser, unterstützen Sie diese Option endlich, ja?)
Danke, dass Sie das gesagt haben, Amelia. Ich wollte gerade dasselbe posten – dass die meisten aktuellen Screenreader CSS-generierte Inhalte lesen (und es nicht als Mittel zum Verbergen von Inhalten vor ihnen verwendet werden sollte).
Was die Textauswahl betrifft: Wenn Sie als Autor klarstellen, dass ein ganzer Textblock ausgewählt wird und dies kontextuell angemessen ist, denke ich, dass das in Ordnung ist. Ich hasse es auch, zu versuchen, einen Teil von etwas auszuwählen, nur um jedes Mal das Ganze ausgewählt zu bekommen.
Auch hier auf diesem Kommentarformular, gibt es die Möglichkeit, dass die Felder Labels statt nur Platzhalter haben? Musste meine E-Mail-Adresse löschen, um sicherzustellen, dass nicht nach einer URL gefragt wurde.
Ich war der Meinung, dass einige Screenreader (wie Voice Over) generierte Inhalte lesen, aber es *nicht tun sollten* und daher immer Gefahr liefen, damit aufzuhören. Ich schätze, es hat sich in die andere Richtung entwickelt.
Chris, es geht in die andere Richtung. Vor einem Jahr hat Léonie Watson die Unterstützung für generierte Inhalte in Screenreadern verfolgt und gezeigt, dass sie gut unterstützt wurde. Seitdem hat sich die Unterstützung nur noch verstärkt / verbessert. Der Grund dafür ist, dass viele Autoren generierte Inhalte für etwas anderes als Dekoration verwenden, sodass ATs sie lesen mussten.