CSSだけでドットフィルターをかける

動画の長さは短くしたくない!でも粗い画像は見栄えが悪いからやだ!というご要望。
ドットフィルターをかけて視覚的に粗さを隠すことで無事に納品できたので備忘。

目次

DEMO

ドットフィルターなしのDEMO画像
ドットフィルターなし
ドットフィルターありのDEMO画像
ドットフィルターあり

擬似要素::afterでドットフィルターをかける

html

画像の場合

<div class="dot_wrap">
  <img src="image.jpg" alt="画像">
</div>

動画の場合

<div class="dot_wrap">
  <video autoplay muted loop>
    <source src="video.mp4" type="video/mp4">
      お使いのブラウザは動画再生に対応していません。
  </video>
</div>

CSS

.dot_wrap {
  position: relative;
  display: inline-block;
}
.dot_wrap::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(255, 255, 255, 0.4); //ドットの背景色を半透明の白色に
  background-image: radial-gradient(circle, rgba(255, 255, 255, 0.5) 20%, transparent 21%);
  background-size: 3px 3px; //ドットの繰り返しサイズを3px x 3pxに
  opacity: 0.7;
  pointer-events: none;
  z-index: 1;
}
.dot_wrap img {
  display: block;
  position: relative;
  z-index: 0;
}

⚠️【WordPress】.wp-block-image:after の影響で擬似要素が効かないときの対処法

WordPressのテーマによっては、以下のようなCSSが最初から定義されていることがある。

.wp-block-image:after {
    clear: both;
    content: "";
    display: block;
    height: 0;
    visibility: hidden;
}

これは、<figure class="wp-block-image"> などの画像ブロックに対して clearfix を実現するための記述。
しかし、この :after が定義されているのが原因で、前述の方法ではドットフィルターが表示されない

対処法 1 : テーマの影響を打ち消す

heightvisibility明示的に指定することで、テーマの影響を打ち消して ::after が表示されるようにする。

.wp-block-image.dot_wrap::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  width: 100%;
  height: 100%;
  background-color: rgba(255, 255, 255, 0.4); //ドットの背景色を半透明の白色に
  background-image: radial-gradient(circle, rgba(255, 255, 255, 0.5) 20%, transparent 21%);
  background-size: 3px 3px; //ドットの繰り返しサイズを3px x 3pxに
  opacity: 0.7;
  pointer-events: none;
  z-index: 1;
  height: 100%;           /* ← ここで上書き */
  visibility: visible;    /* ← ここで上書き */
}
.dot_wrap img {
  display: block;
  position: relative;
  z-index: 0;
}

対処法 2 : カスタムHTMLで明示的なフィルター用要素を入れる

もし擬似要素がどうしても競合してしまう場合、HTMLに明示的に要素を追加するのが手っ取り早いかも。

HTML

カスタムHTMLで下記の構成を記載する。

<div class="wp-block-image dot_wrap"> <!-- ← dot_wrapクラスを追加 -->
  <figure class="alignleft size-full">
    <img src="画像URL" alt="">
    <div class="dot_overlay"></div> <!-- ← 追加 -->
  </figure>
</div>

CSS

.dot_wrap {
  position: relative;
  display: inline-block;
}
.dot_overlay {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(255, 255, 255, 0.4);
  background-image: radial-gradient(circle, rgba(255, 255, 255, 0.5) 20%, transparent 21%);
  background-size: 3px 3px;
  opacity: 0.7;
  pointer-events: none;
  z-index: 1;
}
.dot_wrap img {
  display: block;
  position: relative;
  z-index: 0;
}
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

目次