cssスプライト作成しました。

CSSスプライトという機能を初めて知りました。UX/UIが綺麗になるのと、画像読み込み時の速度が早くなるとのことで最近では結構使われている機能らしいです。

今回は機能実装と簡単にまとめてみました。

```html:html
<div class="splite"></div>
<ul>
  <li><a href="#" class="menu1">メニュー１</a></li>
  <li><a href="#" class="menu2">メニュー２</a></li>
</ul>
```

htmlはこれだけです。今回は画像だけのスプライトと、リストに組み込む場合のスプライトの２種類を作成します。

![image1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/91a11545-e502-43dc-0121-69552506afeb.jpeg)
![image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/255bde42-4948-d963-b691-f45b84a162a1.jpeg)

画像はこの2つを使います。（２枚目は失敗して辺な余白があります。実装には害はないのでこのまま使用します。）

## 画像のみのスプライト
まずは簡単な画像のみのスプライトです。

```css:css
/* splite */
.splite{
  width: 300px;
  height: 300px;
  background: url(../img/image1.jpeg);
  transition: .3s;
}
.splite:hover{
  background-position: 0 -300px;
}
```

こんな感じに動くかと思います。

![画像のみのスプライト.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/cef8b1db-a624-0194-5739-a3608db5801f.gif)

なんかスワイプしてるみたいでかっこいいですね。

ポイントとしては`background-position`のみで`0 -300px`とすることで、ホバー時にY軸方向に背景画像が移動するようにしてます。また`transition`はアニメーション機能でよく使われるCSSで、ヌルッと動くようになります。

## リストに組み込む場合のスプライト
ここは工程が多いので少しずつ構築していきます。

```css:css
ul{
  margin-top: 20px;
  margin-left: 20px;
}
ul a{
  display: block;
  width: 100px;
  height: 50px;
  background: url(../img/image2.jpg);
  margin-bottom: 20px;
}
```

ここまでは画像のみの時とほとんど一緒です。表示は以下です。

![スクリーンショット 2020-12-03 0.51.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/d372d6b0-ebed-4ff4-f155-3081feb81d5b.png)

まず背景画像のポジションを指定してないので同じ物が表示されています。
そして気になるのが文字です。これを<font color="red">**非表示ししていきます。**</font>

```css:css
ul a{
  display: block;
  width: 100px;
  height: 50px;
  background: url(../img/image2.jpg);
  margin-bottom: 20px;

  /* 文字を非表示に */
  white-space: nowrap; /* 改行しない設定。改行に使うコードを「半角スペース」に変換してるらしい。 */
  text-indent: 100%; /* インデント、つまり文頭に空白を作る。今回は100%なのでテキストの最大幅分インデントが下げられる。*/
  overflow: hidden; /* 要素からはみ出多分を非表示に。*/

}
```

下3行が追加分です。CSSの説明をコメントしてるのでみといて下さい。また図も作成したので合わせて確認すると分かりやすいかもです。

![文字非表示の解説図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/2f7b39bb-f191-71dd-1b51-4c4a58d0c6f5.png)

これで文字が消えました。
![スクリーンショット 2020-12-03 1.01.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/4b278ca4-c34e-4b6a-43fc-7287ae01d9ab.png)

あとは背景画像の位置調整です。menu2の背景画像のポジションを指定します。

```css:css
/* menu2は背景画像を100px下げる。 */
.menu2{
  background-position: -100px 0;
}
```

これでmenu2の表示が変わりました。次にそれぞれのホバーアクションを指定します。それぞれY軸方向に50px動くばOKです。ついでにヌルッと動くよう`transition`を`ul a`に追加します。

```css:css
ul a{
  transition: .3s;
}
/* menu1のホバーアクション。 */
.menu1:hover{
  background-position: 0 -50px;
}
/* menu2のホバーアクション。 */
.menu2:hover{
  background-position: -100px -50px;
}
```

これで完成しました。最後に完成形コードを置いときますので是非参考にして下さい。お疲れ様でした。

![完成形.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/b9dda110-59e4-d1f5-76e3-cd0aea2d23c6.gif)

## 完成形CSS

```css:css
/* splite */
.splite{
  width: 300px;
  height: 300px;
  background: url(../img/image1.jpeg);
  transition: .3s;
}
.splite:hover{
  background-position: 0 -300px;
}
/* リストに組み込む場合のスプライト */
ul{
  margin-top: 20px;
  margin-left: 20px;
}
ul a{
  display: block;
  width: 100px;
  height: 50px;
  background: url(../img/image2.jpg);
  margin-bottom: 20px;

  /* 文字を非表示に */
  white-space: nowrap; /* 改行しない設定。改行に使うコードを「半角スペース」に変換してるらしい。 */
  text-indent: 100%; /* インデント、つまり文頭に空白を作る。今回は100%なのでテキストの最大幅分インデントが下げられる。*/
  overflow: hidden; /* 要素からはみ出多分を非表示に。*/

  transition: .3s;
}
/* menu2は背景画像を100px下げる。 */
.menu2{
  background-position: -100px 0;
}
/* menu1のホバーアクション。 */
.menu1:hover{
  background-position: 0 -50px;
}
/* menu2のホバーアクション。 */
.menu2:hover{
  background-position: -100px -50px;
}
```