アンカー内にdivを置くことは正しいですか?


530

インライン要素内にブロック要素を配置することはHTMLの罪だと聞いたことがあります。

<a href="http://www.mydomain.com"><div>
What we have here is a problem. 
You see, an anchor element is an inline element,
and the div element is a block level element.
</div></a>

しかしdisplay:block、スタイルシートのように外側のアンカーにスタイルを設定した場合はどうでしょうか?それはまだ間違っていますか?ブロックレベルおよびインライン要素に関するHTML 4.01仕様は、そう考えるようです:

スタイルシートは、要素をブロックとしてレンダリングするかインラインとしてレンダリングするかなど、任意の要素のレンダリングを指定する手段を提供します。リスト要素のインラインスタイルなど、場合によってはこれが適切なこともありますが、一般的に、作成者はこの方法でHTML要素の従来の解釈を上書きすることはお勧めしません。

誰かがこの問題についてさらにヒントを持っていますか?



@DisgruntledGoat-リンクをありがとう-私はそれがもっと早く見られたらいいのに:-)
トム

アンカー要素またはリンク要素は、ブラウザの自動化コントロールです。したがって、ブラウザには事前定義されたレンダリングと動作があります。本物のプレーンHTML要素をラップするには、スパン内のdivは罪です。タグがレベルの動作を追加しないという事実の背後にある理由は、インラインエレメントであることを意図しているのではなく、ドキュメントフローを妨げることなくテキストの一部をマークアップするための要件です。そのハメ撮りから、Aは何もしないタグです。その存在は問題を超えたものであり、罪ではありませんが、コードの醜さとあいまいさの原因となる可能性があります。
Bekim Bacaj 2016

将来ここでチェックする人は誰でも、アンカータグにはブロックレベルの要素を含めることができますが、HTML5ではそれらを非表示にできますが、他のアンカータグを含むブロックレベルの要素を含めることはできません。なぜなら、基本的に、アンカータグは他のアンカータグを内部に持つことができないからです。:あなたはここでその上で続きを読むことができますstackoverflow.com/questions/13052598/...
aderchox

回答:


748

提供するHTMLのバージョンに応じて、次のようにします。

  • HTML 5では<a>要素が「ボタンやその他のリンクなど)内にインタラクティブなコンテンツがない限り、「段落全体、リスト、テーブルなど、セクション全体でもラップできる」と述べています。

  • HTML 4.01では、<a>要素にはインライン要素のみを含めることができると規定されています。A<div>ブロック要素であるため、内に表示されない場合があります<a>

    もちろん、ブロックのように見えるようにインライン要素をスタイルすることも、インラインでレンダリングされるようにブロックをスタイルすることも自由です。用語の使用inline及びblockCSSで同じ用語が複数の要素の視覚スタイルに関連しているのに対し、HTMLでは、文書の意味構造への要素の関係を指します。インライン要素をブロック状に表示する場合は問題ありません。

    ただし、CSSが存在しない場合、たとえばスクリーンリーダーなどの支援技術を介してアクセスする場合や、確かに強力なGooglebotによって調べられる場合でも、ドキュメントの構造が意味をなすことを確認する必要があります。


4
w3.org/TR/REC-html40/sgml/dtd.htmlに4.01のDTDがあります。Aには%inline%を含めることができます。%inline%はさまざまなもの(リンクをたどることができます)の集まりですが、DIVはそれらに含まれていません。したがって、内部にDIVを持つAはXML検証可能ではありません。DTDは委員会の意図をかなりよく表していると思うので、次のようにします。いいえ
カール・スモトリクス2009

2
@Ewan:私の回答の最初のリンクは、HTML 4.01の関連セクションへのリンクです。
NickFitz 2009

62
HTML5に関する最後の行を読むまで、プロジェクトでこれを実行する可能性を捨てようとしていました。
エレインマーリー

16
Mozilla Developer Network(developer.mozilla.org/en-US/docs/Web/HTML/Element/a)は、HTML5の<a>要素が<div>、<ul>、<table>などのフローコンテンツ要素をサポートするという事実を反映しています。
AxeEffect 2013

12
HTML5では、a要素はtransparentとして分類されます。つまり、a要素の親にフロー要素を含めることができる場合にのみ、フロー要素を含めることができます(default = blockを読み取る)。それ以外の場合は、フレージングエレメント(default = inlineを読み取る)のみが許可されます。したがって、aフォームまたはdiv内にある場合、それはdivを含むことができますが、p内には含めることができません。w3.org/TR/html-markup/terminology.htmlを参照してください
Patanjali

81

いいえ、検証しませんが、はい、一般的に最新のブラウザで動作します。そうは言っても、アンカー内でスパンを使用し、それに設定display: blockすると、間違いなくどこでも機能し、検証されます!


7
を設定するdisplay: blockと、技術的にはブロック要素になりませんか?
WhyNotHugo 2012

20
@hugo技術的に重要ですか?
アンディチェイス

5
まあ、HTML 4.01は a要素にはインライン要素のみを含めることができるとます。あなたが作る場合はspan要素のブロック要素を、それは、技術的には、アンカーの内側にあってはなりません。
WhyNotHugo 2012

22
@Hugo:HTML4での制限は意味的なものであり、説明的なものではないようです。意味的には、a <div>はブロックレベルであり、a <span>はインラインです。これは、ドキュメントに付随するCSSが他のことを指示している場合でも同じです。
ロイ・ティンカー

追加されたstyle = "display:block;" スパンタグでそれは魅力のように働きました。希望する結果を得るためにパディングで遊んだだけ
Harif87

31

W3Cドキュメントでは、次のような概念を使用していません 、間違ったの罪を、それはのようなものをを使用しない手段を提供し適切かもしれない落胆します

実際、セクション4の 2番目の段落で、4.01仕様は次のようにその単語を項目化しています

このドキュメントのキーワード「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「MAY」、および「OPTIONAL」は、 [RFC2119]で説明されているように解釈されます。ただし、読みやすくするために、これらの単語はこの仕様ではすべて大文字で表示されるわけではありません。

それを念頭に置いて、私は決定的な声明が7.5.3ブロックレベルとインライン要素にあると信じています

通常、インライン要素には、データと他のインライン要素のみを含めることができます。

「一般的に」という条件は、HTML 4.01ではインライン要素にブロック要素を含めることができると言うほどのあいまいさを導入しているようです。

確かに、CSS2には表示プロパティ値inline-blockがあります。があります。これは、説明した目的に適しているようです。それが広くサポートされていたかどうかはわかりませんが、誰かがそのような振る舞いの必要性を予想していたようです。

DTDはここでは許容度が低いようですが、 ではDTDの許容度ますが、DTDテキストは仕様に従っています。

HTML 4.01仕様には、DTD内で表現できない追加の構文制約が含まれています。

別のコメントで、あなたはそれをアンカーで包むことによってブロックをアクティブにしたいことを提案します。HTMLがそれを禁止しているとは思わない。CSSは明らかにそれを許可している。それが正しいかどうかについてのタイトルの質問に答えるために、私はイエスと言います。基準により、時々正しいです。


2
あなたはdoctypeについて言及するまで私を迎えました。
Robert Harvey、

doctypeではありません、doctype.com
Ewan Todd

あなたはおそらく正しいです-私はdoctype.comを使用するべきでした。Opps-次回は覚えておきましょう。PHP-> SO、HTML-> doctype.com
Tom

2
私の見解は、「doctype.comに属しているため終了する投票」オプションがない(あるべきではない)ことです。
Robert Harvey、

7
私はロブに同意します-スタックオーバーフローはプログラミング用です。HTML / CSSは確かに私のプログラミングです。
DisgruntledGoat

13

HTML5仕様では...ブロックレベルの要素をインライン要素内に配置できるようになりました。したがって、「a」要素の内部に「div」または「h1」を配置することが完全に適切です。


1
唯一の内部流れ(デフォルト= ブロック)の要素、または透明(のような要素を許す両親と)フロー要素を。例えば、pが許可されない流れ(のような要素DIV)だけフレージング要素(デフォルト= インラインので、)A内部pは含めることはできないDIVを。しかし、A内部DIVは含めることができ、P、S、DIV Sまたは任意の他のフロー要素。
パタンジャリ

4

<div>内部に置くことはできません<a>-それは有効な(X)HTMLではありません。

display:blockでスパンのスタイルを設定しても、ブロックレベルの要素をその内部に配置することはできません。CSSの方法に関係なく、(X)HTMLは(X)HTML DTD(どちらを使用しても)に従う必要があります。物事を変えます。

ブラウザはおそらくあなたが望むようにそれを表示するでしょう、しかしそれはそれを正しくしません。


4

HTML 4のDTDはhttp://www.w3.org/TR/REC-html40/sgml/dtd.htmlにあります。このDTDは、機械で処理可能な形式の仕様です。DTDがXMLおよびHTML 4を管理するという制限があり、特に「一時的な」フレーバーは、「正当な」XMLではない多くのことを許可します。それでも、指定子の意図を体系化することに近いと思います。

<!ELEMENT A - - (%inline;)* -(A)       -- anchor -->

<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">

<!ENTITY % phrase "EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >

<!ENTITY % special "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">

<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">

この階層にリストされているタグは、許可されたタグの合計であると解釈します。

仕様には「インライン要素」と記載されている場合がありますが、ブロック要素の表示タイプをインラインとして宣言することでインテントを回避できることを意図していません。インラインタグは、どのように悪用しても、セマンティクスが異なります。

一方で、を含めることで要素をspecial入れ子にできるように思えることは興味深いですA。仕様には、XMLが構文的に正しいとしてもこれを許可しない強い表現が含まれている可能性がありますが、質問のトピックではないため、これ以上は追求しません。


どういう- - 意味か知っていますか。説明を探しましたが、見つかりませんでした。
ユアン・トッド

4

のようなブロックレベルの要素は、HTML5のタグで<div>ラップでき<a>ます。<div>あると考えられているフローコンテンツのコンテナ/ラッパー<a>のが考慮されるフローコンテンツに応じMDN。意味的には、ブロックレベルの要素として機能するインライン要素を作成する方がよい場合があります。


1
要素は、透明の親要素場合にのみ、aが可能流量(としてデフォルトブロック)要素。
Patanjali 2016年

2

アンカータグ内にdivを配置するという意味上の問題を回避する場合は、アンカータグをdivと同じレベルに配置し、position:relativeのコンテナーですべてをラップし、アンカータグの位置をabsoluteにして、それを展開します。コンテナを満たします。また、コンテンツフローの最後にない場合は、そこにZ-indexをスローして、コンテンツの上に配置してください。

提案されているように、マークアップコードを追加しました。

<div class="div__container>
  <div class="div__one>
  </div>
  <div class="div__two">
  </div>
  <a href="#"></a>
</div>

そしてCSS:

.div__container {
  position: relative; 
}
.div__container a {
  position: absolute;
  top: 0;
  bottom: 0;      
  left: 0;
  right: 0;
  z-index: 999;
}

1
あなたの答えは正しいかもしれませんが、マークアップでそれを説明する場合に役立ちます。
datashaman 2018年

1

あなたが<a>ブロックを作る努力に行くつもりなら、なぜ<a>divの中に入れないでください、それはあなたに同じ効果を与えるブロック要素です。


36
アンカーに複数のdivを含めたい場合があるためです。
トム

1

それをブロックスタイルの要素に変更すると、いいえ、それはもはや「間違った」ものではありませんが、おそらく検証されません。しかし、あなたがしていることをすることはあまり意味がありません。アンカータグを内部divのないブロックレベル要素として保持するか、divを外部に配置する必要があります。


1

それは間違っています。スパンを使用します


4
roflは、divを使用するのと同じことです。私はこれをbdiv.tvで(divを使用して)見たと思いますが、他の人がdivまたはspanの場合、spec block = blockまたはそれと同じである場合は間違っていると述べています!
James Mitch

0

ほとんどの人がこの質問をするとき、彼らはdivだけのサイトを構築していて、divの1つがリンクである必要があると思います。

誰かがアンカータグ内で透明な空の画像PNGを使用してdiv内にリンクを作成するのを見ました。画像はdivと同じサイズでした。

実はかなり悲しい...でもうまくいく...


0

これを実現するには、「:: before」疑似要素を追加します。

純粋なCSSトリック;)

a:before{
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 1;
  pointer-events: auto;
  content: "";
  background-color: rgba(0,0,0,0);
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet"/>
<div class="card" style="width: 18rem;">
  <img src="https://via.placeholder.com/250" class="card-img-top" alt="...">
  <div class="card-body">
    <h5 class="card-title">Card with stretched link</h5>
    <p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's content.</p>
    <a href="#" class="btn btn-primary stretched-link">Go somewhere</a>
  </div>
</div>


-9

参考までに。

divをクリック可能にすることが目的の場合は、jQuery / Java Scriptを使用できます。

次のようにdivを定義します:

<div class="clickableDiv" style="cursor:pointer">
  This is my div. Try clicking it!
</div>

jQueryは次のように実装されます。

 <script type="text/javascript">

    $(document).ready(function () {

        $("div.clickableDiv").click(function () {
            alert("Peekaboo"); 
        });
    });
</script>

これは複数のdivでも機能します-このスレッドのトムのコメントによると


17
これは恐ろしいことです。キーボードでは使用できません。リンクをホバーすると表示されません。リンクのように機能しますが、実際のリンクではありません。中ボタンでクリックすることも、リンクとして右クリックすることもできません。
WhyNotHugo 2012

1
それは確かにその用途があります。div内にアンカーを配置し、divクリックで子アンカーの場所にリダイレクトすることができます。divのカーソルをポインターに設定することで、アンカーのルックアンドフィールが得られます。さらに、JavaScriptが許可されていない場合や、アクセシビリティの理由で、div内にアンカーのみがある有効なフォールバックソリューションがあります。意味的および構文的に正しいhtmlを取得し、疑わしい表示スタイルの変更をいじる必要はありません。
ペデリー2013

リンクを含むdivがある場合、クリックハンドラーでイベントをキャッチし、アンカーを見つけ(1つだけであることを確認して)、それを使用します。通常のアンカータグを介してアクセスできます。これにより、たとえば、画像とキャプション、および「もっと読む」リンクを含む図のバケットを作成できます。考え?
Julix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.