Yalnızca CSS kullanarak bir bağlantı nasıl devre dışı bırakılır?


844

CSS kullanarak bir bağlantıyı devre dışı bırakmanın herhangi bir yolu var mı?

Denilen bir sınıf var current-pageve tıklatıldığında hiçbir eylem oluşmaması için bu sınıfla bağlantıların devre dışı bırakılmasını istiyorum.


42
bir sürü Google'dan sonra
RSK

1
Bir bağlantının kullanılıp kullanılmayacağı sunum değerinden daha anlamsal taşır. CSS ile değil hidden, herhangi bir HTML öğesi için geçerli özellik kullanılarak devre dışı bırakılmalıdır . CSS daha sonra örneğin a[hidden]çapa seçmek ve buna göre şekillendirmek için kullanılabilir .
amn

@ amn ama ben tarayıcılar gizli özniteliği olan bir öğe görüntüleyeceğini sanmıyorum böylece stil tartışmaya dönüşür.
user1794469

1
@ user1794469 Onlara CSS ile display: blockörneğin veya başka bir değer kullanma talimatı verirseniz yapacaklardır display. Ancak hiddenher zaman uygulanabilir değildir - ilgisiz olan öğeler içindir ve sorudan bağlantının neden devre dışı bırakılması gerektiği net değildir . Bu muhtemelen bir XY problemidir.
amn

Yanıtlar:


1348

Cevap zaten sorunun yorumlarında. Daha fazla görünürlük için bu çözümü buraya kopyalıyorum :

.not-active {
  pointer-events: none;
  cursor: default;
  text-decoration: none;
  color: black;
}
<a href="link.html" class="not-active">Link</a>

Tarayıcı desteği için lütfen https://caniuse.com/#feat=pointer-events adresine bakın . IE'yi desteklemeniz gerekiyorsa bir geçici çözüm vardır; bu cevaba bakınız .

Uyarı: pointer-eventsSVG olmayan elemanlar için CSS'de kullanım deneyseldir. Bu özellik eskiden CSS3 UI taslak şartnamesinin bir parçasıydı, ancak birçok açık sorun nedeniyle CSS4'e ertelendi.


36
Ayrıca, bu bağlantıya sekme önlemek ve sonra girin.
Jono

4
Biraz stil verirseniz, kullanıcı devre dışı olduğunu görebilir. Biraz opaklık verin: .2
DNRN

4
Eğer IE 10 için desteklemek gerek ve hemen altında, bir JavaScript polyfill gibi kullanabiliyorsa Bu artık IE 11. dahil tüm modern tarayıcılarda çalışır bu bir .
Keavon

26
Önemli not: Bu, gerçek bağlantının kendisini değil, yalnızca tıklamayı devre dışı bırakır. Yine de bağlantıyı "tıklamak" için sekme + enter tuşlarını kullanabilirsiniz.
Pikamander2

11
Kullanımı pointer-events: none;mükemmel değildir. Ayrıca, gezinme title="…"veya araç ipuçlarının görüntülenmesi için gereken fareyle üzerine gelme gibi diğer etkinlikleri de devre dışı bırakır . JS çözüm event.preventDefault();bazı CSS ( cursor: default; opacity: 0.4;) ve bağlantı neden devre dışı olduğunu açıklayan bir araç ipucu ile birlikte (kullanarak ) daha iyi bulundu .
Quinn Comendant

140

.disabled {
  pointer-events: none;
  cursor: default;
  opacity: 0.6;
}
<a href="#" class="disabled">link</a>


Ekranı satır içi blok (veya satır içi dışında bir şey) olarak ayarlamanız gerekebilir.
dev_masta

güzel, ancak işaretçi olayları tarayıcı desteğine dikkat edin (yani <IE11): caniuse.com/#search=pointer-events
bir darren

1
Stil için, değiştirmeyi deneyin pointer-events:none;için pointer-events:unset;. Ardından, imleç olarak değiştirilebilir cursor:not-allowed;. Bu, kullanıcıya neler olduğu hakkında daha iyi bir ipucu verir. Bugün itibariyle FF, Edge, Chrome, Opera ve Brave'de çalışıyor gibi görünüyor.
Sablefoste

@Sablefoste Bu, Chrome 60'ta benim için çalışmıyor. İmleç gerçekten not-allowed, ancak bağlantı tıklanabilir durumda.
çorba

122

CSS yalnızca bir şeyin stilini değiştirmek için kullanılabilir. Saf CSS ile yapabileceğiniz en iyi şey, bağlantıyı tamamen gizlemektir.

Gerçekten ihtiyacınız olan bazı javascript. JQuery kitaplığını kullanarak istediğinizi nasıl yapacağınız aşağıda açıklanmıştır.

$('a.current-page').click(function() { return false; });

21
Varsayılan davranışları önlemeye Unutma: function(ev){ ev.preventDefault(); ev.stopPropagation(); return false;.
ldiqual

5
@Idiqual, return falsebunu yapar
nickf

1
return falseyalnızca eylem şu hreföznitelik kullanılarak ayarlanırsa çalışır
Justin

Ayrıca bu sürüm, hover veya: focus! Gibi diğer işaretçi etkinliklerini tutarken tıklamaları devre dışı bırakmak için kullanılabilir. En iyi cevap!
Charlie Tupman

Bu tüm tarayıcılarda çalışmasına rağmen, yalnızca bir bağlantıyı tıklayarak devre dışı bırakılır. Birçok kullanıcının bağlam menüsünden veya orta fare düğmesini kullanarak bağlantıları açmak için kullanıldığını unutmayın.
Alexandru Severin

33

CSS bunu yapamaz. CSS yalnızca sunum içindir. Seçenekleriniz:

  • Dahil etmeyin hrefo niteliği senin<a> etiketlerinize .
  • Bununla bağlantı elemanları bulmak için JavaScript'i kullanın classve uygun şekilde hrefveya onclicközelliklerini kaldırın . jQuery bu konuda size yardımcı olacaktır (NickF benzer ama daha iyi bir şeylerin nasıl yapıldığını gösterdi).

30
Bu doğru cevap değil - pointer-events: yok; css devre dışı bırakabilir.
pie6k

Bunu düşünmedim! Ya da bu özellik 2010'da henüz mevcut değildi? Her durumda pointer-events: nonefare olaylarını devre dışı bırakabileceği doğrudur . Ancak, alttaki bağlantıyı devre dışı bırakmaz. Chrome 81'de denediğim bir testte, böyle bir bağlantıyı sekmeye tıklayıp dönüş anahtarını yazarak yine de etkinleştirebilirim.
Kevin Conner

31

Önyükleme Devre Dışı Bağlantı

<a href="#" class="btn btn-primary btn-lg disabled" role="button">Primary link</a>

<a href="#" class="btn btn-default btn-lg disabled" role="button">Link</a>

Bootstrap Devre Dışı Düğmesi ancak bağlantıya benziyor

<button type="button" class="btn btn-link">Link</button>

19

İçin hreföznitelik ayarlayabilirsinizjavascript:void(0)

.disabled {
  /* Disabled link style */
  color: black;
}
<a class="disabled" href="javascript:void(0)">LINK</a>


2
@nickf true, ancak bu düzgün bir çözümdür ve devre dışı olarak ayarlandığında zayıf varsayılan IE stiline güvenmekten daha iyidir.
SausageFingers

Bence bundan biraz daha karmaşık olabilir. İşte bir çözüm snook.ca/archives/javascript/clear_links_to_1
Mike Gifford

12

Kullandım:

.current-page a:hover {
pointer-events: none !important;
}

Ve yeterli değildi; bazı tarayıcılarda bağlantı yanıp sönmeye devam ediyordu.

Eklemek zorunda kaldım:

.current-page a {
cursor: text !important;
}

3
Bence a[disabled]:active { pointer-events: none !important; }daha iyi.
Masamoto Miyata


10

Yalnızca CSS olmasını istiyorsanız, devre dışı bırakma mantığı CSS tarafından tanımlanmalıdır.

CSS tanımlarındaki mantığı taşımak için özellik seçicileri kullanmanız gerekir. İşte bazı örnekler:

Tam bir href içeren bağlantıyı devre dışı bırak: =

Aşağıdaki gibi belirli bir href değeri içeren bağlantıları devre dışı bırakmayı seçebilirsiniz:

<a href="//website.com/exact/path">Exact path</a>

[href="https://stackoverflow.com//website.com/exact/path"]{
  pointer-events: none;
}

Bir yol parçası içeren bir bağlantıyı devre dışı bırakın: *=

Burada, /keyword/yolu içeren tüm bağlantılar devre dışı bırakılacak

<a href="//website.com/keyword/in/path">Contains in path</a>

[href*="/keyword/"]{
  pointer-events: none;
}

Şununla başlayan bir bağlantıyı devre dışı bırak: ^=

[attribute^=value]Operatör hedef belirli değerle başlayan bir özellik. Web sitelerini ve kök yollarını silmenizi sağlar.

<a href="//website.com/begins/with/path">Begins with path</a>

[href^="//website.com/begins/with"]{
  pointer-events: none;
}

Https dışı bağlantıları devre dışı bırakmak için bile kullanabilirsiniz. Örneğin :

a:not([href^="https://"]){
  pointer-events: none;
}

Şununla biten bir bağlantıyı devre dışı bırakın: $=

[attribute$=value]Operatör bir öznitelik hedef özel bir değere sahip uçları söyledi. Dosya uzantılarını silmek yararlı olabilir.

<a href="/path/to/file.pdf">Link to pdf</a>

[href$=".pdf"]{
  pointer-events: none;
}

Veya başka bir özellik

Css herhangi bir HTML özelliğini hedefleyebilir. Olabilir rel, target, data-customvb ve ...

<a href="#" target="_blank">Blank link</a>

[target=_blank]{
  pointer-events: none;
}

Özellik seçicileri birleştirme

Birden çok kuralı zincirleyebilirsiniz. Diyelim ki her harici bağlantıyı devre dışı bırakmak istiyorsunuz, ancak web sitenizi işaret eden bağlantıları devre dışı bırakmak istiyorsunuz:

a[href*="//"]:not([href*="my-website.com"]) {
    pointer-events: none;
}

Veya belirli bir web sitesinin pdf dosyalarına olan bağlantıları devre dışı bırakın:

<a href="//website.com/path/to/file.jpg">Link to image</a>

[href^="//website.com"][href$=".jpg"] {
  color: red;
}

Tarayıcı desteği

Nitelik seçicileri IE7'den beri desteklenmektedir. :not()IE9'dan beri seçici.


Devre dışı bırakılmış seçiciyi kullanarak bir bağlantıyı nasıl devre dışı bırakabilirim? örneğin <a class="test" devre dışı href="3"> test </a> a: devre dışı {imleç: izin verilmiyor; }
ecasper

10

Bunu CSS ile yapmanın bir yolu, bir sargıya CSS ayarlamak olacaktır div kaybolmak ayarlamak olacaktır ve başka bir şey gerçekleşir.

Örneğin:

<div class="disabled">
    <a class="toggleLink" href="wherever">blah</a>
    <span class="toggleLink">blah</span
</div>

CSS benzeri bir

.disabled a.toggleLink { display: none; }
span.toggleLink { display: none; }
.disabled span.toggleLink { display: inline; }

Aslında kapatmak aiçin tıklama etkinliğini değiştirmeniz veyahref başkaları tarafından açıklandığı gibi .

PS: Sadece bunu oldukça düzensiz bir çözüm olarak düşünürüm ve SEO için de en iyisi değil, ama tamamen CSS ile en iyisi olduğuna inanıyorum.


8

Bunu dene:

<style>
.btn-disable {
    display:inline-block;
    pointer-events: none;       
}
</style>

6

İşaretçi-olaylar mülkiyet üzerinde kontrol sağlayacağı nasıl fareye HTML öğelerini tepki / dokunmatik olayları - CSS vurgulu / aktif devletler, tıklama / JavaScript musluk olayları ve imleç görünür olup olmadığını da dahil.

Bir Bağlantıyı devre dışı bırakmanın tek yolu bu değil , IE10 + ve tüm yeni tarayıcılarda çalışan iyi bir CSS yolu:

.current-page {
  pointer-events: none;
  color: grey;
}
<a href="#" class="current-page">This link is disabled</a>


4

İnterneti aradık ve hiçbir daha iyi buldum bu . Temelde düğme tıklama işlevini devre dışı bırakmak için jQuery kullanarak CSS stili ekleyin:

$("#myLink").css({ 'pointer-events': 'none' });

Sonra tekrar etkinleştirmek için bunu yapın

$("#myLink").css({ 'pointer-events': '' });

Firefox ve IE 11'de kontrol edildi, işe yaradı.


3
Bunun için jQuery'ye ihtiyacınız yoktur, bunu CSS'de kendiniz ayarlayabilirsiniz.
Bram Vanroy

3

bu css kullanabilirsiniz:

a.button,button {
    display: inline-block;
    padding: 6px 15px;
    margin: 5px;
    line-height: 1.42857143;
    text-align: center;
    white-space: nowrap;
    vertical-align: middle;
    -ms-touch-action: manipulation;
    touch-action: manipulation;
    cursor: pointer;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    background-image: none;
    border: 1px solid rgba(0, 0, 0, 0);
    border-radius: 4px;
    -moz-box-shadow: inset 0 3px 20px 0 #cdcdcd;
    -webkit-box-shadow: inset 0 3px 20px 0 #cdcdcd;
    box-shadow: inset 0 3px 20px 0 #cdcdcd;
}

a[disabled].button,button[disabled] {
    cursor: not-allowed;
    opacity: 0.4;
    pointer-events: none;
    -webkit-touch-callout: none;
}

a.button:active:not([disabled]),button:active:not([disabled]) {
    background-color: transparent !important;
    color: #2a2a2a !important;
    outline: 0;
    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .5);
    box-shadow: inset 0 3px 5px rgba(0, 0, 0, .5);
}
<button disabled="disabled">disabled!</button>
<button>click me!</button>
<a href="http://royansoft.com" disabled="disabled" class="button">test</a>
<a href="http://royansoft.com" class="button">test2</a>


2

Çözüm gönderen herkes sayesinde, daha gelişmiş disabledişlevsellik sağlamak için çoklu yaklaşımları birleştirdim . İşte bir öz ve kod aşağıda.

This provides for multiple levels of defense so that Anchors marked as disable actually behave as such.
Using this approach, you get an anchor that you cannot:
  - click
  - tab to and hit return
  - tabbing to it will move focus to the next focusable element
  - it is aware if the anchor is subsequently enabled


1.  Include this css, as it is the first line of defense.  This assumes the selector you use is 'a.disabled'
    a.disabled {
      pointer-events: none;
      cursor: default;
    }

 2. Next, instantiate this class such as (with optional selector):
    $ ->
      new AnchorDisabler()

İşte coffescript sınıfı:

class AnchorDisabler
  constructor: (selector = 'a.disabled') ->
    $(selector).click(@onClick).keyup(@onKeyup).focus(@onFocus)

  isStillDisabled: (ev) =>
    ### since disabled can be a class or an attribute, and it can be dynamically removed, always recheck on a watched event ###
    target = $(ev.target)
    return true if target.hasClass('disabled')
    return true if target.attr('disabled') is 'disabled'
    return false

  onFocus: (ev) =>
    ### if an attempt is made to focus on a disabled element, just move it along to the next focusable one. ###
    return unless @isStillDisabled(ev)

    focusables = $(':focusable')
    return unless focusables

    current = focusables.index(ev.target)
    next = (if focusables.eq(current + 1).length then focusables.eq(current + 1) else focusables.eq(0))

    next.focus() if next


  onClick: (ev) =>
    # disabled could be dynamically removed
    return unless @isStillDisabled(ev)

    ev.preventDefault()
    return false

  onKeyup: (ev) =>

    # 13 is the js key code for Enter, we are only interested in disabling that so get out fast
    code = ev.keyCode or ev.which
    return unless code is 13

    # disabled could be dynamically removed
    return unless @isStillDisabled(ev)

    ev.preventDefault()
    return false

Merhaba !!, cevap CSSdeğil JSya da başka bir şey hakkında!
Mehdi Dehghani

1

Ayrıca bağlantıları (sağ z-endeksini kullanarak) kapsayacak şekilde başka bir öğeyi boyutlandırabilirsiniz: Bu, tıklamaları "yiyecektir".

(Bunu yanlışlıkla keşfettik çünkü tarayıcı penceresi mobil boyutundayken H2'nin onları kaplamasına neden olan "duyarlı" tasarım nedeniyle aniden etkin olmayan bağlantılarla ilgili bir sorun yaşadık.)


Doğru, ancak klavye navigasyonu için değil.
AndFisher

1

Burada demo
Bunu deneyin

$('html').on('click', 'a.Link', function(event){
    event.preventDefault();
});

1
Kemanın çalışmıyor! Bağlantı hala Chrome'da etkin.
Matt Byrne

Bu kodu düzeltmek için, on (): $ ('html'). On ('click', 'a.Link', function (event) {event.preventDefault ();});
2C-B

1
Merhaba !!, cevap CSSdeğil JSya da başka bir şey hakkında!
Mehdi Dehghani

0

Başka bir numara, üzerine görünmez bir unsur yerleştirmektir. Bu, fareyle üzerine gelme efektlerini de devre dışı bırakır

.myButton{
    position: absolute;
    display: none;
}

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

-1

CSS ile yapmak mümkün

.disabled{
  cursor:default;
  pointer-events:none;
  text-decoration:none;
  color:black;
}
<a href="https://www.google.com" target="_blank" class="disabled">Google</a>

Şuraya bakın:

text-decoration: none;Ve color: black;öğesinin gerekli olmadığını unutmayın, ancak bağlantının düz metin gibi görünmesini sağlar.


-1

pointer-events:none bağlantıyı devre dışı bırakacak:

.disabled {
       pointer-events:none;
}
<a href="#" class="disabled">link</a>

1
Bu iyi, ama elbette, kullanıcılar klavyesini kullanıyorsa çalışmıyor :(
gztomas

-1

<a href="#!">1) Link With Non-directed url</a><br><br>

<a href="#!" disabled >2) Link With with disable url</a><br><br>


2
<a> etiketinin devre dışı bir özelliği yok.
Hexodus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.