divをリンクに作ります


545

<div>変更したくない、派手なビジュアルコンテンツを含むブロックがあります。クリック可能なリンクにしたい。

私はのようなものを探していますが<a href="…"><div> … </div></a>、それは有効なXHTML 1.1です。


79
良い理由の1つは、div内の背景画像です
Simon_Weaver

1
私は最も投票された回答に基づいた良い実用的な例を持っています。フィドルをここで
マイク

7
HTML5では、のdiv下にがあることは完全に有効ですa
ファンA.ナバロ

回答:


739

私のより良い解決策を見つけることを期待してここに来ましたが、ここで提供されているものは好きではありません。質問を誤解している方もいらっしゃると思います。OPは、コンテンツでいっぱいのdivをリンクのように動作させたいと考えています。これの1つの例はFacebook広告です-あなたが見れば、それらは実際には適切なマークアップです。

私にとってのno-nosは次のとおりです。javascript(リンクのためだけに必要ではなく、非常に悪いSEO /アクセシビリティ)。無効なHTML。

本質的にはこれです:

  • 通常のCSS技術と有効なHTMLを使用してパネルを作成します。
  • ユーザーがパネルをクリックした場合に、デフォルトのリンクにしたいリンクをどこかに配置します(他のリンクも使用できます)。
  • そのリンクの内側に、空のスパンタグを挿入します(<span></span>ではなく、<span />ありがとう@Campey)。
  • パネルの位置を与える:相対
  • 空のスパンに次のCSSを適用します。

    { 
      position:absolute; 
      width:100%;
      height:100%;
      top:0;
      left: 0;
    
      z-index: 1;
    
      /* fixes overlap error in IE7/8, 
         make sure you have an empty gif */
      background-image: url('empty.gif');
    }   
    

    これでパネルが覆われ、<A>タグの中にあるので、クリック可能なリンクになります。

  • パネルposition:relativeと適切なz-index(> 1)内の他のリンクを与えて、デフォルトのスパンリンクの前に配置します。

11
ありがとうございます。IE8で(私がしたように)物事がひどく壊れた場合は、空のスパン(<span ... />)ではなく、開始および終了のスパンタグ(<span ...> </ span>)があることを確認してください。 )。
カンペイ

1
コードはIE7 / 8では完全には機能しません<a><span></span></a>。選択可能な他の要素が要素よりも優先されます。つまり、z-indexが設定されていても、コンテナ内の画像とテキストはリンクしません。
スポイケ

67
私のように愚かで何かを誤解している人のためのフィドルは、少し遊んでいました:jsfiddle.net/hf75B/1
AlexMA

7
IE9でこれを試しましたか?私はこの方法が好きで、私はそれを使用していますが、IE9で(@AlexMAからのフィドルを含む)をテストしたところ、テキストのEXCEPTを除いて、divの任意の場所をクリックできることがわかりました。テキストの上にカーソルを置くと、カーソルが標準のテキストカーソルに変わり、テキストをクリックしても何も起こりません。ユーザーがテキスト要素をクリックする傾向があるため(およびテキスト要素がdivの大部分を占める場合)、このソリューションはIE9で使用できなくなります。他の誰かがこれを経験したか、解決策を持っていますか?
bigmac 2012

2
誰かが:hover cssをこのソリューションで機能させる方法を知っていますか?おそらく、フィドルに置かれた答えを参照していますか?
nktokyo 2016年

252

divリンク自体を作成することはできませんが、<a>タグの動作をblockと同じにすること<div>ができます。

a {
    display: block;
}

次に、その上に幅と高さを設定できます。


11
ただし、これによって「div」がリンクになりません。ブロック要素へのリンクを作成します。少し違います。
jjnguy 2009

1
これはあなたの問題の解決策です。divを変更できるため、ハイパーリンクのようにクリックできますが、すべてのブラウザーで表示するためにカーソル(=ハンド)を設定することはできません(IEのみがサポートします!)。
Soul_Master 2009

3
jjnguy:どうやって?リンクに多くのコンテンツを含めることは嫌いですが、これはナビゲーションメニューの一部などになることもあります。アンカー要素(<a>)は必ずしもプレーンテキストである必要はありませんか?それをブロックにするのはどのように間違っていますか?意味的に正しいので、好きなように表示することができます。
Arve Systad 2009

23
これは漠然とした質問に対する完全に有効な解決策です。実際にはアンカー要素をdivの周りに単にラップすることができますが、それは意味的に正しくありません。(インライン要素内のブロック要素)。
Traingamer 2009

3
jjnguy:これはかなり一般的な方法です。divをリンクで置き換えると言っているのではありませんが、質問の音から、彼はボタンのようにクリックできるブロックを望んでいました。
ソビエト2009

72

これは古代の質問ですが、私はここの誰もがいくつかのクレイジーなソリューションを持っているので、私はそれに答えると思いました。とてもシンプルです...

アンカータグはこのように機能します-

<a href="whatever you want"> EVERYTHING IN HERE TURNS INTO A LINK </a>

すごい...

<a href="whatever you want"> <div id="thediv" /> </a>

これが有効かどうかはわかりませんが。それが音声ソリューションの背後にある理由である場合、私は謝罪します...


6
<div>インタラクティブなコンテンツ(他の<a>要素、<button>要素など)を含まない限り、これは有効なHTMLです。

50
リンクの例外となっているHTML5を使用している場合除き、あなたの例はインライン要素に含まれるブロック要素である有効なHTMLではありません。
ピア

1
これは悪い例です。aタグが行うのはa内のすべてのテキストを取り、divそれに下線を引くためです...これはスタイルで軽減できますが、トップの回答の方が優れています。
Dmitri Nesteruk、2011

2
a #thediv{font-weight:normal;text-decoration:none;}スタイル的に必要なのはこれだけです。
tyjkenn

1
これを試してみましたが、機能しましたが、要素の配置に問題がありました。はいDOCTYPEはChromeのHTML5(一部2014年版)..です
BAR

60

少しjavascriptが必要です。しかし、あなたdivはクリック可能でしょう。

<div onclick="location.href='http://www.example.com';" style="cursor:pointer;"></div>

9
ただし、ページのセマンティクスが悪いため、技術的には可能ですが、これは避けます。
Arve Systad 2009

2
このソリューションを使用することを考えましたが、それはちょっと醜いです。私はディスプレイに関するソリューションが好きです。
allyourcode 2009年

9
これはリンクのように見えますが、実際のリンクではありません。使いやすさとアクセシビリティの問題が深刻で、非常に厄介なソリューションです。
WhyNotHugo

2
最良のソリューション。スクリプトを実行して、 "this"を送信するだけです。
Arman Hayots 2013

3
jsが有効になっていない場合、機能が失われます。同様にSEOに悪いです。
BAR

40

このオプションは、最も賛成された回答のようにempty.gifを必要としません:

HTML:

 <div class="feature">
       <a href="http://www.example.com"></a>
 </div>

CSS:

 div.feature {
        position: relative;
    }

    div.feature a {
        position: absolute;
        width: 100%;
        height: 100%;
        top: 0;
        left: 0;
        text-decoration: none; /* No underlines on the link */
        z-index: 10; /* Places the link above everything else in the div */
        background-color: #FFF; /* Fix to make div clickable in IE */
        opacity: 0; /* Fix to make div clickable in IE */
        filter: alpha(opacity=1); /* Fix to make div clickable in IE */
    }

http://www.digitalskydesign.com/how-to-make-an-entire-div-a-link-using-css/で提案されているとおり


1
ありがとう!Chris Jumonvilleのソリューションは、AndriodとiPhoneの両方でうまく機能しています。例:gastateparks.org/specials
Loren

1
それはすべきではないdiv.feature > aだけで、「その他」の部分も奥深くに隠されたリンクが含まれている場合には?
TWiStErRob

これは選択された答えになるはずで、ブートストラップでも動作します
Anthony Kal

23

これは、目的を達成するための「有効な」ソリューションです。

<style type="text/css">
.myspan {
    display: block;
}
</style>
<a href="#"><span class="myspan">text</span></a>

しかし、最も可能性が高いのは、<a>タグをブロックレベルの要素として表示することです。

ハイパーリンクをシミュレートするためにJavaScriptを使用することはお勧めしません。これは、マークアップ検証の目的に反するためです。これは、最終的にはアクセシビリティを促進することです(適切なセマンティックルールに従って整形式のドキュメントを公開すると、同じドキュメントが異なるブラウザーで異なるように解釈される可能性が最小限になります)。

検証は行わないが、JavaScriptが無効になっているブラウザーを含め、すべてのブラウザー適切にレンダリングおよび機能するWebページを公開することをお勧めします。さらに、を使用onclickしても、スクリーンリーダーがdivがリンクとして機能していると判断するためのセマンティック情報は提供されません。


14

最もクリーンな方法は、HTMLで導入されたデータタグでjQueryを使用することです。このソリューションを使用すると、必要なすべてのタグにリンクを作成できます。最初に、データリンクタグを使用してタグ(例:div)を定義します。

<div data-link="http://www.google.at/">Some content in the div which is arbitrary</div>

これで、好きなようにdivをスタイルできます。また、「リンク」のような動作のスタイルも作成する必要があります。

[data-link] {
  cursor: pointer;
}

そして最後に、このjQuery呼び出しをページに配置します。

$(document).ready(function() {
  $("[data-link]").click(function() {
    window.location.href = $(this).attr("data-link");
    return false;
  });
});

このコードを使用すると、jQueryは「data-link」属性を持つページ上のすべてのタグにクリックリスナーを適用し、data-link属性にあるURLにリダイレクトします。


データ属性に関する情報を取得するには、ejohn.org
Erhard Dinhobl '26

13

これが有効かどうかはわかりませんが、うまくいきました。

コード :

<div style='position:relative;background-color:#000000;width:600px;height:30px;border:solid;'>
  <p style='display:inline;color:#ffffff;float:left;'> Whatever </p>     
  <a style='position:absolute;top:0px;left:0px;width:100%;height:100%;display:inline;' href ='#'></a>
</div>


9

ピアの回答をIE 7以降で機能させるには、いくつかの調整が必要です。

  1. 要素にbackground-colorがない場合、IEはz-indexを受け入れません。そのため、リンクは、コンテンツを含むcontainsig divの部分と重複せず、空白部分のみを重複させます。これを修正するために、背景が不透明度0で追加されます。

  2. リンクアプローチでスパンを使用すると、何らかの理由でIE7とさまざまな互換モードが完全に失敗します。ただし、リンク自体にスタイルが指定されている場合は、問題なく機能します。

.blockLink  
{  
    position:absolute;  
    top:0;  
    left: 0;  
    width:100%;  
    height:100%;  
    z-index: 1;  
    background-color:#ffffff;   
    -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";  
    filter: alpha(opacity=0);  
    opacity:0;  
}
<div style="position:relative">  
    <some content>  
    <a href="somepage" class="blockLink" />  
<div>

8

アンカーをラップしてから、その高さと幅を親と同じになるように変更することもできます。これは完璧に機能します。

<div id="css_ID">
    <a href="http://www.your_link.com" style="display:block; height:100%; width:100%;"></a>
</div>

1
また、親divにゼロのパディングがあり、<a>タグにゼロのマージンがあることを確認することもできます。
Nilpo 2012

4

何故なの?use <a href="bla"> <div></div> </a>HTML5で正常に動作します


HTML検証に合格しません。ラインアイテムはブロックアイテムを保存できません。
Krzysztof Trzos

つまり、それ<div><span></span></div>は有効であり、そうで<span><div></div></span>はありません。display: inline;アイテムのタイプをアイテムに入れるべきではありませんdisplay: block;<a>タグは、インラインボックスです。
Krzysztof Trzos

ええ、それは機能します。なぜなら、あなたは複数の方法(より良いまたはより悪い)でそれを行うことができるからです。この特定のソリューションは、古いHTML検証の原因としてはよくありません:)。
Krzysztof Trzos

1
「古いHTML検証」がこれを通過しないことは重要ですか?それは現在許可されています、html5と理由のため、なぜそれを使用しないのですか?私はこの解決策は素晴らしいと思います(それはしばしばdivコンテンツへの下線の削除を必要としますが、それでもまだです)。
Todilo、2015

@Todilo <a><div></div></a>は有効で機能しているが、<a><div><a></a></div></a>無効で機能しないため。
coredumperror 2017

3

この投稿は古いですが、表示をブロックに設定して通常のリンクタグを記述するだけではIEでdiv全体がクリック可能にならないため、同じ問題を修正する必要がありました。したがって、この問題を修正するには、JQueryを使用する必要があるよりもはるかに簡単です。

まず、これが発生する理由を理解しましょう。IEは空のdivをクリック可能にせず、そのdiv / aタグ内のテキスト/画像をクリック可能にするだけです。

解決策:divを背景画像で埋め、ビューアから非表示にします。

どうやって?良い質問をして、今聞いてください。この背景スタイルをタグに追加します

> "background:url('some_small_image_path')
> -2000px -2000px no-repeat;"

これで、div全体がクリック可能になりました。これは私がフォトギャラリーに使用して、ユーザーが画像の半分をクリックして左/右に移動し、視覚効果のためだけに小さな画像を配置できるようにするための最良の方法でした。とにかく私は左と右の画像を背景画像として使用しました!


ありがとう!画像の上に空のアンカーがあるイメージマップをシミュレートする必要があり、IEではコンテンツがある場合にのみクリックできました。これはそれを修正しました。
MDCore

2

ブロックにリンクを挿入し、jqueryで拡張します。それは、JavaScriptを持たない人にとっては100%優雅に低下します。これをhtmlで行うことは、実際には最善の解決策ではありません。例えば:

<div id="div_link">
<h2><a href="mylink.htm">The Link and Headline</a></h2>
<p>Some more stuff and maybe another <a href="mylink.htm">link</a>.</p>
</div>

次に、jqueryを使用して(Webデザイナーの壁を介して)ブロックをクリック可能にします

$(document).ready(function(){

    $("#div_link").click(function(){
      window.location=$(this).find("a").attr("href"); return false;
    });

});

次に、カーソルスタイルをdivに追加するだけです。

    #div_link:hover {cursor: pointer;}

おまけポイントとして、「js_enabled」クラスをdivや本文などに追加してJavaScriptが有効になっている場合にのみ、これらのスタイルを適用します。


これを使用したいのですが、divに2つのリンクがあります...両方のリンクをクリックできるように変更するにはどうすればよいですか?(現在、2番目のリンクもクリックすると、「mylink.html」に移動します。)
m3tsys

2

この例は私にとってうまくいきました:

<div style="position: relative; width:191px; height:83px;">
    <a href="link.php" style="display:block; width:100%; height:100%;"></a>
</div>

2

これは私のために働きました:

HTML:

<div>

  WHATEVER YOU WANT

  <a href="YOUR LINK HERE">
    <span class="span-link"></span>
  </a>

</div>

CSS:

.span-link {
  position:absolute;
  width:100%;
  height:100%;
  top:0;
  left: 0;
  z-index: 9999;
}

これはあなたの全体のdivをカバーして目に見えない要素(スパン)を、追加して、あるの上のzインデックスにあなたの全体のdiv、そのためのdivの誰かがクリックすると、クリックは、基本的に、あなたの目に見えない「スパン」層によって遮られたときに、どのリンクされています。

注:他の要素にすでにz-indexを使用している場合は、このz-indexの値が、それを「上に」置きたいものよりも高いことを確認してください。


私のために働いた。親要素を相対的に配置することを忘れないでください。
Saif Al Falah、

1

実際には現時点でJavaScriptコードを含める必要があります。このチュートリアルを確認してください

ただし、CSSコードを使用してこれを実現するには、巧妙な方法があります。divタグ内にアンカータグをネストし、このプロパティをそれに適用する必要があります。

display:block;

これを実行すると、幅領域全体がクリック可能になります(ただし、アンカータグの高さの範囲内)。div領域全体をカバーする場合は、アンカータグの高さをdivタグ、例:

height:60px;

これで領域全体がクリック可能になり、text-indent:-9999pxアンカータグに適用して目標を達成できます。

これは本当にトリッキーでシンプルで、CSSコードを使用して作成されています。

ここにがありますhttp : //jsfiddle.net/hbirjand/RG8wW/


1

これは、BBC WebサイトおよびGuardianで使用されているように、これを行うための最良の方法です。

私はここでテクニックを見つけました:http : //codepen.io/IschaGast/pen/Qjxpxo

HTMLをここに

<div class="highlight block-link">
      <h2>I am an example header</h2>
      <p><a href="pageone" class="block-link__overlay-link">This entire box</a> links somewhere, thanks to faux block links. I am some example text with a <a href="pagetwo">custom link</a> that sits within the block</p>

</div>

CSSはこちら

/**
 * Block Link
 *
 * A Faux block-level link. Used for when you need a block-level link with
 * clickable areas within it as directly nesting a tags breaks things.
 */


.block-link {
    position: relative;
}

.block-link a {
  position: relative;
  z-index: 1;
}

.block-link .block-link__overlay-link {
    position: static;
    &:before {
      bottom: 0;
      content: "";
      left: 0;
      overflow: hidden;
      position: absolute;
      right: 0;
      top: 0;
      white-space: nowrap;
      z-index: 0;
    }
    &:hover,
    &:focus {
      &:before {
        background: rgba(255,255,0, .2);
      }
    }
}


0

私にとってこの作品:

<div onclick="location.href='page.html';"  style="cursor:pointer;">...</div>

0

次の方法であなたのdivへのリンクを与えることができます:

<div class="boxdiv" onClick="window.location.href='https://www.google.co.in/'">google</div>
<style type="text/css">
.boxdiv {
    cursor:pointer;
    width:200px;
    height:200px;
    background-color:#FF0000;
    color:#fff;
    text-align:center;
    font:13px/17px Arial, Helvetica, sans-serif;
    }
</style>

0

要素をhrefタグで囲むか、jqueryを使用して

$('').click(function(e){
e.preventDefault();
//DO SOMETHING
});

0

これが最も簡単な方法です。

これは、div私がクリック可能にしたいブロックです。

<div class="inner_headL"></div>

したがって、href次のようにを入れます。

<a href="#">
 <div class="inner_headL"></div>
</a>

divブロックを通常のHTML要素と見なして、通常のhrefタグを有効にします。
少なくともFFで動作します。


0

どんな状況でもこれを行うことはお勧めしませんが、DIVをリンクにするコードをいくつか示します(注:この例ではjQueryを使用し、特定のマークアップは簡単にするために削除されています)。

<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">

$(document).ready(function() {
    $("div[href]").click(function () {
        window.location = $(this).attr("href");
    });
});

</script>
<div href="http://www.google.com">
     My Div Link
</div>

3
繰り返しますが、これは機能的なソリューションですが、XHTMLソリューションに関する元の質問の趣旨ではありません。大したことではありませんが、あなたの答え質問にノイズを追加始めます。
ソビエト連邦共和国2009年

0

言及されていないオプションは、フレックスの使用です。タグに適用flex: 1することによりa、コンテナに合わせて拡張されます。

div {
  height: 100px;
  width: 100px;
  display: flex;
  border: 1px solid;
}

a {
  flex: 1;
}
<div>
  <a href="http://google.co.uk">Link</a>
</div>


-1

リンクの一部の値は、ユーザーがどのレコードから来ているかによって変化するため、変数を取得しました。これはテストに役立ちました:

   <div onclick="location.href='page.html';"  style="cursor:pointer;">...</div> 

これも機能します:

   <div onclick="location.href='<%=Webpage%>';"  style="cursor:pointer;">...</div> 

1
何らかの理由でコードが表示されません。内部リンクにjsp変数を指定してonclickを使用し、ダイナミックリンクを作成しました
ベッキー

-3

私のスマーティーパンツの答え:

「回避的な回答:「ブロックレベル要素をハイパーリンクにしてXHTML 1.1で検証する方法」

HTML5 DOCTYPE DTDを使用してください。」

ie7には実際には当てはまりませんでした

onclick="location.href='page.html';"

IE7-9、Chrome、Safari、Firefox、


彼は「XHTML 1.1の有効な方法を探しています」を探していました
Mark

-4

もしすべてがこのように単純であるなら...

#logo {background:url(../global_images/csg-4b15a4b83d966.png) no-repeat top left;background-position:0 -825px;float:left;height:48px;position:relative;width:112px}

#logo a {padding-top:48px; display:block;}



<div id="logo"><a href="../../index.html"></a></div>

ボックスの外側を少し考えてください;-)

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