Как сделать кнопку похожей на ссылку?

287

Мне нужно, чтобы кнопка выглядела как ссылка с помощью CSS. Изменения сделаны, но когда я нажимаю на нее, она показывает, как будто она нажата как кнопка. Есть идеи, как это убрать, чтобы кнопка работала как ссылка даже при нажатии?

Джеймс Хиббард
источник
4
События onclick для ссылок так же просты, как и для кнопок
knittl
2
@knittl, @cletus На самом деле, ссылки и кнопки имеют совершенно разные значения в HTML. Вы должны прочитать whatwg.org/specs/web-apps/current-work/multipage/… . Может быть не очень хорошая идея стилизовать кнопку, чтобы она выглядела как ссылка, но это зависит от дизайна пользовательского интерфейса, тогда как использование ссылки вместо этого противоречит спецификациям HTML.
Антон Строгонов
5
Есть несколько причин, по которым стиль кнопки, такой как ссылка, может быть необходим. (1) кнопка имеет тип = "отправить" (2) кнопка имеет причудливый стиль, т.е. фоновое изображение с переменной длиной
TJ.
95
Это также может быть более семантически правильным, если что-то будет кнопкой, даже если вы хотите, чтобы это выглядело как ссылка. Например, представьте пару ссылок «Развернуть все | Свернуть все», которые что-то изменят на странице. Нажатие на них вызывает действие, но никуда не ведет пользователя - семантика - это кнопка. Однако дизайнер может иметь ссылки по причинам внешнего вида. Так что это на самом деле очень хороший вопрос.
шейкер
17
Я использую кнопку вместо ссылки, потому что при вызове методов JS со ссылкой я вынужден ссылаться, а #затем использовать event.preventDefault(). Это противно, как и ссылка на javascript:void(0);.
Archonic

Ответы:

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>

adardesign
источник
24
Моя очень небольшая вариация на скрипке - перенесение правила подчеркивания текста: подчеркивание для нажатия кнопки: наведите курсор мыши. смотри в моей раздвоенной скрипке .
odedbd
10
Если вы не хотите , чтобы все кнопки должны быть оформлены в виде ссылок, рамки стиля с чем - то , как button.link {...styles...}тогда <button class="link">Your button</button>. Это также позволяет избежать использования, !importantчто всегда является хорошей идеей.
Archonic
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чтобы очистить все стили на кнопке
Тоббе
Еще один: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>

Надеюсь, это кому-нибудь поможет :) Хорошего дня!

BoJack Всадник
источник
7
Это работало отлично, но оставляло некоторые отступы, в отличие от реальной ссылки <a>. Просто добавьте стиль заполнения: 0! Важный и он золотой. Спасибо!
Дэвид
Кажется, это вызывает проверку формы с помощью jquery validate
Пол Беккер,
Это не надежное решение. Он не только слегка нарушает вертикальное центрирование, но и неявно отключает стилизацию текста и изменения размера шрифта.
Радон Росборо
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="#"

knittl
источник
Я бы использовал его, но не уверен, какие изменения применить, чтобы кнопка не имела отступов.
Да. N даже после того, как в паддине указано 0, отступ остается в силе
4

Вы не можете надевать кнопки как надёжные ссылки во всех браузерах. Я пробовал это сделать, но в некоторых браузерах всегда возникают странные проблемы с отступами, полями или шрифтами. Либо оставьте кнопку похожей на кнопку, либо воспользуйтесь onClick и предотвратите дефолт по ссылке.

Джейкоб Раск
источник
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>

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

GSB
источник