HTMLとCSSのみでテキストホバー時に画像を文字背景に表示させる(備忘録)

今回は、HTMLとCSSのみでテキストホバー時に画像を文字背景に表示させてみます。

Webデザインギャラリーを眺めていると、リンクをホバーしたときに、画像が表示される演出が多いと思ったので、一旦CSSだけでテキストホバー時に画像を文字背景に表示させてみることにしました。JavaScriptを使った実装は後日やっていきたいと思います。

それではやっていきましょう。

HTMLの記述について

<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>HTMLとCSSのみでテキストホバー時に画像を文字背景に表示させる(備忘録)</title>
  <link rel="stylesheet" href="../reset.css">
  <link rel="stylesheet" href="./style.css">
</head>

<body>
  <main>
    <ul>
      <li class="menuItem">
        <a class="menuItem-link">止まっているシマエナガ
          <img class="menuItem-img" src="images/img_01.webp" alt="" />
        </a>
      </li>
      <li class="menuItem">
        <a class="menuItem-link">飛んでいるシマエナガ
          <img class="menuItem-img" src="images/img_02.webp" alt="" />
        </a>
      </li>
    </ul>
  </main>
</body>

</html>

aタグの中にimgタグを入れているだけです。特に難しいことはしていません。

CSSの記述について

@charset "utf-8";

/* ==========================
  初期設定
========================== */
*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

body {
  position: relative;
  word-wrap: break-word;
}

img {
  width: 100%;
  height: auto;
  vertical-align: bottom;
}

/* レイアウト設定 */
body {
  font-family: sans-serif;
}
main {
  margin: 80px 0;
  padding: 0 24px;
}

ul {
  list-style: none;
}

.menuItem-link {
  font-size: 80px;
  cursor: pointer;
  position: relative;
  color: transparent;
  -webkit-text-stroke: 1px #000;
  text-stroke: 1px #000;
  transition: 0.3s;
  font-weight: bold;
  display: block;
  width: fit-content;
}

.menuItem-link:hover {
  color: #c3512f;
  -webkit-text-stroke: 1px #c3512f;
  text-stroke: 1px #c3512f;
}

.menuItem-img {
  width: 320px;
  z-index: -1;
  position: absolute;
  max-height: 240px;
  opacity: 0;
  left: 100%;
  top: 50%;
  transform: translate3d(-120%, -40%, 0) translate3d(0, 24px, 0);
  transition: opacity 0.3s, transform 0.6s;
}

.menuItem-link:hover .menuItem-img {
  opacity: 1;
  transform: translate3d(-120%, -40%, 0) rotate3d(0, 0, 1, 8deg);
}

menuItem-imgに対して、ホバーする前はopacityを0に、ホバー時はopacityを1にして、transformで位置を移動しているだけです。

これだけで対応が完了です。

次回はJavaScriptを使って、応用編の動きを作っていきたいと思います。