Dodaj właściwość kursora CSS podczas używania „pointer-events: none”


98

Próbuję wyłączyć określony link i zastosować styl kursora, ale to polecenie CSS cursor: text;nie ma wpływu. Kursor jest zawsze domyślny. Używam najnowszej wersji przeglądarki Firefox.

CSS:

pointer-events: none !important;
cursor: text;
color: Blue;

@PHPglue Dwie rzeczy: w3fools.com i to naprawdę nie działa, nawet jeśli jest to tylko ten element na stronie: jsfiddle.net/brh9r8h6
melancia

Odpowiedzi:


123

Użycie pointer-events: nonespowoduje wyłączenie wszystkich interakcji myszy z tym elementem. Jeśli chciałbyś zmienić cursorwłaściwość, musiałbyś zastosować zmiany do elementu nadrzędnego. Możesz owinąć łącze elementem i dodać cursordo niego właściwość.

Przykład tutaj

HTML

<span class="wrapper">
    <a href="#">Some Link</a>
</span>

CSS

.wrapper {
    position: relative;
    cursor: text;  /* This is used */
}
.wrapper a {
    pointer-events: none;
}

Istnieje jednak kilka niespójności przeglądarek. Wygląda na to, że aby to zadziałało w IE11, potrzebujesz pseudoelementu. Pseudoelement umożliwia również zaznaczanie tekstu w FF. Co dziwne, możesz bez niego zaznaczyć tekst w Chrome.

Zaktualizowany przykład

.wrapper:after {
    content: '';
    position: absolute;
    width: 100%; height: 100%;
    top: 0; left: 0;
}

twój kod działa, chyba że usunę jego tagi nadrzędne, ale znajduje się w <div><li> <span> iw tym przypadku jest to nadal domyślny kursor
Dragut

@ user3721912 Czy możesz podać przykład? To byłoby pomocne.
Josh Crozier,

tak, to jest dokładnie to, co chcę powiedzieć, mam na myśli, że mój tag span nie pozostaje sam, ma <div> <li> rodziców, jest otoczony tagami <div> <li>
Dragut

29

To już dość dawno od oryginalnego pytania, ale to jest moje rozwiązanie bez żadnego elementu opakowującego i kursora bez zdarzeń po wskaźnikach:

<!-- Add tabindex="-1" so that element cannot be reached by keyboard -->
<a href="url" class="disabled" tabindex="-1" onfocus="this.blur()">Disabled link</a>

CSS:

/* Adding cursor just works: */
.disabled {
    cursor: not-allowed;
}

/* Makes link non-clickable: */
.disabled:active {
    pointer-events: none;
}

Przykład CodePen

EDYTOWAĆ:

  • Chrome zaczął zwiększać nacisk na klikanie elementów z atrybutem tabindex (nawet z tabindex = "- 1"). Najszybszym rozwiązaniem jest onfocus="this.blur()"wyłączenie elementu.
  • Musisz zapobiec zogniskowaniu elementu, w przeciwnym razie można go aktywować klawiszem Enter

Działa dobrze! Sprytny. Dzięki
Joe Dooley

Niedoceniona odpowiedź! Dziękuję Ci!
trpx

Czysty, prosty i co najważniejsze, w sam raz! dzięki!
Dazag

Tak. Nie spodziewałem się, że to zadziała, ale zadziałało.
funky-nd

Świetne rozwiązanie. Dzięki za udostępnienie.
Troy Harris

13

Określając pointer-events:none, aktywnie deklarujesz, że nie ma interakcji myszy między elementem a kursorem. Dlatego też nie może mieć kursora - jest niewidoczny dla wszystkich zachowań myszy.

Dowód można znaleźć tutaj .


znowu słaba logika, aby to uzasadnić. Powiedzmy, że chcesz interakcji z myszą, ale implementujesz to samodzielnie w JavaScript. Lub nie używasz JavaScript, ale chcesz zmienić styl na coś takiego jak zmiana rozmiaru obszaru tekstu, dodając kursor <-> w prawym dolnym rogu, ale nie chcesz, aby blokowało to podstawową funkcję zmiany rozmiaru, więc tworzysz zdarzenia wskaźnika: none ;, ale to usuwa kursor. Logika bezdenna. Nie rozumiem, jak to jest odpowiedź na pytanie.
George,

4

Usuń pointer-events: none !important;. Wyłącz link za pomocą JavaScript:

anchorElement.onclick = function(){
  return false;
}

Jeśli nie wiesz, JavaScript anchorElementto sam węzeł lub element. Najczęstszym sposobem uzyskania elementu jest użycie idatrybutu HTML . Powiedzmy, że mamy:

<a id='whatever' href='#'>Text Here</a>

Twój kod może być:

document.getElementById('whatever').onclick = function(){
  return false;
}

Istnieje wiele innych sposobów na zdobycie węzłów.


wydaje się to logiczne, ale nie radzę sobie z JavaScriptem. Byłoby miło, gdybyś pokazał przykładowe użycie
Dragut

0

Moim przypadkiem użycia był element do przeciągania, który nie mógł mieć żadnego zdarzenia wskaźnika ani żadnego elementu nadrzędnego ze zdarzeniem wskaźnika.

Rozwiązałem to, stosując warunkowo styl globalny, który wymuszał chwytanie kursora tylko podczas przeciągania. (Używam React i styled-components, ale ta sama logika może być zastosowana na vanilla js).

const SetDraggingCursor = createGlobalStyle`
  * {
    cursor: grabbing !important;
  }
`;

// ...

{isDragging && <SetDraggingCursor />}

0

możesz utworzyć kolejny element div i ustawić go dokładnie na ostatnim div i utworzyć taki plik css:

.example{
    background-color: rgba(255, 255, 255, 0); //opacity:0
    z-index: 1;
    cursor: not-allowed;
}

0

Zamiast wrappera, można to zrobić za pomocą czystego CSS również od wewnątrz. (Używam tego z materialnym komponentem sieciowym, więc kod staje się nieco bardziej złożony).

button:disabled {
    > * {
        cursor: not-allowed;
        pointer-events: initial;
    }

    &::before {
        background-color: #fff0;
    }

    &::after {
        background-color: #fff0;
    }
}
<button>
    <svg .../>
</button>

Próbowałem również ::beforei ::afterz button:disabledbezpośrednio, ale po prostu nie mógł się zdarzyć ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.