Qiita記事を見ていると「なんとなくで書かないで!HTML5を書く時に気にしてみたいタグごとのお約束 - Qiita」で、HTMLを書くときの注意点などが紹介されていました。
ただ「aタグの中にaタグ」の箇所で、JSを使う方法が紹介されていました。
これはJSは使わなくてもできます。
気になったので書いてみました。
まず、aタグの中にaタグはどういう状況か?
例えば、カード全体がクリッカブルエリアになっており、子の要素にもリンクが必要な時です。
HTMLで表現するなら、下記の状態。
しかしHTMLの仕様上、aタグの中にaタグは含められません。
仕様を無視していれても、動作しません。
<ahref=""class="card"><divclass="card-inner"><h1class="card-title">Title Text</h1><ulclass="card-tags"><li><ahref="">tag name</a></li><li><ahref="">tag name</a></li></ul><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nam, dolorum. Facilis assumenda, itaque tempore iste minus, delectus</p></div></a>画像でみてみましょう。
右の赤いエリアの中に、緑のエリアを配置したいのです。
そう、やりたいことの本質は「aタグの中にaタグを配置する」ことではなく、
「クリッカブルエリアの中にクリッカブルエリアを配置したい」です。
対応方法
クリッカブルエリアの中にクリッカブルエリア配置したいのであれば、HTMLをaタグでカードを全体を囲むのをやめます。
見出しなどを囲むのがいいでしょう。
<divclass="card"><divclass="card-inner"><!-- aタグをここに移動 --><h1class="card-title"><ahref="">Title Text</a></h1><ulclass="card-tags"><li><ahref="">tag name</a></li><li><ahref="">tag name</a></li></ul><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nam, dolorum. Facilis assumenda, itaque tempore iste minus, delectus</p></div></div>次は、CSSです。
クリッカブルエリアを広げたい領域の .cardと子のクリッカブルエリアになる .card-tags aに position: relative;宣言を指定します。
ただ子のクリッカブルエリアになるaタグに positionプロパティを指定しても、反映されないのでボックスの整形モデルを変更しておきましょう。
.card,.card-tagsa{position:relative;}.card-tagsa{display:inline-block;}今度は .card-title aを親のクリッカブルエリアまで広げてみましょう。
これは擬似要素を使用します。
.card-titlea:before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;}これで完成です。
完成したコード - CodePen
このやり方を魔法のように感じる方もいらっしゃると思いますが、CSSの位置決めスキームを利用した方法です。
positionプロパティとスタックコンテキストがわかれば、理解しやすくなるでしょう。
