Як зробити так, щоб кнопка виглядала як посилання?


287

Мені потрібно зробити кнопку схожою на посилання за допомогою CSS. Зміни виконуються, але коли я натискаю на нього, він показує, ніби його натискають як на кнопку. Будь-яка ідея, як це зняти, щоб кнопка працювала як посилання навіть при натисканні?


4
події onclick на посиланнях такі ж прості, як і на кнопках
knittl

2
@knittl, @cletus Власне, посилання та кнопки мають дуже різний зміст у HTML. Ви повинні прочитати whatwg.org/specs/web-apps/current-work/multipage/… . Можливо, це не дуже гарна ідея, щоб кнопка стилю виглядала як посилання, але це залежить від дизайну інтерфейсу, тоді як використання посилання замість специфікацій HTML.
Антон Строгонофф

5
Є кілька причин, чому може бути необхідним стилізація кнопки як посилання. (1) кнопка має type = "submit" (2) кнопка має вишукану стильову форму, тобто фонове зображення зі змінною довжиною
TJ.

95
Також може бути більш семантично правильним, щоб щось було кнопкою, навіть якщо ви хочете, щоб це виглядало як посилання. Наприклад, уявіть пару посилань "Розгорнути все | Згорнути все", які щось змінюють на сторінці. Натискання на них викликає дію, але не переносить користувача нікуди - семантика - це кнопки. Однак дизайнер може мати конкретні посилання з причин зовнішності. Тож це насправді дуже гарне питання.
шейкер

17
Я використовую кнопку замість посилання, тому що запускаючи методи JS за допомогою посилання, я змушений посилатися, #а потім використовувати event.preventDefault(). Це противно, як і посилання на javascript:void(0);.
Архонічний

Відповіді:


352

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
Моя дуже незначна зміна на скрипці - перемістила текст прикраси: підкреслити правило, щоб діяти на кнопку: навести курсор. дивіться у моїй роздвоєній скрипці .
odedbd

10
Якщо ви не хочете , щоб все кнопки повинні бути оформлені в вигляді посилань, рамки стилю з чим - то , як button.link {...styles...}тоді <button class="link">Your button</button>. Це також уникає використання, !importantщо завжди є хорошою ідеєю.
Архонічний

3
Не забудьте подбати outline. Деякі браузери додають її кнопки. Ви можете встановити outline-color: transparent.
SiliconMind

4
Не видаляйте контури, оскільки це зробить вашу кнопку недоступною: outlinenone.com
Домінік

4
Замість border-bottomвикористання text-decoration:underline.
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

86

Код прийнятої відповіді працює в більшості випадків, але щоб отримати кнопку, яка справді веде себе як посилання, потрібно трохи більше коду. Особливо складно придбати стилізовані кнопки прямо на Firefox (Mozilla).

Наведений нижче CSS гарантує, що якір та кнопки мають однакові властивості CSS та поводяться однаково у всіх звичайних браузерах:

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

Наведений вище приклад змінює лише buttonелементи для поліпшення читабельності, але їх можна легко розширити, щоб змінити input[type="button"], input[type="submit"]і input[type="reset"]елементи. Ви також можете використовувати клас, якщо ви хочете, щоб лише певні кнопки виглядали як якір.

Дивіться цей JSFiddle для прямої демонстрації.

Також врахуйте, що це стосується стилю якоря за замовчуванням до кнопок (наприклад, синій колір тексту). Тож якщо ви хочете змінити колір тексту або що-небудь інше з якорів і кнопок, вам слід зробити це після CSS, наведеного вище.


Оригінальний код (див. Фрагмент) у цій відповіді був зовсім іншим та неповним.


Навіщо вам це потрібно, outline-offset: 0;якщо контур встановлений у жодному?
Мохаммад

Мені довелося додати, box-shadow: noneщоб очистити всі стайлінг на кнопці
Tobbe

Ще один:text-transform: none;
Shone Tow

75

Якщо ви не заперечуєте проти завантажувального завантаження Twitter, я пропоную вам просто скористатися класом посилань .

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

Я сподіваюся, що це комусь допоможе :) Приємного дня!


7
Це спрацювало чудово, але залишило деяку підкладку на відміну від реального посилання <a>. Просто додайте стиль підкладки: 0! Важливо, і це золото. Дякую!
Девід

Це, здається, запускає перевірку форми з підтвердженням jquery
Пол Бекер

Це не надійне рішення. Він не лише тонко порушує вертикальне центрування, але й неявно вимикає стилізацію тексту та зміни розміру шрифту.
Радон Росборо

5

спробуйте використовувати псевдоклас css :focus

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

редагуйте щодо використання посилань та подій onclick (ви не повинні використовувати вбудовані обробники подій Javascript, але для простоти я буду використовувати їх тут):

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

за допомогою цього.href ви навіть можете отримати доступ до цілі посилання у вашій функції. return falseпросто запобіжить переглядачам переходити посилання при натисканні на нього.

якщо JavaScript відключений, посилання працюватиме як звичайне посилання та просто завантажується some/page.php- якщо ви хочете, щоб ваше посилання було мертвим, коли js вимкнено, використовуйтеhref="#"


Я б використовував його, але я не дуже впевнений, які зміни слід застосувати, щоб кнопка не стала відступати.

так. N навіть після надання paddina як 0 відступ все ще залишається

4

Ви не можете надійно стилізувати кнопки як посилання у веб-переглядачах. Я спробував це, але завжди є якісь дивні проблеми з підкладкою, полями або шрифтами в якомусь браузері. Або живіть, якщо кнопка виглядає як кнопка, або використовуйте onClick і завадятьDefault за посиланням.


2
Це було вірно, коли браузери використовували рідні віджети. Чи все-таки це стосується будь-яких, навіть віддалених останніх браузерів?
aij

1
Настав 2017 рік, і мій FireFox як і раніше використовує рідні віджети.
Майкл Шепер

2

Ви можете досягти цього, використовуючи простий css, як показано нижче в прикладі

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>

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.