ボタンをリンクのようにする方法は?


287

CSSを使用してボタンをリンクのようにする必要があります。変更は完了しましたが、それをクリックすると、ボタンのように押されたかのように表示されます。それを削除して、ボタンをクリックしてもリンクとして機能するようにする方法はありますか?


4
リンクのonclickイベントはボタンの場合と同じくらい簡単です
knittl

2
@ knittl、@ cletus実際、リンクとボタンはHTMLで非常に異なる意味を持っています。whatwg.org/specs/web-apps/current-work/multipage/…をお読みください。リンクのように見えるようにボタンのスタイルを設定することはお勧めできませんが、UIの設計に依存しますが、代わりにリンクを使用するとHTMLの仕様に反します。
アントンストロゴノフ2011年

5
リンクのようにボタンのスタイルを設定する必要がある理由はいくつかあります。(1)ボタンにはtype = "submit"があります。(2)ボタンには豪華なスタイルがあります

95
また、リンクのように見せたい場合でも、ボタンの場合は意味的に正しい場合があります。たとえば、ページ上の何かを変更する "Expand All | Collapse All"リンクのペアを想像してみてください。これらをクリックするとアクションが発生しますが、ユーザーはどこにも移動しません。セマンティクスはボタンのセマンティクスです。ただし、外観上の理由により、設計者はリンクを指定している場合があります。したがって、これは実際には非常に良い質問です。
ハッカーは

17
リンクでJSメソッドをトリガーするため、リンクではなくボタンを使用しています。リンクしてから#を使用する必要がありますevent.preventDefault()。にリンクしているように、それは厄介javascript:void(0);です。
Archonic

回答:


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
フィドルに関する非常にわずかなバリエーション-text-decoration:underlineルールをbutton:hoverに作用するように移動しました。私のフォークのバイオリンを見てください。
odedbd 2013年

10
すべてのボタンをリンクとしてスタイリングしたくない場合は、button.link {...styles...}thenのようなものでスタイルのスコープを設定します<button class="link">Your button</button>。これ!importantは、常に良い考えである使用を避けます。
Archonic

3
注意してくださいoutline。一部のブラウザにはボタンが追加されています。設定できますoutline-color: transparent
SiliconMind 2014

4
アウトラインを削除しないでください。ボタンを使用できなくなります:outlinenone.com
Dominik

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;アウトラインがなしに設定されている場合、なぜ必要なのですか?
Mohamad

box-shadow: noneボタンのすべてのスタイルをクリアするために追加する必要がありました
Tobbe

もう1つ: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>リンクとは対照的に、いくつかのパディングを残しました。padding:0!importantのスタイルを追加するだけで、黄金色になります。ありがとう!
David

これにより、jquery validateによるフォーム検証がトリガーされるようです
Paul Becker

これは信頼できるソリューションではありません。垂直方向の中央揃えが微妙に崩れるだけでなく、テキストのスタイルやフォントサイズの変更が暗黙的に無効になります。
Radon Rosborough

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>

this.hrefを使用すると、関数内のリンクのターゲットにアクセスすることもできます。return falseブラウザがクリックされたときにリンクをたどらないようにするだけです。

JavaScriptが無効になっている場合、リンクは通常のリンクとして機能し、ロードsome/page.phpするだけです。jsが無効になっているときにリンクを無効にしたい場合は、href="#"


私はそれを使用しますが、ボタンがインデントされないようにするために適用する変更についてはよくわかりません。

ええ。Nはpaddinaを0として指定した後でもインデントが残っています

4

ブラウザ全体で確実にボタンをリンクとしてスタイル設定することはできません。私はそれを試しましたが、いくつかのブラウザでは常にいくつかの奇妙なパディング、マージンまたはフォントの問題があります。ボタンがボタンのように見えるようにするか、リンクでonClickおよびpreventDefaultを使用します。


2
ブラウザーがネイティブウィジェットを使用していたとき、それは真実でした。それはまだ最近のブラウザーにも当てはまりますか?
aij 2016年

1
それは2017年であり、私のFireFoxはまだネイティブウィジェットを使用しています。
Michael Scheper

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>

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.