CSSフィルターを背景画像に適用する方法


467

検索ページの背景画像として使用しているJPEGファイルがあり、Backbone.jsコンテキスト内で作業しているため、CSSを使用して設定しています。

background-image: url("whatever.jpg");

CSS 3のぼかしフィルターを背景にのみ適用したいのですが、その1つの要素だけにスタイルを設定する方法がわかりません。私が試した場合:

-webkit-filter: blur(5px);
-moz-filter: blur(5px);
-o-filter: blur(5px);
-ms-filter: blur(5px);
filter: blur(5px);

background-imageCSSのすぐ下で、背景だけでなくページ全体のスタイルを設定します。画像だけを選択してそれにフィルターを適用する方法はありますか?または、ページの他のすべての要素のぼかしをオフにする方法はありますか?


2
画像の一部のみをぼかす
vsync 2018

回答:


528

このペンをチェックしてください。

背景画像用とコンテンツ用の2つの異なるコンテナーを使用する必要があります。

例では、私は2つのコンテナを作成し、している.background-image.content

どちらもposition: fixedおよびで配置されleft: 0; right: 0;ます。それらを表示する際のz-index違いは、要素に対して異なる設定がされている値に由来します。

.background-image {
  position: fixed;
  left: 0;
  right: 0;
  z-index: 1;
  display: block;
  background-image: url('https://i.imgur.com/lL6tQfy.png');
  width: 1200px;
  height: 800px;
  -webkit-filter: blur(5px);
  -moz-filter: blur(5px);
  -o-filter: blur(5px);
  -ms-filter: blur(5px);
  filter: blur(5px);
}

.content {
  position: fixed;
  left: 0;
  right: 0;
  z-index: 9999;
  margin-left: 20px;
  margin-right: 20px;
}
<div class="background-image"></div>
<div class="content">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis aliquam erat in ante malesuada, facilisis semper nulla semper. Phasellus sapien neque, faucibus in malesuada quis, lacinia et libero. Sed sed turpis tellus. Etiam ac aliquam tortor, eleifend
    rhoncus metus. Ut turpis massa, sollicitudin sit amet molestie a, posuere sit amet nisl. Mauris tincidunt cursus posuere. Nam commodo libero quis lacus sodales, nec feugiat ante posuere. Donec pulvinar auctor commodo. Donec egestas diam ut mi adipiscing,
    quis lacinia mauris condimentum. Quisque quis odio venenatis, venenatis nisi a, vehicula ipsum. Etiam at nisl eu felis vulputate porta.</p>
  <p>Fusce ut placerat eros. Aliquam consequat in augue sed convallis. Donec orci urna, tincidunt vel dui at, elementum semper dolor. Donec tincidunt risus sed magna dictum, quis luctus metus volutpat. Donec accumsan et nunc vulputate accumsan. Vestibulum
    tempor, erat in mattis fringilla, elit urna ornare nunc, vel pretium elit sem quis orci. Vivamus condimentum dictum tempor. Nam at est ante. Sed lobortis et lorem in sagittis. In suscipit in est et vehicula.</p>
</div>

Lorem Ipsum Textの謝罪。

更新

http://codepen.io/akademy/pen/FlkzBを使用したより良い実装について、Matthew Wilcoxsonに感謝.content:before


79
これを行う少し良い方法は、追加の「背景画像」マークアップの代わりに.content:beforeを使用することです。私はここでペンを更新しました:codepen.io/akademy/pen/FlkzB
マシューウィルコックスソン2014年

6
fwiw、この機能を実装しているのはWebkitだけであり、ベンダープレフィックスのみが存在するため、ms-、o-、moz-プレフィックスは役に立ちません。
Jon z 14

2
Firefox 35.0以降でデフォルトでサポートされています:caniuse.com/#feat=css-filters
Mikko Rantalainen '

1
JUstはFF 35に更新され、プレフィックスなしで機能しています
Aamir Mahmood

1
@EdwardBlack問題だとは思いませんが、永続的なぼかしをするには、画像編集ツールを使用する必要があります。もう1つの方法は、phantomJS / headless Webkitブラウザーを使用してある種の画像を取得し、それを提供することですが、これは同じ結果を得るには面倒な方法です。
Aniket

70

ペン

コンテンツを他のソリューションのように修正/絶対的なものにするのではなく、ドキュメントフロー内に収めるために、追加の要素の必要性をなくします。

使用して達成

.content {
  overflow: auto;
  position: relative;
}

オーバーフロー自動が必要です。それ以外の場合、背景は上部の数ピクセルだけオフセットされます。

この後、あなたは単に必要です

.content:before {
  content: "";
  position: fixed;
  left: 0;
  right: 0;
  z-index: -1;

  display: block;
  background-image: url('img-here');
  background-size:cover;
  width: 100%;
  height: 100%;

  -webkit-filter: blur(5px);
  -moz-filter: blur(5px);
  -o-filter: blur(5px);
  -ms-filter: blur(5px);
  filter: blur(5px);
}

編集端にある白い境界線を削除したい場合は、幅と高さ、110%および左と上を使用します。-5%ます。これにより背景が少し拡大されますが、エッジからにじみ出る無地の色はありません。

ここで更新されたペン:https : //codepen.io/anon/pen/QgyewB-提案を提供してくれたChad Fawcettに感謝します。


1
これの制限は、jsの疑似要素を操作できないことです。あなたがする必要がない場合は、それは良い解決策です。
ポジティブラボ

6
ぼやけた白い境界線が気に入らない場合は、widthandおよびheightto 110%を増やしてから、クラスの-5%to topおよびleftofのオフセットを追加できcontent:beforeます。
Chad Fawcett 2017年

1
私にとってはうまくいきますが、ユーザーがページをスクロールすると、その背景画像もスクロールされるようにしたいと思います。固定位置はそれを止めています。この問題を取り除く方法は?
DEEPAN KUMAR

61

他の回答で述べたように、これは次の方法で実現できます。

  • 背景としてのぼやけた画像のコピー。
  • フィルタリングして、コンテンツの背後に配置できる疑似要素。

あなたも使うことができます backdrop-filter

と呼ばれるサポートされるプロパティがあり、backdrop-filter現在Chrome 76、Edge、Safari、iOS Safariでサポートされています(統計についてはcaniuse.comを参照)。

Mozilla devdocsから:

backdrop-filterプロパティは、要素の透明度/不透明度を調整することにより、要素の背後にある領域をぼかしたり、カラーシフトしたりするような効果を提供します。

見る caniuse.comを使用統計を。

次のように使用します。

.background-filter::after {
  -webkit-backdrop-filter: blur(5px); /* Use for Safari 9+, Edge 17+ (not a mistake) and iOS Safari 9.2+ */
  backdrop-filter: blur(5px); /* Supported in Chrome 76 */

  content: "";
  display: block;
  position: absolute;
  width: 100%; height: 100%;
}

.background-filter {
  position: relative;
}

.background {
  background-image: url('https://upload.wikimedia.org/wikipedia/en/6/62/Kermit_the_Frog.jpg');
  width: 200px;
  height: 200px;
}
<div class="background background-filter"></div>

アップデート(2019年12月6日:Chromiumはbackdrop-filter、バージョン76のデフォルトで有効になって出荷されます。

更新(2019年 1月6日):Mozzilla Firefoxチーム、すぐにこれを実装する作業を開始すると発表しました。

更新(21/05/2019)発表されたばかりの Chromium backdrop-filterは、「実験的なWebプラットフォーム機能を有効にする」フラグを有効にしなくても、Chrome Canaryで利用できます。これはbackdrop-filter、すべてのChromeプラットフォームでの実装に非常に近いことを意味します。


5
すべてのブラウザーで機能しない場合でも、これを行うための仕様に合った非ハック方法を提供するという私の投票を受け取ります。
MrMesees

私の知る限り、これは非標準の機能であるため、仕様はありません。
Vitim.us

3
注意喚起!2018年には、ブラウザのサポートが大幅に減少しました!Edge、Firefox、Chromeではサポートされていません。
protoEvangelion

@protoEvangelionはEdge 16+で利用可能になるようですが、他のブラウザーがこれを実装しないと言っていることはありません。これらの主張を裏付ける事実はありますか?
hitautodestruct 2018

@hitautodestruct caniuse.com IEによると、現時点では、FirefoxとChromeはデフォルトでこれをサポートしていません。Edge 17+がこれをサポートしているのはあなたの言うとおりです。ご指摘いただきありがとうございます。ちなみに、クールな答えですが、ブラウザがこれを実装することを望みます:)
protoEvangelion

26

これを行うには、HTMLを再構成する必要があります。背景をぼかすには、要素全体をぼかす必要があります。したがって、背景のみをぼかしたい場合は、それ自体が要素でなければなりません。


6

以下のコードを確認してください:-

.backgroundImageCVR{
	position:relative;
	padding:15px;
}
.background-image{
	position:absolute;
	left:0;
	right:0;
	top:0;
	bottom:0;
	background:url('http://www.planwallpaper.com/static/images/colorful-triangles-background_yB0qTG6.jpg');
	background-size:cover;
	z-index:1;
	-webkit-filter: blur(10px);
  -moz-filter: blur(10px);
  -o-filter: blur(10px);
  -ms-filter: blur(10px);
  filter: blur(10px);	
}
.content{
	position:relative;
	z-index:2;
	color:#fff;
}
<div class="backgroundImageCVR">
    <div class="background-image"></div>
    <div class="content">
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis aliquam erat in ante malesuada, facilisis semper nulla semper. Phasellus sapien neque, faucibus in malesuada quis, lacinia et libero. Sed sed turpis tellus. Etiam ac aliquam tortor, eleifend rhoncus metus. Ut turpis massa, sollicitudin sit amet molestie a, posuere sit amet nisl. Mauris tincidunt cursus posuere. Nam commodo libero quis lacus sodales, nec feugiat ante posuere. Donec pulvinar auctor commodo. Donec egestas diam ut mi adipiscing, quis lacinia mauris condimentum. Quisque quis odio venenatis, venenatis nisi a, vehicula ipsum. Etiam at nisl eu felis vulputate porta.</p>
      <p>Fusce ut placerat eros. Aliquam consequat in augue sed convallis. Donec orci urna, tincidunt vel dui at, elementum semper dolor. Donec tincidunt risus sed magna dictum, quis luctus metus volutpat. Donec accumsan et nunc vulputate accumsan. Vestibulum tempor, erat in mattis fringilla, elit urna ornare nunc, vel pretium elit sem quis orci. Vivamus condimentum dictum tempor. Nam at est ante. Sed lobortis et lorem in sagittis. In suscipit in est et vehicula.</p>
    </div>
</div>


5

以下は、Matthew Wilcoxsonのソリューションのように、「before」疑似要素を含む純粋なCSSの最新のブラウザ用のシンプルなソリューションです。

JavaScriptで画像やその他の属性を変更するために疑似要素にアクセスする必要をなくすには、単にinherit値として使用し、親要素(ここbody)を介してそれらにアクセスします。

body::before {
    content: ""; /* Important */
    z-index: -1; /* Important */
    position: inherit;
    left: inherit;
    top: inherit;
    width: inherit;
    height: inherit;
    background-image: inherit;
    background-size: cover;
    filter: blur(8px);
}

body {
  background-image: url("xyz.jpg");
  background-size: 0 0;  /* Image should not be drawn here */
  width: 100%;
  height: 100%;
  position: fixed; /* Or absolute for scrollable backgrounds */
}

私にはうまくいきません。動作しているjsfiddleはありますか?
Matt

2

.contentCSS のタブで、に変更しposition:absoluteます。そうしないと、レンダリングされたページはスクロールできません。


1

言及されたすべての解決策は非常に巧妙ですが、私がそれらを試したとき、すべてがマイナーな問題またはページ上の他の要素による潜在的なノックオン効果を持っているように見えました。

結局、時間を節約するために、私は単に古いソリューションに戻りました。Paint.NETを使用しましたして、半径5〜10ピクセルの効果、ガウスぼかしに移動し、それをページイメージとして保存しました。:-)

HTML:

<body class="mainbody">
</body

CSS:

body.mainbody
{
    background: url('../images/myphoto.blurred.png');
    -moz-background-size: cover;
    -webkit-background-size: cover;
    background-size: cover;
    background-position: top center !important;
    background-repeat: no-repeat !important;
    background-attachment: fixed;
}

編集:

ようやく機能しましたが、解決策は決して簡単ではありません。こちらをご覧ください:


あなたは2 IMGSダウンロード
CED

1

実際に必要なのは「フィルター」だけです。

blurWhatEverYouWantInPixels»);"

body {
    color: #fff;
    font-family: Helvetica, Arial, sans-serif;
}

#background {
    background-image: url('https://cdn2.geckoandfly.com/wp-content/uploads/2018/03/ios-11-3840x2160-4k-5k-beach-ocean-13655.jpg');
    background-repeat: no-repeat;
    background-size: cover;
    width: 100vw;
    height: 100vh;
    overflow: hidden;
    position: absolute;
    top: 0;
    left: 0;
    z-index: -1;

    /* START */
    /* START */
    /* START */
    /* START */

    /* You can adjust the blur-radius as you'd like */
    filter: blur(3px);
}
<div id="background"></div>

<p id="randomContent">Lorem Ipsum</p>


1

もちろん、これはCSSソリューションではありませんが、CDN Protonをfilter以下で使用できます。

body {
    background: url('https://i0.wp.com/IMAGEURL?w=600&filter=blurgaussian&smooth=1');
}

https://developer.wordpress.com/docs/photon/api/#filterから


localhostテスト中にこれを機能させる滑らかな方法はありますか?
ジョナサン

大きな解像度のイメージのぼかしの量は非常に微妙ですが、ぼやけて見えることなくぼかしの量を大幅に増やすにはどうすればよいですか?幅は少し役立ちますが、ぼかしすぎるとブロック状に見えます
Jonathan

0

私はこれを書きませんでしたがbackdrop-filter、CSS SASSコンパイラを使用して部分的にサポートされているポリフィルがあることに気づきました。そのため、コンパイルパイプラインがあれば、うまく達成できます(TypeScriptも使用します)。

https://codepen.io/mixal_bl4/pen/EwPMWo


0

div {
    background: inherit;
    width: 250px;
    height: 350px;
    position: absolute;
    overflow: hidden;  /* Adding overflow hidden */
}

div:before {
    content: ‘’;
    width: 300px;
    height: 400px;
    background: inherit;
    position: absolute;
    left: -25px;  /* Giving minus -25px left position */
    right: 0;
    top: -25px;   /* Giving minus -25px top position */
    bottom: 0;
    box-shadow: inset 0 0 0 200px rgba(255, 255, 255, 0.3);
    filter: blur(10px);
}


0

この回答は、動的な高さと画像を使用したマテリアルデザインの横型カードレイアウト用です。

カードの動的な高さによる画像のゆがみを防ぐために、背景のプレースホルダー画像をぼかして、高さの変化に合わせて調整できます。

 

説明

  • カードは、フレックスボックスであるwrap <div>withクラスに含まれています
  • カードは、リンクでもある画像とコンテンツの2つの要素で構成されています。
  • リンク<a>、クラスリンクは相対的に配置されます。
  • リンクは、プレースホルダー<div>クラスのblur<img>クラスpicの2つのサブ要素で構成されています画像でます。これは、明確な画像です。
  • どちらも絶対位置にあり、を持っていますがwidth: 100%、クラスpicはより高いスタック順序、つまり、z-index: 2プレースホルダーの上に配置します。
  • ぼやけたプレースホルダーの背景画像は、HTMLのインラインスタイルで設定されます。

 

コード

.wrapper {
  display: flex;
  width: 100%;
  border: 1px solid rgba(0, 0, 0, 0.16);
  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.16), 0 1px 1px rgba(0, 0, 0, 0.23);
  background-color: #fff;
  margin: 1rem auto;
  height: auto;
}

.wrapper:hover {
  box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23);
}

.link {
  display: block;
  width: 200px;
  height: auto;
  overflow: hidden;
  position: relative;
  border-right: 2px solid #ddd;
}

.blur {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  width: 100%;
  height: 100%;
  filter: blur(5px);
  -webkit-filter: blur(5px);
  -moz-filter: blur(5px);
  -o-filter: blur(5px);
  -ms-filter: blur(5px);
}

.pic {
  width: calc(100% - 20px);
  max-width: 100%;
  height: auto;
  margin: auto;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 2;
}

.pic:hover {
  transition: all 0.2s ease-out;
  transform: scale(1.1);
  text-decoration: none;
  border: none;
}

.content {
  display: flex;
  flex-direction: column;
  width: 100%;
  max-width: 100%;
  padding: 20px;
  overflow-x: hidden;
}

.text {
  margin: 0;
}
<div class="wrapper">
  <a href="#" class="link">
    <div class="blur" style="background: url('http://www.planwallpaper.com/static/assets/img/header.jpg') 50% 50% / cover;"></div>
    <img src="http://www.planwallpaper.com/static/assets/img/header.jpg" alt="Title" class="pic" />
  </a>

  <div class="content">
    <p class="text">Agendum dicendo memores du gi ad. Perciperem occasionem ei ac im ac designabam. Ista rom sibi vul apud tam. Notaverim to extendere expendere concilium ab. Aliae cogor tales fas modus parum sap nullo. Voluntate ingressus infirmari ex mentemque ac manifeste
      eo. Ac gnum ei utor sive se. Nec curant contra seriem amisit res gaudet adsunt. </p>
  </div>
</div>


0

CSS GRIDを使用することで、これはさらにシンプルで柔軟性が高くなります。ぼかした背景(imgbg)とテキスト(h2)を重ねるだけです。

<div class="container">
 <div class="imgbg"></div>
 <h2>
  Lorem ipsum dolor sit amet consectetur, adipisicing elit. Facilis enim
  aut rerum mollitia quas voluptas delectus facere magni cum unde?:)
 </h2>
</div>

そしてCSS:

.container {
        display: grid;
        width: 30em;
      }

.imgbg {
        background: url(bg3.jpg) no-repeat center;
        background-size: cover;
        grid-column: 1/-1;
        grid-row: 1/-1;
        filter: blur(4px);
      }


     .container h2 {
        text-transform: uppercase;
        grid-column: 1/-1;
        grid-row: 1/-1;
        z-index: 2;
      }

0
$fondo: url(/grid/assets/img/backimage.png);    
{ padding: 0; margin: 0; } 
body { 
    ::before{
        content:"" ; height: 1008px; width: 100%; display: flex; position: absolute; 
        background-image: $fondo ; background-repeat: no-repeat ; background-position: 
        center; background-size: cover; filter: blur(1.6rem);
    }
}

1
あなたの答えに説明を加えると素晴らしいでしょう。
Arvind Maurya

Whit Sass私は次のコードを挿入し、すべてのアイテムをボディにペイントしました。ボディの背景にイメージのみを表示するように頼むことができますか????? $ fondo:url(/grid/assets/img/backimage.png); {パディング:0; マージン:0; } body {:: before {content: ""; 高さ:1008px; 幅:100%; ディスプレイ:フレックス; 位置:絶対; background-image:$ fondo; background-repeat:no-repeat; 背景の位置:中央。背景サイズ:カバー; フィルター:blur(1.6rem); }}
Carlos Boyzo

0

からの疑似クラスを使用せずに

body{
    background:#cecece;
    font-family: "Scope One", serif;
    font-size: 12px;
    color:black;
    margin:0 auto;
    height:100%;
    width:100%;
    background-image: 
       linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.81)), 
        url(https://i.imgur.com/2rRMQh7.jpg);
       -webkit-background-size: cover;
        -moz-background-size: cover;
        -o-background-size: cover;
        background-size: cover; 
}
<body></body>


-6

コンテンツをスクロール可能にする場合は、コンテンツの位置を絶対位置に設定します。

content {
   position: absolute;
   ...
}

これが私のためだけのものだったのかどうかはわかりませんが、そうでない場合は修正されます。

また、背景が固定されているため、「視差」効果があります。だから今、この人はぼやけた背景を作る方法をあなたに教えただけでなく、それは視差背景効果でもあります!


4
質問に答えません
12:03に取得
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.