🌵

box-shadowのtransitionが効かないとき

2020/10/19に公開5

こういうの作ったんですけどね

hoverした時にふわっとアニメーションさせたくて、transitionを設定してたんですけどね。
↓こういう感じで

.c-grid-item {
  box-shadow:
    -3px -3px 12px rgba(255, 255, 255, 0.7),
    3px 3px 12px rgba(17, 17, 17, 0.3)
  ;
  transition: box-shadow ease-in-out 0.5s;
  &:hover {
    box-shadow:
      inset 3px 3px 12px rgba(17, 17, 17, 0.3),
      inset -3px -3px 12px rgba(255, 255, 255, 0.7)
    ;
  }
}

効かないんですね。この書き方。
はじめて知りました。

効く書き方

.c-grid-item {
  box-shadow:
    -3px -3px 12px rgba(255, 255, 255, 0.7),
    3px 3px 12px rgba(17, 17, 17, 0.3),
    inset 3px 3px 12px transparent,
    inset -3px -3px 12px transparent
  ;
  transition: box-shadow ease-in-out 0.5s;
  &:hover {
    box-shadow:
      -3px -3px 12px transparent,
      3px 3px 12px transparent,
      inset 3px 3px 12px rgba(17, 17, 17, 0.3),
      inset -3px -3px 12px rgba(255, 255, 255, 0.7)
    ;
  }
}

アニメーション後の動きの部分を、一括で指定しておいてtransparentで透明化しておくんですね。

おお、ふわってなってくれた😚

効かない理由?

調べてもあんまり出てこなくて、これといった理由はわからないんですが・・・

もしかしたら、hover前のbox-shadowを上書きしてしまって、元の指定がなかったことになるからかなあとも思ったんですけど、他の要素だとそんなことないので。
やっぱり違うのかも。

正しい情報教えてください😂

Discussion

catnosecatnose

理由はよく分からないですがCSSでは「もともと無いものはtransitionできない」というパターンはありますよね。display: nonedisplay: blockへの変更時にアニメーションできないとか。

虎野とも虎野とも

確かに!
display: nonedisplay: block と同じような感じと捉えたら、今回の box-shadow も理解できそうです😆
catnoseさん、ありがとうございますー!

KiteKite

それは、CSS はプロパティ一部のみの追加・上書きはできず、プロパティごとの追加・上書きしかできないからです。box-shadow に限らず、backgroundfonttransform…すべてがそうです。また、transitionanimation も関係ございません。

例えば、

background: url(https://via.placeholder.com/300x200) no-repeat center;

という設定があるとしましょう。これに、画像以外の部分の背景色を #000 にしたいとしましょう。background-color: #000; とすれば問題はありません。background-color というプロパティごとの追加・上書きだからです。

しかし background: #000; とすると、上記の背景画像、リピート、背景位置がすべてデフォルト値に上書きされます。background: #000;background: url(https://via.placeholder.com/300x200) no-repeat center; に対して背景色部分のみを追加・上書きするのではなく、 background ごと上書きすることになります。もし background でやる場合は、background: #000 url(https://via.placeholder.com/300x200) no-repeat center; としなければなりません。

虎野とも虎野とも

ああ、backgroundの説明がわかりやすいです!
transitionanimationも関係なかった!😂

でも、私が最初に出した例で書いても動きそうと思う人は一定数いそうな気がしますね・・・
正しい情報を伝えていかなくては。

Kiteさん、ありがとうございます!😊

catnosecatnose

なるほど!すごく分かりやすくありがとうございます。