Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
24
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

aタグの中にaタグをJSを使わずに配置したい

Last updated at Posted at 2019-12-25

Qiita記事を見ていると「なんとなくで書かないで!HTML5を書く時に気にしてみたいタグごとのお約束 - Qiita」で、HTMLを書くときの注意点などが紹介されていました。

ただ「aタグの中にaタグ」の箇所で、JSを使う方法が紹介されていました。
これはJSは使わなくてもできます。
気になったので書いてみました。

まず、aタグの中にaタグはどういう状況か?

例えば、カード全体がクリッカブルエリアになっており、子の要素にもリンクが必要な時です。
HTMLで表現するなら、下記の状態。

しかしHTMLの仕様上、aタグの中にaタグは含められません。
仕様を無視していれても、動作しません。

<a href="" class="card">
  <div class="card-inner">
    <h1 class="card-title">Title Text</h1>
    <ul class="card-tags">
      <li>
        <a href="">tag name</a>
      </li>
      <li>
        <a href="">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>

画像でみてみましょう。

custom – 1@2x.png

右の赤いエリアの中に、緑のエリアを配置したいのです。
そう、やりたいことの本質は「aタグの中にaタグを配置する」ことではなく、
「クリッカブルエリアの中にクリッカブルエリアを配置したい」です。

対応方法

クリッカブルエリアの中にクリッカブルエリア配置したいのであれば、HTMLをaタグでカードを全体を囲むのをやめます。
見出しなどを囲むのがいいでしょう。

<div class="card">
  <div class="card-inner">
    <!-- aタグをここに移動 -->
    <h1 class="card-title"><a href="">Title Text</a></h1>
    <ul class="card-tags">
      <li>
        <a href="">tag name</a>
      </li>
      <li>
        <a href="">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 aposition: relative; 宣言を指定します。

.card,
.card-tags a {
  position: relative;
}

今度は .card-title a を親のクリッカブルエリアまで広げてみましょう。
これは擬似要素を使用します。

.card-title a:before {
  content: '';
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}

これで完成です。
完成したコード - CodePen

このやり方を魔法のように感じる方もいらっしゃると思いますが、CSSの位置決めスキームを利用した方法です。
positionプロパティがわかれば、理解しやすくなるでしょう。

追記: 2022/12/06

今なら、これでいけます。

.card-title a:before {
  content: '';
  position: absolute;
  inset: 0;
}
24
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?