HTML5を使用して<a>内に<button>要素をネストできますか?


145

私は次のことをしています。

 <a href="www.stackoverflow.com">
   <button disabled="disabled" >ABC</button>
 </a>  

これは正常に機能しますが、「要素「ボタン」を要素「ボタン」内にネストすることはできません」というHTML5検証エラーが発生します。

誰か私に何をすべきかについてのアドバイスをくれますか?


8
バリデーターは既にあなたの質問に答えており、そのエラーメッセージでなぜそれが有効でないのかさえあなたに伝えました。
役に立たないコード

1
しかし、Googleがそれをリンクとして表示できるようにしたい場合は、代替手段があります。ボタンの使用例として、次のレコードと前のレコードの「<<」と「>>」というボタンがあります。これらはボタンである必要があると思いますが、機能は新しいページにリンクすることです。
Marie

3
私の質問は、それが問題かどうかです。
Muhammad Umer 2014

1
<button> <a href="dsada.html"> Test </a> </ button>を配置しても、Internet Explorer 11またはFirefoxでは機能しません。
dutraveller 2014

回答:


231

いいえW3CのHTML5仕様ドキュメントによると、これは有効なHTML5ではありません

コンテンツモデル: 透明ですが、インタラクティブなコンテンツの子孫があってはなりません。

a要素は、段落、リスト、表など、セクション全体でもラップできます。

つまり、<a>次のものを除いて、要素を入れ子にすることができます。

  • <a>

  • <audio>controls属性が存在する場合)

  • <button>

  • <details>

  • <embed>

  • <iframe>

  • <img>usemap属性が存在する場合)

  • <input>type属性が非表示状態でない場合)

  • <keygen>

  • <label>

  • <menu>type属性がツールバー状態の場合)

  • <object>usemap属性が存在する場合)

  • <select>

  • <textarea>

  • <video>controls属性が存在する場合)


どこかにリンクするボタンを作成しようとしている場合は、そのボタンを次のように<form>タグで囲みます。

<form style="display: inline" action="http://example.com/" method="get">
  <button>Visit Website</button>
</form>

ただし、<button>CSSを使用してタグのスタイルが設定されていて、システムのウィジェットのように見えない場合...自分でやり直して、<a>タグの新しいクラスを作成し、同じ方法でスタイルを設定します。


1
@Andrew Moore-別の方法はありますか?これは問題を引き起こしたと思います。それが<a>リンクの内部に変更された理由です。何が問題なのかはわかりませんが、ページにはこのようなボタンがたくさんあります。<a>リンクを使用してSEOを改善したかったのかもしれません。
Marie

2
@マリー:リンクをボタンのようにスタイリングする以外に方法はありません。
Andrew Moore

3
ブラウザが前後に移動するときに投稿フォームの再送信を要求するため、user25 notはmethod = "post"を使用する方が適切です。GETはフォームのデフォルトのメソッドなので、簡潔にするためにmethod = "get"を省略できます。
Bijan

4
@AndrewMoore:リンクをボタンのようにスタイリングすると、アクセシビリティなど、独自の一連の問題が発生します。ボタンにフォーカスがあり、スペースバーを押すと、ボタンが実行されます。リンクにはありません。ADAを気にかけている(または気にかけるふりをする必要がある)場合は、これが問題になることがあります。
iconoclast 2016年

2
@jonaspasが示唆したように、<div>内部は<a>HTML5で絶対に有効です。validator.w3.org/nu/...
Socob

43

Bootstrap 3を使用している場合、これは非常にうまく機能します

<a href="#" class="btn btn-primary btn-lg active" role="button">Primary link</a>
<a href="#" class="btn btn-default btn-lg active" role="button">Link</a>

内部の丸いボタンのフォントの素晴らしいアイコンではうまく機能しません
ツールキット

class = 'btn btn-default'を使用すると、他のボタン(MVC6)に一致しました。
crokusek 2016年

12

番号。

次のソリューションはJavaScriptに依存しています。

<button type="button" onclick="location.href='http://www.stackoverflow.com'">ABC</button>

ボタンを既存の<form>with 内に配置method="post"するtype="button"場合は、ボタンに属性があることを確認してください。そうでない場合、ボタンはPOST操作を送信します。このようにして、<form>GET操作ボタンとPOST操作ボタンが混在するを持つことができます。


onclickはファイルプロトコルでは機能しないため、たとえば静的なプレゼンテーションには役立ちません。この場合、フォームアクションプロパティが実行方法です。
netalex

1
ボタンがページにリンクされている場合、それはボタンではなく、アンカーです
Capsule

@Capsule最近、よく見られます。存在するすべてのWeb開発フレームワークのランディングページをご覧ください。私は普段は純粋主義的な議論に賛成ですが、大きな長方形のボタンは、実際のフォームアクションを開始する代わりにページにリンクしている場合でも、リンクよりも明らかにアフォーダンスが優れていることを認めざるを得ません。
TheDudeAbides

JSが無効になっている場合、現在(同じ)のバックアップが<a>内部にあります。6か月後、私はそれを認めたことを間違いなく恥ずかしく思います。<button>href
TheDudeAbides

@TheDudeAbides私はその側面について話しているのではなく、使用したいマークアップについて考えています。このリンクを大きな長方形のボタンとしてスタイリングできない理由は何ですか?サイトでスタイルをまったく使用しない場合を除きますか?ところで、私たちがコメントしている答えの上の答えは、その完璧な例です。これは、ボタンとしてスタイル設定されたアンカータグです。
カプセル

10

私はちょうど同じ問題に飛び込んだところ、「ボタン」タグを「スパン」タグに置き換えて解決しました。私の場合、私はブートストラップを使用しています。これは次のようになります。

<a href="#register"> 
    <span class="btn btn-default btn-lg">
        Subscribe
    </span>
</a> 

4
ブートストラップではスパンはまったく必要ありません。クラス全体を<a>に移動すると、リンクボタンが表示されます。例:<a href="#register" class="btn btn-default btn-lg">購読</a>
Ryan Buddicom

元のポスターは、アンカータグ内にボタンを配置することが可能かどうか尋ねました。受け入れられた回答は、<a>を<a>内に配置することはW3C仕様に反することを示しています。それが、ゴルベルトリが<span>をボタンとしてスタイリングすることを実証した理由だと思います。
StackOverflowUser 2015年

これは<a>、リンクの一部であるがボタンのようにスタイル設定されていない他のコンテンツが内にある場合に意味があります。たとえば、div(画像、背景、テキストなど)内をクリックするとリンクに移動しますが、span見た目はボタンのようにしか見えません。
ジョサイア

7

それが有効だとすれば、それは本当に奇妙なことであり、私はそれが無効であることを期待します。1つのクリック可能な要素を別のクリック可能な要素の中に持つとはどういう意味ですか?ボタンとリンクのどちらですか?


スティーブに感謝します。これは、チームワーカーから提案された方法です。メソッドは機能します。これを行うためのより良い方法はありますか?
Marie

1
@Marieリンクをボタンのように見せたい場合、CSSスタイルを使用してリンクをそのように見せることは簡単です。次のような境界線スタイルを追加しますborder: 2px outset。コーナーを少し丸めたい場合は、border-radiusを使用することもできます。単純な<img>タグもうまく機能します。
役に立たないコード

3

別のオプションは、ボタンのonclick属性を使用することです。

<button disabled="disabled" onClick="location.href='www.stackoverflow.com'" >ABC</button>

これは機能しますが、要素内にある場合のように、ユーザーがホバーにリンクを表示することはありません。


2

最近では、仕様で許可されていない場合でも、ボタンを<a href...><button ...></a>タグ内に埋め込むように機能していると思われます。FWIW...


2
これ<button>は、が内に含まれていない場合に機能します<form>。ただし、ボタンが含まれると(たとえば<form>...<a><button>)、ボタンのオンクリックハンドラを無効にしない限り、これは機能を停止します。これは、このシナリオを回避するために十分な旋回です。
ビショップ

0

ボタンにクラスを追加して、スクリプトをリダイレクトすることができます。

私はこのようにします:

<button class='buttonClass'>button name</button>

<script>
$(".buttonClass').click(function(){
window.location.href = "http://stackoverflow.com";
});
</script>

0

ボタンに画像を埋め込むこともできます。

<FORM method = "POST" action = "https://stackoverflow.com"> 
    <button type="submit" name="Submit">
        <img src="img/Att_hack.png" alt="Text">
    </button>
</FORM> 

2
問題は、OPが当時尋ねた<a> </a>が、その境界内にあることを許可するものに少し制限があることです。そこで受け入れられた質問を見てください。
Thomas


-1

HTML5では、リンク内にボタン要素を埋め込むことはできません。

デフォルトおよび:active(押された)状態でCSSを使用する方が良い:

body{background-color:#F0F0F0} /* JUST TO MAKE THE BORDER STAND OUT */
a.Button{padding:.1em .4em;color:#0000D0;background-color:#E0E0E0;font:normal 80% sans-serif;font-weight:700;border:2px #606060 solid;text-decoration:none}
a.Button:not(:active){border-left-color:#FFFFFF;border-top-color:#FFFFFF}
a.Button:active{border-right-color:#FFFFFF;border-bottom-color:#FFFFFF}
<p><a class="Button" href="www.stackoverflow.com">Click me<a>


-2

私はあなたのjavascriptソリューションを試しますが、仕事のためe.preventDefault();に私のjavascript関数に挿入する必要があります。

<!-- Add your HTML !-->
<a id="id_primary_link" href="my_primary_link.php">
  <button onclick="my_trick_function('my_secondary_link.php')">
</a>


<!-- Add your javascript function !-->
<script>
function my_trick_function(secondary_link){
    $('#id_primary_link').click(function(e) {
        e.preventDefault();
        window.location.replace(secondary_link);
    });
}   
</script>   

-3

ボタン内でformaction属性を使用する

PS!ボタンがtype = "submit"の場合にのみ機能します

<button type="submit" formaction="www.youraddress.com">Submit</button>

また、ボタンを<form>タグに配置する必要があります。
denodster

-3

<a href="index.html">
  <button type="button">Submit</button>
</a>
または、次のようにボタンでJavaスクリプトを使用できます。

<button type="submit" onclick="myFunction()">Submit</button>
<script>
  function myFunction() {
      var w = window.open(file:///E:/Aditya%20panchal/index.html);
    }
</script>


一部のブラウザがそれを許可するようになるだけでも、それが良いアイデアだとは限りません。
denodster
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.