Làm cách nào để vô hiệu hóa một liên kết chỉ sử dụng CSS?


844

Có cách nào để vô hiệu hóa một liên kết bằng CSS không?

Tôi có một lớp được gọi current-pagevà muốn liên kết với lớp này bị vô hiệu hóa để không có hành động nào xảy ra khi chúng được nhấp.


42
Sau khi có rất nhiều người, tôi đã có câu trả lời hoàn hảo cho câu hỏi này css-tricks.com/pulum-events-civerse-nav
RSK

1
Cho dù một liên kết nên được sử dụng hay không mang nhiều ngữ nghĩa hơn giá trị trình bày. Không nên vô hiệu hóa nó thông qua CSS, nhưng thông qua việc sử dụng hiddenthuộc tính có thể áp dụng cho bất kỳ thành phần HTML nào. CSS sau đó có thể được sử dụng để chọn ví dụ a[hidden]neo và định kiểu cho phù hợp.
Amn

@amn nhưng tôi không nghĩ các trình duyệt sẽ hiển thị một phần tử với thuộc tính ẩn để kiểu dáng trở thành mô hình.
dùng1794469

1
@ user1794469 Họ sẽ nếu bạn hướng dẫn họ, bằng CSS, bằng cách sử dụng display: block, ví dụ hoặc một số giá trị khác cho display. Nhưng hiddenkhông phải lúc nào cũng có thể áp dụng - nó dành cho các yếu tố không liên quan và từ câu hỏi không rõ tại sao liên kết nên bị vô hiệu hóa. Đây có lẽ là một trường hợp của vấn đề XY.
Amn

Câu trả lời:


1348

Câu trả lời đã có trong các bình luận của câu hỏi. Để dễ nhìn hơn, tôi đang sao chép giải pháp này tại đây:

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

Để được hỗ trợ trình duyệt, vui lòng xem https://caniuse.com/#feat=pulum-events . Nếu bạn cần hỗ trợ IE, có một cách giải quyết; thấy câu trả lời này .

Cảnh báo: Việc sử dụng pointer-eventsCSS cho các phần tử không phải SVG là thử nghiệm. Tính năng từng là một phần của đặc tả dự thảo UI CSS3, nhưng do nhiều vấn đề mở, đã bị hoãn lại với CSS4.


36
Ngoài ra, điều này không tránh việc gắn thẻ vào liên kết sau đó nhập.
Jono

4
Nếu bạn định kiểu một chút, để người dùng có thể thấy nó bị vô hiệu hóa. Cung cấp cho nó một số độ mờ đục: .2
DNRN

4
Điều này hiện hoạt động trong tất cả các trình duyệt hiện đại bao gồm IE 11. Nếu bạn cần hỗ trợ cho IE 10 trở xuống, bạn có thể sử dụng một polyfill JavaScript như cái này .
Keavon

26
Lưu ý quan trọng: Điều này chỉ vô hiệu hóa nhấp chuột, không phải chính liên kết thực tế. Bạn vẫn có thể sử dụng tab + enter để "nhấp" vào liên kết.
Pikamander2

11
Sử dụng pointer-events: none;là không hoàn hảo. Nó cũng vô hiệu hóa các sự kiện khác như di chuột, cần thiết để hiển thị title="…"hoặc chú giải công cụ. Tôi thấy giải pháp JS tốt hơn (sử dụng event.preventDefault();) cùng với một số CSS ( cursor: default; opacity: 0.4;) và một chú giải công cụ giải thích lý do tại sao liên kết bị tắt.
Quinn Comendant

140

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


Bạn có thể cần phải đặt màn hình thành khối nội tuyến (hoặc một cái gì đó không phải là nội tuyến).
dev_masta

tốt, nhưng hãy cẩn thận với sự kiện hỗ trợ trình duyệt con trỏ (ví dụ <IE11): caniuse.com/#search=pulum-events
một người yêu dấu

1
Đối với phong cách, hãy thử thay đổi pointer-events:none;để pointer-events:unset;. Sau đó, con trỏ có thể được thay đổi thành cursor:not-allowed;. Điều này cung cấp một manh mối tốt hơn về những gì đang xảy ra với người dùng. Có vẻ như hoạt động trong FF, Edge, Chrome, Opera và Brave cho đến ngày hôm nay.
Sablefoste

@Sablefoste Điều đó không hoạt động với tôi trong Chrome 60. Con trỏ thực sự not-allowed, nhưng liên kết vẫn có thể nhấp.
súpdog

122

CSS chỉ có thể được sử dụng để thay đổi phong cách của một cái gì đó. Điều tốt nhất bạn có thể làm với CSS thuần túy là ẩn liên kết hoàn toàn.

Những gì bạn thực sự cần là một số javascript. Đây là cách bạn làm những gì bạn muốn bằng thư viện jQuery.

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

21
Đừng quên ngăn chặn các hành vi mặc định : function(ev){ ev.preventDefault(); ev.stopPropagation(); return false;.
ldiqual

5
@Idiqual, return falsethực hiện điều đó
nickf

1
return falsechỉ hoạt động nếu hành động được đặt bằng hrefthuộc tính
Justin

Ngoài ra phiên bản này có thể được sử dụng để vô hiệu hóa các nhấp chuột trong khi vẫn giữ các sự kiện con trỏ khác như: hover hoặc: tập trung! Câu trả lời hàng đầu!
Charlie Tupman

Mặc dù điều này hoạt động trong tất cả các trình duyệt, nhưng nó chỉ bị vô hiệu hóa khi nhấp vào một liên kết. Hãy nhớ rằng nhiều người dùng được sử dụng để mở các liên kết từ menu ngữ cảnh hoặc bằng cách sử dụng nút chuột giữa.
Alexandru Severin

33

CSS không thể làm điều đó. CSS chỉ để trình bày. Lựa chọn của bạn là:

  • Không bao gồm hrefthuộc tính trong của bạn<a> thẻ .
  • Sử dụng JavaScript, để tìm các phần tử neo với điều đó classvà loại bỏ các thuộc tính hrefhoặc onclickthuộc tính của chúng tương ứng. jQuery sẽ giúp bạn điều đó (NickF đã chỉ ra cách làm một cái gì đó tương tự nhưng tốt hơn).

30
Đó không phải là câu trả lời đúng - sự kiện con trỏ: không có; Css có thể vô hiệu hóa nó.
pie6k

Tôi đã không nghĩ về điều đó! Hoặc có thể thuộc tính chưa tồn tại trong năm 2010? Trong mọi trường hợp, điều đó đúng pointer-events: nonecó thể vô hiệu hóa các sự kiện chuột. Tuy nhiên, nó không vô hiệu hóa liên kết cơ bản. Trong một thử nghiệm tôi đã thử trong Chrome 81, tôi vẫn có thể kích hoạt một liên kết như vậy bằng cách bấm vào nó và gõ phím quay lại.
Kevin Conner

31

Liên kết vô hiệu hóa Bootstrap

<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>

Nút vô hiệu hóa Bootstrap nhưng có vẻ như liên kết

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

19

Bạn có thể đặt hrefthuộc tính thànhjavascript:void(0)

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


2
@nickf đúng, tuy nhiên, đây là một giải pháp gọn gàng và tốt hơn là dựa vào kiểu IE mặc định kém khi được đặt thành bị tắt.
Xúc xíchFingers

Tôi nghĩ nó có thể phức tạp hơn thế một chút. Đây là một giải pháp snook.ca/archives/javascript/clear_links_to_1
Mike Gifford

12

Tôi đã sử dụng:

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

Và không đủ; trong một số trình duyệt nó vẫn hiển thị liên kết, nhấp nháy.

Tôi đã phải thêm:

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

3
Tôi nghĩ a[disabled]:active { pointer-events: none !important; }là tốt hơn.
Masamoto Miyata


10

Nếu bạn muốn nó chỉ là CSS, logic vô hiệu hóa phải được xác định bởi CSS.

Để di chuyển logic trong các định nghĩa CSS, bạn sẽ phải sử dụng các bộ chọn thuộc tính. Dưới đây là một số ví dụ:

Vô hiệu hóa liên kết có chính xác href: =

Bạn có thể chọn tắt các liên kết có chứa giá trị href cụ thể như vậy:

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

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

Vô hiệu hóa một liên kết có chứa một phần của đường dẫn: *=

Tại đây, mọi liên kết chứa /keyword/trong đường dẫn sẽ bị vô hiệu hóa

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

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

Vô hiệu hóa một liên kết bắt đầu bằng: ^=

các [attribute^=value]nhà điều hành mục tiêu một thuộc tính mà bắt đầu với một giá trị cụ thể. Cho phép bạn loại bỏ các trang web và đường dẫn gốc.

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

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

Bạn thậm chí có thể sử dụng nó để vô hiệu hóa các liên kết không https. Ví dụ :

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

Vô hiệu hóa một liên kết kết thúc bằng: $=

Các [attribute$=value]nhà điều hành nhắm vào một thuộc tính mà kết thúc với một giá trị cụ thể. Nó có thể hữu ích để loại bỏ phần mở rộng tập tin.

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

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

Hoặc bất kỳ thuộc tính nào khác

Css có thể nhắm mục tiêu bất kỳ thuộc tính HTML. Có thể là rel, target, data-customvà vân vân ...

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

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

Kết hợp các bộ chọn thuộc tính

Bạn có thể xâu chuỗi nhiều quy tắc. Giả sử bạn muốn vô hiệu hóa mọi liên kết bên ngoài, nhưng không phải những liên kết trỏ đến trang web của bạn:

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

Hoặc vô hiệu hóa liên kết đến tệp pdf của một trang web cụ thể:

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

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

Hỗ trợ trình duyệt

Các bộ chọn thuộc tính được hỗ trợ kể từ IE7. :not()bộ chọn từ IE9.


Làm cách nào để tắt liên kết bằng bộ chọn bị vô hiệu hóa? ví dụ: <a class="test" Bị vô hiệu hóa = 3 thử nghiệm </a> a: bị vô hiệu hóa {con trỏ: không được phép; }
ecasper

10

Một cách bạn có thể làm điều này với CSS, là đặt CSS trên một gói div mà bạn đặt biến mất và một cái gì đó khác diễn ra.

Ví dụ:

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

Với CSS như

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

Để thực sự tắt, abạn sẽ phải thay thế sự kiện nhấp chuột hoặchref , như được mô tả bởi những người khác.

Tái bút: Chỉ cần làm rõ Tôi coi đây là một giải pháp khá gọn gàng và đối với SEO nó cũng không phải là tốt nhất, nhưng tôi tin rằng nó là tốt nhất với CSS hoàn toàn.


8

Thử cái này:

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

6

Các con trỏ-sự kiện bất động sản cho phép kiểm soát cách các phần tử HTML đáp ứng với chuột / cảm ứng sự kiện - bao gồm cả di chuột CSS / bang hoạt động, nhấp chuột / sự kiện tap trong Javascript, và có hoặc không phải là con trỏ có thể nhìn thấy.

Đó không phải là cách duy nhất bạn vô hiệu hóa Liên kết , mà là cách CSS tốt hoạt động trong IE10 + và tất cả các trình duyệt mới:

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


4

Tôi đã tìm kiếm trên internet và thấy không tốt hơn thế này . Về cơ bản để tắt chức năng nhấp vào nút, chỉ cần thêm kiểu CSS bằng jQuery như vậy:

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

Sau đó, để kích hoạt nó một lần nữa làm điều này

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

Đã kiểm tra trên Firefox và IE 11, nó đã hoạt động.


3
Bạn không cần jQuery cho việc này, bạn có thể tự đặt nó trong CSS.
Bram Vanroy

3

bạn có thể sử dụng css này:

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

Nhờ mọi người đã đăng các giải pháp, tôi đã kết hợp nhiều cách tiếp cận để cung cấp một số disabledchức năng nâng cao hơn . Đây là một ý chính , và mã dưới đây.

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()

Đây là lớp coffescript:

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

Xin chào !!, câu trả lời là về CSSkhông JShoặc bất cứ điều gì khác!
Mehdi Dehghani

1

Bạn cũng có thể kích thước một yếu tố khác để nó bao phủ các liên kết (sử dụng chỉ số z bên phải): Điều đó sẽ "ăn" các nhấp chuột.

(Chúng tôi đã phát hiện ra điều này một cách tình cờ vì chúng tôi gặp sự cố với các liên kết không hoạt động đột ngột do thiết kế "phản ứng nhanh" khiến H2 che phủ chúng khi cửa sổ trình duyệt có kích thước di động.)


Đúng, nhưng không cho điều hướng bàn phím.
AndFisher 7/12/2016

1

Demo tại đây
Hãy thử cái này

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

1
Fiddle của bạn không hoạt động! Liên kết vẫn hoạt động trong Chrome.
Matt Byrne

Để sửa mã này, hoán đổi hai tham số đầu tiên được truyền vào on (): $ ('html'). On ('click', 'a.Link', function (event) {event.preventDefault ();});
2C-B

1
Xin chào !!, câu trả lời là về CSSkhông JShoặc bất cứ điều gì khác!
Mehdi Dehghani

0

Một mẹo khác là đặt một yếu tố vô hình lên trên nó. Điều này cũng sẽ vô hiệu hóa bất kỳ hiệu ứng di chuột nào

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

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

-1

Có thể làm điều đó bằng CSS

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

Xem tại:

Xin lưu ý rằng text-decoration: none;color: black;không cần thiết nhưng nó làm cho liên kết trông giống văn bản thuần túy hơn.


-1

pointer-events:none sẽ vô hiệu hóa liên kết:

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

1
Điều này là tốt, nhưng tất nhiên, không hoạt động nếu người dùng sử dụng bàn phím của anh ấy :(
gztomas 23/03/18

-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
Thẻ <a> không có thuộc tính bị vô hiệu hóa.
Hexodus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.