Làm thế nào để làm cho nút trông giống như một liên kết?


287

Tôi cần làm cho một nút trông giống như một liên kết bằng CSS. Các thay đổi đã được thực hiện nhưng khi tôi nhấp vào nó, nó sẽ hiển thị như thể nó được ấn như trong một nút. Bất kỳ ý tưởng làm thế nào để loại bỏ điều đó, để nút hoạt động như một liên kết ngay cả khi nhấp vào?


4
các sự kiện onclick trên các liên kết cũng đơn giản như trên các nút
knittl

2
@knittl, @cletus Trên thực tế, các liên kết và nút có ý nghĩa rất khác nhau trong HTML. Bạn nên đọc whatwg.org/specs/web-apps/civerse-work/multipage/ . Có thể không phải là một ý tưởng tốt để tạo kiểu nút trông giống như liên kết, nhưng nó phụ thuộc vào thiết kế giao diện người dùng, trong khi sử dụng liên kết thay vì chống lại thông số kỹ thuật HTML.
Anton Strogonoff

5
Có một vài lý do tại sao việc tạo kiểu cho một nút như liên kết có thể cần thiết. Nút (1) có loại = "gửi" (2) có kiểu dáng lạ mắt tức là ảnh nền có độ dài thay đổi
TJ.

95
Nó cũng có thể đúng hơn về mặt ngữ nghĩa đối với một cái gì đó là một nút, ngay cả khi bạn muốn nó trông giống như một liên kết. Ví dụ, hãy tưởng tượng một cặp liên kết "Mở rộng tất cả | Thu gọn tất cả" thay đổi một cái gì đó trên trang. Nhấp vào những nguyên nhân này sẽ gây ra hành động, nhưng không đưa người dùng đi bất cứ đâu - ngữ nghĩa là của một nút. Tuy nhiên, nhà thiết kế có thể có các liên kết cụ thể vì lý do ngoại hình. Vì vậy, đây thực sự là một câu hỏi rất hay.
Shacker

17
Tôi đang sử dụng một nút thay vì một liên kết vì kích hoạt các phương thức JS bằng một liên kết, tôi buộc phải liên kết để #sau đó sử dụng event.preventDefault(). Điều đó thật khó chịu, như đang liên kết đến javascript:void(0);.
Archonic

Câu trả lời:


351

button {
  background: none!important;
  border: none;
  padding: 0!important;
  /*optional*/
  font-family: arial, sans-serif;
  /*input has OS specific font-family*/
  color: #069;
  text-decoration: underline;
  cursor: pointer;
}
<button> your button that looks like a link</button>


24
Biến thể rất nhỏ của tôi trên fiddle - di chuyển trang trí văn bản: quy tắc gạch chân để hành động trên nút: di chuột. xem trong fiddle ngã ba của tôi .
odedbd

10
Nếu bạn không muốn tất cả các nút được tạo kiểu dưới dạng liên kết, hãy xác định kiểu theo kiểu như button.link {...styles...}sau đó <button class="link">Your button</button>. Điều này cũng tránh sử dụng !importantluôn luôn là một ý tưởng tốt.
Archonic

3
Nhớ chăm sóc outline. Một số trình duyệt thêm nó vào các nút. Bạn có thể thiết lập outline-color: transparent.
SiliconMind

4
Vui lòng không xóa phác thảo vì điều đó sẽ khiến nút của bạn không thể truy cập được: outlinenone.com
Dominik

4
Thay vì border-bottomsử dụng text-decoration:underline.
ᴍᴀᴛᴛ

86

Mã của câu trả lời được chấp nhận hoạt động trong hầu hết các trường hợp, nhưng để có được một nút thực sự hoạt động giống như một liên kết, bạn cần thêm một chút mã. Điều đặc biệt khó khăn là có được kiểu dáng của các nút tập trung ngay trên Firefox (Mozilla).

CSS sau đây đảm bảo rằng các neo và nút có cùng thuộc tính CSS và hoạt động giống nhau trên tất cả các trình duyệt phổ biến:

button {
  align-items: normal;
  background-color: rgba(0,0,0,0);
  border-color: rgb(0, 0, 238);
  border-style: none;
  box-sizing: content-box;
  color: rgb(0, 0, 238); 
  cursor: pointer;
  display: inline;
  font: inherit;
  height: auto;
  padding: 0;
  perspective-origin: 0 0;
  text-align: start;
  text-decoration: underline;
  transform-origin: 0 0;
  width: auto;
  -moz-appearance: none;
  -webkit-logical-height: 1em; /* Chrome ignores auto, so we have to use this hack to set the correct height  */
  -webkit-logical-width: auto; /* Chrome ignores auto, but here for completeness */
}

/* Mozilla uses a pseudo-element to show focus on buttons, */
/* but anchors are highlighted via the focus pseudo-class. */

@supports (-moz-appearance:none) { /* Mozilla-only */
  button::-moz-focus-inner { /* reset any predefined properties */ 
    border: none;
    padding: 0;
  }
  button:focus { /* add outline to focus pseudo-class */
    outline-style: dotted;
    outline-width: 1px;
  }
}

Ví dụ trên chỉ sửa đổi buttoncác yếu tố để cải thiện khả năng đọc, nhưng nó có thể dễ dàng được mở rộng để sửa đổi input[type="button"], input[type="submit"]input[type="reset"]các yếu tố. Bạn cũng có thể sử dụng một lớp, nếu bạn muốn làm cho chỉ một số nút nhất định trông giống như neo.

Xem JSFiddle này để xem bản demo trực tiếp.

Cũng xin lưu ý rằng điều này áp dụng kiểu neo mặc định cho các nút (ví dụ: màu văn bản màu xanh). Vì vậy, nếu bạn muốn thay đổi màu văn bản hoặc bất cứ thứ gì khác của neo & nút, bạn nên thực hiện việc này sau CSS ở trên.


Mã ban đầu (xem đoạn trích) trong câu trả lời này là hoàn toàn khác nhau và không đầy đủ.


Tại sao bạn cần outline-offset: 0;nếu phác thảo được đặt thành không?
Mohamad

Tôi đã phải thêm box-shadow: noneđể xóa tất cả kiểu dáng trên nút
Tobbe

Một số khác:text-transform: none;
Chiếu sáng

75

Nếu bạn không phiền khi sử dụng twitter bootstrap, tôi khuyên bạn chỉ nên sử dụng lớp liên kết .

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
<button type="button" class="btn btn-link">Link</button>

Tôi hy vọng điều này sẽ giúp ai đó :) Chúc một ngày tốt lành!


7
Điều này hoạt động rất tốt nhưng để lại một số phần đệm trái ngược với liên kết <a> thực. Đơn giản chỉ cần thêm một kiểu đệm: 0! Quan trọng và nó là vàng. Cảm ơn!
David

Điều này dường như kích hoạt xác thực mẫu với xác thực jquery
Paul Becker

Đây không phải là một giải pháp đáng tin cậy. Nó không chỉ phá vỡ một cách tinh tế việc định tâm dọc mà còn vô hiệu hóa việc thay đổi kích thước văn bản và kích thước phông chữ.
Radon Rosborough

5

thử sử dụng giả css :focus

input[type="button"], input[type="button"]:focus {
  /* your style goes here */
}

chỉnh sửa như đối với các liên kết và các sự kiện onclick sử dụng (bạn không nên sử dụng các trình tạo sự kiện javascript nội tuyến, nhưng để đơn giản, tôi sẽ sử dụng chúng ở đây):

<a href="some/page.php" title="perform some js action" onclick="callFunction(this.href);return false;">watch and learn</a>

với this.href bạn thậm chí có thể truy cập vào mục tiêu của liên kết trong chức năng của mình. return falsesẽ chỉ ngăn các trình duyệt theo liên kết khi nhấp vào.

Nếu javascript bị vô hiệu hóa, liên kết sẽ hoạt động như một liên kết bình thường và chỉ cần tải xuống some/page.phpnếu bạn muốn liên kết của mình bị chết khi js bị vô hiệu hóa sử dụnghref="#"


Tôi sẽ sử dụng nó nhưng tôi không chắc chắn về những thay đổi sẽ áp dụng để nút không bị thụt vào.

vâng N ngay cả sau khi cho paddina là 0, vết lõm vẫn còn

4

Bạn không thể tạo kiểu cho các nút như các liên kết đáng tin cậy trên các trình duyệt. Tôi đã thử nó, nhưng luôn có một số vấn đề về phần đệm, lề hoặc phông chữ kỳ lạ trong một số trình duyệt. Sống với việc để nút trông giống như một nút hoặc sử dụng onClick và ngăn chặn Lỗi trên một liên kết.


2
Đó là sự thật trở lại khi các trình duyệt sử dụng các widget gốc. Nó vẫn đúng với bất kỳ trình duyệt gần đây thậm chí từ xa?
aij

1
Đó là năm 2017 và FireFox của tôi vẫn sử dụng các tiện ích gốc.
Michael Scheper

2

Bạn có thể đạt được điều này bằng cách sử dụng css đơn giản như trong ví dụ dưới đây

button {
    overflow: visible;
    width: auto;
}
button.link {
    font-family: "Verdana" sans-serif;
    font-size: 1em;
    text-align: left;
    color: blue;
    background: none;
    margin: 0;
    padding: 0;
    border: none;
    cursor: pointer;
   
    -moz-user-select: text;
 
    /* override all your button styles here if there are any others */
}
button.link span {
    text-decoration: underline;
}
button.link:hover span,
button.link:focus span {
    color: black;
}
<button type="submit" class="link"><span>Button as Link</span></button>

nhập mô tả hình ảnh ở đây

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.