Czy dla kotwic, które działają jak przyciski (na przykład Pytania , Tagi , Użytkownicy itp. U góry strony Przepełnienie stosu) lub karty, istnieje standardowy sposób CSS, aby wyłączyć efekt podświetlenia, jeśli użytkownik przypadkowo wybierze tekst?
Zdaję sobie sprawę, że można to zrobić za pomocą JavaScript, a trochę googlingu dało -moz-user-select
opcję tylko dla Mozilli .
Czy istnieje zgodny ze standardami sposób osiągnięcia tego za pomocą CSS, a jeśli nie, jakie jest podejście „najlepszych praktyk”?
css
cross-browser
highlight
textselection
Peter Mortensen
źródło
źródło
::selection { background: transparent; } ::-moz-selection { background: transparent; }
postcss
iautoprefixer
oraz zestaw wersję przeglądarki, a następniepostcss
zrobić wszystko cool.Odpowiedzi:
AKTUALIZACJA Styczeń 2017:
Według Czy mogę używać ,
user-select
jest obecnie obsługiwany we wszystkich przeglądarkach z wyjątkiem Internet Explorera 9 i wcześniejszych wersji (ale niestety nadal wymaga prefiksu dostawcy).Wszystkie prawidłowe odmiany CSS to:
Zauważ, że
user-select
jest w trakcie procesu standaryzacji (obecnie w wersji roboczej W3C ). Nie gwarantuje się, że będzie działać wszędzie i mogą istnieć różnice w implementacji między przeglądarkami, aw przyszłości przeglądarki mogą zrezygnować z obsługi.Więcej informacji można znaleźć w dokumentacji Mozilla Developer Network .
źródło
<div onselectstart="return false;">
do mojego głównego div.standard-user-select
. wtedy nie będziemy mieć tych problemów. chociaż dla kompatybilności wstecznej powinniśmy również uwzględnić inne. więc teraz kod się zmienia-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;
. ach, o wiele lepiej.W większości przeglądarek można to osiągnąć za pomocą zastrzeżonych odmian
user-select
właściwości CSS , pierwotnie zaproponowanych, a następnie porzuconych w CSS 3, a teraz zaproponowanych w CSS UI poziom 4 :W przypadku przeglądarki Internet Explorer <10 i Opera <15 musisz użyć
unselectable
atrybutu elementu, którego nie można wybrać. Możesz ustawić to za pomocą atrybutu w HTML:Niestety ta właściwość nie jest dziedziczona, co oznacza, że musisz umieścić atrybut w tagu początkowym każdego elementu wewnątrz
<div>
. Jeśli jest to problem, możesz zamiast tego użyć JavaScript, aby zrobić to rekurencyjnie dla potomków elementu:Aktualizacja 30 kwietnia 2014 r . : Trawersję drzewa należy ponownie uruchomić za każdym razem, gdy do drzewa dodawany jest nowy element, ale z komentarza @Han wydaje się, że można tego uniknąć, dodając moduł
mousedown
obsługi zdarzeń, który ustawia obiektunselectable
docelowy zdarzenie. Szczegółowe informacje można znaleźć na stronie http://jsbin.com/yagekiji/1 .To wciąż nie obejmuje wszystkich możliwości. Chociaż nie można inicjować selekcji w elementach, których nie można wybrać, w niektórych przeglądarkach (na przykład Internet Explorer i Firefox) nadal nie można zapobiec selekcjom, które rozpoczynają się przed i kończą po elemencie, którego nie można wybrać, bez uniemożliwienia wyboru całego dokumentu.
źródło
*.foo
i.foo
są one dokładnie równoważne (w drugim przypadku*
sugerowany jest selektor uniwersalny ( )), więc poza dziwactwami przeglądarki, nie widzę, aby*
to zaszkodziło wydajność.*
Moim od dawna nawykiem jest włączanie tego , co początkowo zacząłem robić dla czytelności: wyraźnie stwierdza na pierwszy rzut oka, że autor zamierza dopasować wszystkie elementy.Rozwiązaniem JavaScript dla Internet Explorera jest:
źródło
ondragstart
!body.onselectstart = function(e) { if (e.target.nodeName != "INPUT" && e.target.nodeName != "TEXTAREA") { e.preventDefault(); return false; } return true; }
input
elementach, nawet jeśli używamuser-select: none
. Muszę wiedzieć, jak temu zapobiecDopóki właściwość wyboru użytkownika CSS 3 nie będzie dostępna, przeglądarki oparte na Gecko obsługują
-moz-user-select
właściwość, którą już znalazłeś. Przeglądarki WebKit i Blink obsługują tę-webkit-user-select
właściwość.To oczywiście nie jest obsługiwane w przeglądarkach, które nie używają silnika renderującego Gecko.
Nie ma szybkiego i łatwego sposobu na spełnienie „standardów”; używanie JavaScript jest opcją.
Prawdziwe pytanie brzmi: dlaczego chcesz, aby użytkownicy nie mogli wyróżniać i przypuszczalnie kopiować i wklejać niektóre elementy? Nigdy nie spotkałem się z tym, że nie chcę, aby użytkownicy wyróżnili pewną część mojej witryny. Kilku moich przyjaciół, po spędzeniu wielu godzin na czytaniu i pisaniu kodu, użyje funkcji wyróżnienia jako sposobu na zapamiętanie, gdzie byli na stronie, lub dostarczenia znacznika, aby ich oczy wiedziały, gdzie szukać dalej.
Jedyne miejsce, w którym mogę to zobaczyć, jest przydatne, jeśli masz przyciski formularzy, których nie należy kopiować i wklejać, jeśli użytkownik kopiuje i wkleja witrynę.
źródło
Jeśli chcesz wyłączyć
<p>
zaznaczanie tekstu we wszystkim oprócz elementów, możesz to zrobić w CSS (uważaj na to,-moz-none
które pozwala na przesłonięcie podelementów, co jest dozwolone w innych przeglądarkach znone
):źródło
p, input { -webkit-user-select: text; -khtml-user-select: text; -moz-user-select: text; -o-user-select: text; user-select: text; }
-moz-none
inone
są takie same.ul>* { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: -moz-none; -o-user-select: none; user-select: none; }
[zaznacza wszystko na liście nieuporządkowanej i sprawia, że nie można jej wybrać, zamiast niszczyć całe drzewo widoku.] Dzięki za lekcję. Moja lista przycisków wygląda świetnie i poprawnie reaguje na dotykanie i naciskanie ekranu zamiast uruchamiania IME (widżety schowka na Androida).W rozwiązaniach z poprzednich odpowiedzi zaznaczanie jest zatrzymane, ale użytkownik nadal uważa, że można zaznaczyć tekst, ponieważ kursor nadal się zmienia. Aby zachować statyczność, musisz ustawić kursor CSS:
Spowoduje to, że tekst będzie całkowicie płaski, tak jak w aplikacji komputerowej.
źródło
user-select: none;
, myśląc, że standard zostanie już przyjęty, ale niestety nie. Sprawia, że zastanawiasz się, co ludzie w komitecie normalizacyjnym mogą nadal debatować. „Nie, wy… Naprawdę myślę, że tak powinno być,user-select: cant;
ponieważ jest bardziej opisowe, wiesz?” „Już nad tym skończyliśmy, Mike. Musielibyśmy pominąć apostrof, a to zła forma!” „Dosyć, wszyscy! Ponownie będziemy rozmawiać na ten temat w przyszłym miesiącu. Posiedzenie Komitetu Normalizacyjnego zostało odroczone!”Możesz to zrobić w przeglądarce Firefox i Safari (także w Chrome?)
źródło
Obejście dla WebKit :
Znalazłem to w przykładzie CardFlip.
źródło
transparent
zamiast rgba działa również w Chrome 42 na Androida.Lubię hybrydowe rozwiązanie CSS + jQuery.
Aby wszystkie elementy wewnątrz nie były
<div class="draggable"></div>
zaznaczone, użyj tego CSS:A następnie, jeśli używasz jQuery, dodaj to w
$(document).ready()
bloku:Myślę, że nadal chcesz, aby wszystkie elementy wejściowe były interaktywne, stąd
:not()
pseudo-selektor. Możesz użyć'*'
zamiast tego, jeśli cię to nie obchodzi.Uwaga: Internet Explorer 9 może nie potrzebować tego dodatkowego elementu jQuery, więc możesz dodać tam kontrolę wersji.
źródło
-moz-user-select: Normal;
jQuery.browser
jest przestarzały od wersji 1.3 i został usunięty w wersji 1.9 - api.jquery.com/jQuery.browserJednak nie jest to najlepszy sposób.
źródło
title
jako atrybutu.user-select
nie działa.Możesz do tego użyć CSS lub JavaScript .
Sposób JavaScript jest obsługiwany w starszych przeglądarkach, takich jak również stare wersje Internet Explorera, ale jeśli to nie jest twoja sprawa, użyj CSS, a następnie:
HTML / JavaScript:
HTML / CSS:
źródło
W przypadku przeglądarki Internet Explorer musisz także dodać pseudoklasę
focus
(.ClassName: focus) ioutline-style: none
.źródło
className
klasą. Zobacz ten JSBin .Spróbuj wstawić te wiersze do CSS i wywołaj właściwość „disHighlight” w klasie:
źródło
Szybka aktualizacja hacka
Jeśli użyjesz tej wartości
none
dla wszystkichuser-select
właściwości CSS (w tym jej prefiksów w przeglądarce), może wystąpić problem.Jak mówi CSS-Tricks , problemem jest:
WebKit nadal pozwala na kopiowanie tekstu, jeśli wybierzesz elementy wokół niego.
Możesz również użyć poniższego, aby
enforce
cały element został wybrany, co oznacza, że jeśli klikniesz element, cały tekst zawinięty w ten element zostanie zaznaczony. W tym celu wystarczy zmienić wartośćnone
naall
.źródło
W przypadku problemów z osiągnięciem tego samego w przeglądarce Androida za pomocą zdarzenia dotykowego użyj:
źródło
Jeśli używasz Less i Bootstrap, możesz napisać:
źródło
źródło
Pracujący
CSS:
To powinno działać, ale nie będzie działać w starych przeglądarkach. Wystąpił problem ze zgodnością przeglądarki.
źródło
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.
Z SASS (składnia SCSS)
Możesz to zrobić za pomocą mixin :
W tagu HTML:
Wypróbuj w tym CodePen .
Jeśli używasz autoprefixera , możesz usunąć inne prefiksy.
Zgodność przeglądarki tutaj .
źródło
Oprócz właściwości tylko dla Mozilli, nie, nie ma sposobu, aby wyłączyć zaznaczanie tekstu za pomocą standardowego CSS (jak na razie).
Jeśli zauważysz, Przepełnienie stosu nie wyłącza zaznaczania tekstu dla ich przycisków nawigacyjnych i odradzam to w większości przypadków, ponieważ modyfikuje normalne zachowanie zaznaczenia i powoduje konflikt z oczekiwaniami użytkownika.
źródło
Działa to w niektórych przeglądarkach:
Po prostu dodaj wybrane elementy / identyfikatory przed selektorami oddzielone przecinkami bez spacji, tak jak:
Inne odpowiedzi są lepsze; prawdopodobnie powinno to być postrzegane jako ostateczność.
źródło
Załóżmy, że istnieją dwa
div
takie:Ustaw kursor na wartość domyślną, aby dać użytkownikowi nie wybieralne odczucie.
źródło
Będzie to przydatne, jeśli wybór koloru również nie jest potrzebny:
... wszystkie inne poprawki przeglądarki. Będzie działać w przeglądarce Internet Explorer 9 lub nowszej.
źródło
color: inherit;
może.Dodaj to do pierwszego diva, w którym chcesz wyłączyć zaznaczenie tekstu:
źródło
UWAGA:
Prawidłowa odpowiedź jest poprawna, ponieważ uniemożliwia wybranie tekstu. Nie uniemożliwia to jednak skopiowania tekstu, co pokażę z następnymi kilkoma zrzutami ekranu (z 7 listopada 2014 r.).
Jak widać, nie byliśmy w stanie wybrać liczb, ale udało nam się je skopiować.
Testowane na: Ubuntu , Google Chrome 38.0.2125.111.
źródło
Aby uzyskać wynik, którego potrzebowałem, stwierdziłem, że muszę użyć obu
::selection
iuser-select
źródło
Można to łatwo zrobić za pomocą:
Alternatywnie:
Powiedzmy, że masz
<h1 id="example">Hello, World!</h1>
. Będziesz musiał usunąć innerHTMLh1
, w tym przypadku Hello, World . Następnie musisz przejść do CSS i zrobić to:Teraz myśli po prostu, że jest to element blokowy, a nie tekst.
źródło
To nie jest CSS, ale warto wspomnieć:
jQuery UI Disable Selection :
źródło
Sprawdź moje rozwiązanie bez JavaScript:
jsFiddle
Wyskakujące menu z zastosowaną moją techniką: http://jsfiddle.net/y4Lac/2/
źródło
Chociaż ten pseudoelement znajdował się w szkicach Selektorów CSS Poziom 3, został usunięty podczas fazy Rekomendacji Kandydata, ponieważ wydawało się, że jego zachowanie było niedokładnie określone, szczególnie w przypadku elementów zagnieżdżonych, i interoperacyjność nie została osiągnięta.
Jest to omówione w How :: selection działa na elementach zagnieżdżonych .
Pomimo tego, że jest zaimplementowany w przeglądarkach, możesz złudzić, że tekst nie jest zaznaczany, używając tego samego koloru i koloru tła podczas zaznaczania, co w projekcie zakładki (w twoim przypadku).
Normalny projekt CSS
Przy wyborze
Niedozwolenie użytkownikom na wybór tekstu spowoduje problemy z użytecznością.
źródło