opacity で困った!
- Vue.js + tailwind 環境
- ローディングのオーバーレイを CSS のプロパティ
opacityで実装した。 - Firefox ではうまくレンダリングされたが、chrome で表示が崩れた。
- しかも2回目以降のローディング表示は正しく表示された。
1 回目 → 崩れる
2 回目 → 正しく表示される
opacity vs rgba
opacity の挙動が怪しいと思ったので調べました。
opacity
子要素の text や background の不透明度をすべて変更する
rgba
スタイルを指定した要素のみに不透明度を設定する
デモ
rgba を使用した container では、子要素に影響を与えないが、opacity を使用した container-opacity は子要素の background と text に不透明度が設定されている。
See the Pen Untitled by shiraishi yuma (@punkshiraishi) on CodePen.
rgba に変更した結果
仮説
opacity 属性による指定では、より多くの要素をレンダリングすることになる。Vue による DOM の生成のタイミングなどの条件と重なり、表示崩れを起こしてしまった。
一方 rgba では単一の要素にしか影響を与えないので、レンダリング処理がシンプルになり、問題が解消したのではないか。
tailwind を使う場合
opacity-xx
opacity: xx; を付与します。
bg-opacity / text-opacity / border-opacity
rgba で不透明度を指定します。
bg-red-500 は下記のようなスタイルが付与されます。
.bg-red-500 {
--tw-bg-opacity: 1;
background-color: rgba(185,28,28,var(--tw-bg-opacity));
}
--tw-bg-opacity は変数で、bg-opacity によって指定できます。
.bg-opacity-50 {
--tw-bg-opacity: 0.5;
}
結論
opacity は影響範囲を理解して使いましょう。
特定の要素の不透明度を変えたいときはなるべく rgba を使った方が良さそうです。
参考


