CSSを使用したiOS 7のぼかしオーバーレイ効果?


161

Appleのオーバーレイは単なる透明度ではないようです。CSSやおそらくJSでこの効果を実現する方法についてのアイデアはありますか?

透明性だけではありません


2
私の意見でより差し迫った懸念は、背後にあるオブジェクトに動的なぼかしを適用する要素を設定する方法です。したがって、パンとズームが可能なオブジェクトがある場合、上の要素は動的にぼやけ、パフォーマンスヒットが低くなります。
ロードス

1
同様の問題については、この質問も参照してください。
キース

43
Windows Vista Aeroインターフェイスが2006
Niels Keurentjes

1
@NielsKeurentjes Heh、本当のポイント。Windowsに触発されてから数年前に、この効果をデザインに取り入れました。しかし、当時、私はエフェクトを画像に焼き付けるという、明らかにシンプルな方法を採用していました。ryanwilliams.co.uk/previews/made2race/1.html
Ryan Williams

回答:


145

CSS3で可能です:

#myDiv {
    -webkit-filter: blur(20px);
    -moz-filter: blur(20px);
    -o-filter: blur(20px);
    -ms-filter: blur(20px);
    filter: blur(20px);
    opacity: 0.4;
}

ここの例=> jsfiddle


119
これは、要素が背景の一部をぼかすiOS7のような効果を実現しません。
Adrian

9
私はjsfiddleを編集しましたが、今ではIOS7のようなトリックを実行しています;)=> CSS3 IOS7効果
Cana

34
エイドリアンが述べたように、フィルターは要素とその子のみをぼかします。オーバーレイに使用して親要素または隣接要素をぼかすことはできないため、iOS 7の効果はCSSでは不可能です。
Jason

10
この効果を達成するためにぼやけているだけだと思う​​なら、あなたは間違っているでしょう。私は、JSとCSS 3の両方を使用してこの効果を実現する単純なオープンソースのリポジトリに取り組んでいます。今後もお待ちください:)
Ryan Brodie

5
これはFXでは機能しません-それらはサポートしていません-moz-filter: blur()。代わりに、SVGフィルターを使用する必要があります。詳細については、私の回答を参照してください。
キース

48

あなたは私に試したいと思ったので、私はそうしました、ここの例をチェックしてください:

http://codepen.io/Edo_B/pen/cLbrt

使用:

  1. HW Accelerated CSS Filters
  2. クラスの割り当てと矢印キーイベントのJS
  3. 画像のCSSクリッププロパティ

それでおしまい。

また、キャンバスを使用して現在のdomをコピーしてぼかすと、どの画面でもこれを動的に実行できると思います。


40

[編集]将来(モバイル)Safari 9には-webkit-backdrop-filter、まさにこれがあるでしょう。見せるために作ったこのペンを見てください。

私はこれを過去4週間考え、この解決策を思いつきました。

ライブデモ

[編集]私はCSS-Tricksについてより詳細な記事を書きました

この手法はCSSリージョンを使用しているため、現時点ではブラウザのサポートは最適ではありません。(http://caniuse.com/#feat=css-regions

この手法の重要な部分は、CSS領域を使用してコンテンツをレイアウトから分離することです。まず.content要素を定義してflow-into:contentから、適切な構造を使用してヘッダーをぼかします。

レイアウト構造:

<div class="phone">
 <div class="phone__display">
  <div class="header">
    <div class="header__text">Header</div>
    <div class="header__background"></div>
  </div>
  <div class="phone__content">
  </div>
 </div>
</div>

このレイアウトの2つの重要な部分は .header__background andであり、.phone__contentこれらはコンテンツがフローするコンテナです。

CSSリージョンを使用すると、flow-from:content.content名前付きリージョンに流れ込んでいますcontent

ここでトリッキーな部分があります。私たちは常にコンテンツを.header__backgroundは、コンテンツがぼかされるセクションだからです。(を使用webkit-filter:blur(10px);

これは、によって行われたコンテンツは常にかかわら流れますことを保証するために。この変換では、ヘッダーの下のコンテンツが常に非表示になります。これを修正すると簡単に追加できますtransfrom:translateY(-$HeightOfTheHeader).content.header__background

.header__background:before{
  display:inline-block;
  content:'';
  height:$HeightOfTheHEader
}

変換に対応します。

これは現在以下で動作しています:

  • Chrome 29以降( 'experimental-webkit-features' / 'enable-experimental-web-platform-features'を有効化)
  • Safari 6.1シード6
  • iOS7(低速でスクロールなし

1
ライブデモは機能しなくなりました。コンテンツが電話の下に表示され、JSエラー「TypeError:sheet.addRule is not a function」が発生する
BoffinBrain

MacとiOSのSafariで適切に動作します。
Carlos Silva

16

これは、FireFoxで要素スタイル属性のおかげで可能になりました。

この実験的な属性を使用すると、任意のHTMLコンテンツを背景画像として使用できます。したがって、背景を作成するには、3つのオーバーレイが必要です。

  1. 単色の背景を持つ単純なオーバーレイ(実際のオーバーレイコンテンツを非表示にするため)。
  2. -moz-elementコンテンツを設定する背景をオーバーレイします。FXはfilter: blur()属性をサポートしていないため、SVGを使用する必要があることに注意してください。
  3. ぼやけていないコンテンツでオーバーレイします。

したがって、まとめます:

SVGぼかしフィルター(FXで動作し、他のブラウザーでも使用できますfilter:blur()):

<svg>
  <defs>
    <filter id="svgBlur">
      <feGaussianBlur stdDeviation="10"/>
    </filter>
  </defs>
</svg>

CSSぼかしスタイル:

.behind-blur 
{
    filter         : url(#svgBlur); 
    opacity: .4;
    background: -moz-element(#content);
    background-repeat: no-repeat;
}

最後に3つのレイヤー:

<div class="header" style="background-color: #fff">&nbsp;</div>
<div class="header behind-blur">&nbsp;</div>
<div class="header">
    Header Text, content blurs behind
</div>

次に、これを移動するには、background-position(jQueryのサンプルですが、何でも使用できます)を設定します。

$('.behind-blur').css({
    'background-position': '-' + left + 'px -' + top + 'px'
}); 

ここでは、JSフィドル、FXのみです。


1
あなたの解決策は私が考えていたものに似ています。ぼかした背景のスライスを拡張してグリッチ(jsfiddle.net/RgBzH/30)を修正したため、実際のコンテンツではスライスされたものではなく、実際のコンテンツでブラーが発生します。とにかく良い実行。
ピアパオロラモン

@PierPaoloRamon素敵な調整-これを使用するつもりだったので、おそらくSVGフィルターを少し拡張して、iOS7が行う明るさの増加/コントラストの低下を含めますが、FXはこの時点で厳密にサンドボックスを意味します。回避策について別の質問をしました。
キース

ところで、あなたのソリューションはios7のようなぼかしをFirefox OSにもたらすだけです。
ピアパオロラモン

14

このデモページをご覧ください。
このデモでは、html2canvasを使用してドキュメントを画像としてレンダリングします。

http://blurpopup.labs.daum.net/

  1. 「ポップアップを表示」リンクをクリックすると、「makePopup」関数が呼び出されます。
  2. 「makePopup」はhtml2canvasを実行します、ドキュメントを画像としてレンダリングするためにをします。
  3. 画像はdata-url文字列に変換され、ポップアップのbackground-imageとしてペイントされます。
  4. ポップアップのbgがぼやけている -webkit-filter:blurぼやけている
  5. ドキュメントにポップアップを追加します。
  6. ポップアップをドラッグしている間、それはそれ自身の背景の位置を変更します。

1
デモが停止すると役に立たなくなるため、デモの実際の動作を説明してください。
ジョナサンドラポー2013

これは本当に素晴らしいアイデアです。残念ながら、html2canvasはあまりにも実験的すぎてまだ信頼できず、スクリーンショットがアプリケーションの目的でない限り、おそらく大きすぎます。
キース

5
あなたが予測したように、そのダウン@JonathanDrapeau。
マーク

ウー!リンク腐敗大好き!
evolutionxbox

まだ画像にぼかしを使用していますが、これがスティッキーナビゲーションバーのようなものにどのように機能するかはわかりません。
マニナック2017年

10

先日見つけたこのペンは、ほんの少しのcssと21行のjavascriptで、美しく表示されているようでした。これが見つかるまで、cloneNode jsコマンドについて聞いたことがありませんでしたが、確実に必要なもので問題なく動作しました。

http://codepen.io/rikschennink/pen/zvcgx

詳細:A.基本的には、コンテンツdivを確認してcloneNodeを呼び出し、複製を作成して、ページの上部にあるoverflow:hiddenヘッダーオブジェクト内に配置します。B.次に、スクロールをリッスンするだけで、両方の画像が一致しているように見え、ヘッダー画像がぼやけます。効果が出ました。

言語にスクリプト機能が少し組み込まれるまで、CSSで完全に実行できるわけではありません。


素晴らしく見える!これは、動的コンテンツでは明らかにうまく機能しませんが、何かが変更されるたびに複製を更新しない限り、パフォーマンスに大きな影響を与える可能性があります。
Nass 2014年

私はそう思いますが、どこで画像を変更し、この効果を実行しようとしているのか本当にわかりませんか?適切に行われていれば、クローンをリサイクルしても、大きな影響はありません。おそらく、これとは逆のケースを詳しく説明できますか?たとえば、画像フィードを作成し、いくつかのメニューオプションで各アイテムの画像メニューにこの効果を出すようにしたいとします。パネルを表示し、オーバーレイのパネルが必要なポスターのように見えるようにこれを実行します。weeリサイクラーを追加して、メニューを開くたびにdomが画像を際限なく複製しないようにします。
Lux.Capacitor 2014

5
  • ぼかしたい要素を複製する
  • 最前面に表示する要素(曇りウィンドウ)に追加します
  • webkit-filterでクローン要素をぼかす
  • 複製された要素が絶対配置されていることを確認してください
  • 元の要素の親をスクロールするときに、scrollTopとscrollLeftをキャッチします。
  • requestAnimationFrameを使用して、webkit-transformを動的に設定して、translate3dをx値とy値でscrollTopとscrollLeftに設定します。

例はここにあります:

  • 必ずwebkit-browserで開いてください
  • 電話ビュー内をスクロールします(アップルマウスで最適です...)
  • 実際のぼかしフッターを確認する

http://versie1.com/TEST/ios7/


4

昨日、あなたの話を実際に行う簡単なデモを行いました。http://bit.ly/10clOM9 このデモは、加速度計に基づいて視差を行うため、iPhone自体で最適に動作します。基本的に、オーバーレイするコンテンツを、ぼやけた固定位置要素にコピーするだけです。

注:上にスワイプしてパネルを表示します。

(私は恐ろしいCSS IDを使用しましたが、あなたはアイデアを得ます)

#frost{
 position: fixed; 
 bottom: 0; 
 left:0; 
 width: 100%; 
 height: 100px; 
 overflow: hidden;
 -webkit-transition: all .5s;
}
#background2{
 -webkit-filter: blur(15px) brightness(.2);
}

#content2fixed{
 position: fixed;
 bottom: 9px;
 left: 9px;
 -webkit-filter: blur(10px);
}

3

それについてはよくわかりませんが、CSSは現時点ではこれを行うことができないと思います

しかしクリスCoyierは、このような効果を達成するために、複数のイメージを持つ古い技術についてブログしている、http://css-tricks.com/blurry-background-effect/


画面のキャンバスへのスナップショットが機能し、これを行う前にアイコンと背景を一緒に「ロック」する可能性がありますが、背景がぼかされたときにアイコンの下にまだ視差効果があるかどうかを確認できませんでした...では、コントロールパネル(透明オーバーレイ)を動かし始めると、デバイスが画面のイメージを作成し、このトリックをオーバートップで実行します。これは、OSレベルであるため、これを行うときにcanvasのようなWebベースのものによって制限されるだけでなく、Webkitのものに限定されない場合があります。
2013年

3

これをチェック くださいhttp://codepen.io/GianlucaGuarini/pen/Hzrhf それ自体の下にある要素の背景画像を複製せずに効果があるようです。例でもテキストがぼやけています。

Vague.js

var vague = $blurred.find('iframe').Vague({
  intensity:5 //blur intensity
});
vague.blur();

1
これは、複製したコンテンツを(2のiframeを使用して、リンクされcodepen例です)。メニュー項目をクリックしてみてください。ぼやけたiframeが更新されません。
Guglie

とにかくそれは一種の解決策です。
OnurÇelik2015年

2

良いニュース

今日の2020年4月11日以降、これはbackdrop-filter CSSプロパティを使用ます。これは、Chrome、Safari、およびEdgeの安定した機能です。

これをハイブリッドモバイルアプリに追加したかったので、Android / Chrome WebviewとSafari WebViewでも利用できます。

  1. https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter
  2. https://caniuse.com/#search=backdrop-filter

コード例:

CSSプロパティを追加するだけです。

.my-class {
    backdrop-filter: blur(30px);
    background: transparent;     // Make sure there is not backgorund
}

UIの例1

このペンで機能するか、デモを試す:

#main-wrapper {
  width: 300px;
  height: 300px;
  background: url("https://i.picsum.photos/id/1001/500/500.jpg") no-repeat center;
  background-size: cover;
  position: relative;
  overflow: hidden;
}

.my-effect {
  position: absolute;
  top: 300px;
  left: 0;
  width: 100%;
  height: 100%;
  font-size: 22px;
  display: flex;
  justify-content: center;
  align-items: center;
  color: black;
  -webkit-backdrop-filter: blur(15px);
  backdrop-filter: blur(15px);
  transition: top 700ms;
}

#main-wrapper:hover .my-effect {
  top: 0;
}
<h4>Hover over the image to see the effect</h4>

<div id="main-wrapper">
  <div class="my-effect">
    Glossy effect worked!
  </div>
</div>

UIの例2

マクドナルドのアプリは非常にカラフルなので、例を挙げてみましょう。スクリーンショットを撮りbody、アプリの背景に追加しました。

その上に光沢のあるテキストを表示したかったのです。backdrop-filter: blur(20px);その上のオーバーレイで使用して、これを見ることができました:😍

メインスクリーンショット ここに画像の説明を入力してください


backdrop-filterただし、Firefoxではまだ自動的に機能しません。ユーザーがbackdrop-filterこの効果を確認するためだけに意図的にアクティブ化するオプションをオンにすることはないでしょう。
リチャード

0

私はSVGフィルターを使用して、スプライトに同様の効果を達成しています

<svg id="gray_calendar" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 48 48 48">
  <filter id="greyscale">
    <feColorMatrix type="saturate" values="0"/>
  </filter>
  <image width="48" height="10224" xlink:href="tango48i.png" filter="url(#greyscale)"/>
</svg>
  • viewBox属性は、含まれる画像の必要な部分だけを選択します。
  • フィルターを、キースの<feGaussianBlur stdDeviation="10"/>例のように、好きなように変更するだけです。
  • <image ...>タグを使用して任意の画像に適用するか、複数の画像を使用します。
  • これをjsで作成してイメージとして使用するか、cssでidを使用できます。

どこかにこれの実例がありますか?おそらくjsFiddleまたは同様のものですか?ありがとう
Blaker


-1

これがjQueryでの私の見解です。解決策は普遍的なものではありません。つまり、実際の設計によっては、位置やものの一部を微調整する必要があります。

基本的に私がしたことは:トリガーで背景全体(ぼかす必要がある)をぼやけていないコンテンツ(オプションで、全幅でない場合は非表示のオーバーフローがあります)のあるコンテナーにクローン/削除して、正しく配置します。警告は、ウィンドウのサイズ変更でぼやけたdivが位置に関して元のdivと一致しないことですが、これはいくつかのウィンドウのサイズ変更機能で解決できます(正直なところ、今は気にすることができませんでした)。

私はこの解決策についてあなたの意見を本当に感謝します!

ありがとう

これは、IEでテストされていないフィドルです。

HTML

<div class="slide-up">
<div class="slide-wrapper">
    <div class="slide-background"></div>
    <div class="blured"></div>
    <div class="slide-content">
         <h2>Pop up title</h2>

        <p>Pretty neat!</p>
    </div>
</div>
</div>
<div class="wrapper">
<div class="content">
     <h1>Some title</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque molestie magna elit, quis pulvinar lectus gravida sit amet. Phasellus lacinia massa et metus blandit fermentum. Cras euismod gravida scelerisque. Fusce molestie ligula diam, non porta ipsum faucibus sed. Nam interdum dui at fringilla laoreet. Donec sit amet est eu eros suscipit commodo eget vitae velit.</p>
</div> <a class="trigger" href="#">trigger slide</a>

</div>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
<filter id="blur">
    <feGaussianBlur stdDeviation="3" />
</filter>
</svg>

CSS

body {
margin: 0;
padding: 0;
font-family:'Verdana', sans-serif;
color: #fff;
}
.wrapper {
position: relative;
height: 100%;
overflow: hidden;
z-index: 100;
background: #CD535B;
}
img {
width: 100%;
height: auto;
}
.blured {
top: 0;
height: 0;
-webkit-filter: blur(3px);
-moz-filter: blur(3px);
-ms-filter: blur(3px);
filter: blur(3px);
filter: url(#blur);
filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius='3');
position: absolute;
z-index: 1000;
}
.blured .wrapper {
position: absolute;
width: inherit;
}
.content {
width: 300px;
margin: 0 auto;
}
.slide-up {
top:10px;
position: absolute;
width: 100%;
z-index: 2000;
display: none;
height: auto;
overflow: hidden;
}
.slide-wrapper {
width: 200px;
margin: 0 auto;
position: relative;
border: 1px solid #fff;
overflow: hidden;
}
.slide-content {
z-index: 2222;
position: relative;
text-align: center;
color: #333333;
}
.slide-background {
position: absolute;
top: 0;
width: 100%;
height: 100%;
background-color: #fff;
z-index: 1500;
opacity: 0.5;
}

jQuery

// first just grab some pixels we will use to correctly position the blured element
var height = $('.slide-up').outerHeight();
var slide_top = parseInt($('.slide-up').css('top'), 10);
$wrapper_width = $('body > .wrapper').css("width");
$('.blured').css("width", $wrapper_width);

$('.trigger').click(function () {
    if ($(this).hasClass('triggered')) { // sliding up
        $('.blured').animate({
            height: '0px',
            background: background
        }, 1000, function () {
            $('.blured .wrapper').remove();
        });
        $('.slide-up').slideUp(700);
        $(this).removeClass('triggered');
    } else { // sliding down
        $('.wrapper').clone().appendTo('.blured');
        $('.slide-up').slideDown(1000);
        $offset = $('.slide-wrapper').offset();
        $('.blured').animate({
            height: $offset.top + height + slide_top + 'px'
        }, 700);
        $('.blured .wrapper').animate({
            left: -$offset.left,
            top: -$offset.top
        }, 100);
        $(this).addClass('triggered');
    }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.