CSS를 사용한 iOS 7의 흐릿한 오버레이 효과?


161

애플의 오버레이는 단순한 투명성이 아닙니다. CSS와 JS로이 효과를 얻는 방법에 대한 아이디어가 있습니까?

투명성 그 이상


2
내 생각에 더 시급한 관심사는 그 뒤에있는 모든 객체에 동적 흐림 효과를 적용하는 요소를 설정하는 방법입니다. 따라서 이동 및 확대 / 축소 할 수있는 객체가있는 경우 성능 저하가 적 으면 맨 위에있는 요소가 동적으로 흐리게 표시됩니다.
Rhodes

1
비슷한 문제에 대해서는 이 질문 을 참조하십시오 .
Keith

43
Windows Vista Aero 인터페이스가 2006 년부터 창 크롬과 똑같은 일을하고있는 동안 이것이 'IOS7 기능'으로 원한다는 것이 가장 걱정스러운 것 같습니다.
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
Adrian이 언급했듯이이 필터는 요소 만 흐리게하고 자식 요소입니다. 오버레이가 상위 요소 또는 인접 요소를 흐리게하는 데 사용할 수 없으므로 CSS에서는 iOS 7 효과를 사용할 수 없습니다.
Jason

10
이 효과를 달성하기 위해 흐려지고 있다고 생각하면 잘못되었을 것입니다. JS와 CSS 3를 모두 사용하여이 효과를 달성하는 간단한 오픈 소스 리포지토리에서 작업하고 있습니다. :)
Ryan Brodie

5
FX에서는 작동하지 않습니다 -moz-filter: blur(). 지원하지 않습니다 . 대신 SVG 필터를 사용해야합니다. 자세한 내용은 답변을 참조하십시오.
키스

48

당신이 나를 시험 해보고 싶었으므로 여기에서 예제를 확인하십시오.

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

사용 :

  1. HW 가속 CSS 필터
  2. 클래스 할당 및 화살표 키 이벤트를위한 JS
  3. 이미지 CSS 클립 속성

그게 다야.

캔버스를 사용하여 현재 돔을 복사하고 흐리게 만드는 경우 모든 화면에서 동적으로 수행 할 수 있다고 생각합니다.


40

[편집] 미래 (모바일) Safari 9에는 -webkit-backdrop-filter정확히이 기능이 있을 것 입니다. 참조 제가 보여 드리기 위해 만든 펜을 .

나는 지난 4 주 동안 이것에 대해 생각 하고이 솔루션을 생각해 냈습니다.

라이브 데모

[편집] CSS-Tricks 에 대해 더 깊이있는 글을 썼습니다

이 기술은 CSS 지역을 사용 하므로 현재 브라우저 지원이 최고가 아닙니다. ( http://caniuse.com/#feat=css-regions )

이 기술의 핵심은 CSS Region을 사용하여 컨텐츠를 레이아웃에서 분리하는 것입니다. 먼저 .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>

이 레이아웃의 두 가지 중요한 부분이 있습니다 .header__background.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'사용)
  • 사파리 6.1 씨앗 6
  • iOS7 ( 느리게 스크롤 없음 )

1
라이브 데모가 더 이상 작동하지 않습니다. 내용은 전화 아래로 이동하고 JS 오류 "TypeError : sheet.addRule은 함수가 아닙니다"
BoffinBrain이

Mac 및 iOS의 Safari와 잘 작동합니다.
Carlos Silva

16

이것은 요소 스타일 속성 덕분에 FireFox에서 가능 합니다.

이 실험적인 속성을 사용하면 HTML 내용을 배경 이미지로 사용할 수 있습니다. 따라서 배경을 만들려면 세 가지 오버레이가 필요합니다.

  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 Fiddle, FX 만입니다.


1
귀하의 솔루션은 내가 생각한 것과 유사합니다. 배경 조각을 흐리게 처리 하여 글리치 ( jsfiddle.net/RgBzH/30 )를 수정 했으므로 실제로는 조각이 아니라 실제 내용에서 흐림이 발생합니다. 어쨌든 좋은 처형.
Pier Paolo Ramon

@PierPaoloRamon nice tweak-이것을 사용하려고했을 것입니다. 아마 iOS 필터가 증가하는 밝기 / 감소 된 대비를 포함하도록 SVG 필터를 약간 확장 할 것입니다. 그러나 FX는이 시점에서 엄격하게 샌드 박스만을 의미합니다. 내가 물었다 한 또 다른 문제 해결 방법에 대한합니다.
Keith

BTW, 귀하의 솔루션은 Firefox OS에 ios7과 같은 흐림 효과를 제공하며 깔끔합니다 (테스트해야합니다).
Pier Paolo Ramon

14

이 데모 페이지를 확인하십시오.
이 데모는 html2canvas를 사용하여 문서를 이미지로 렌더링합니다.

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

  1. "팝업 표시"링크를 클릭하면 'makePopup'기능이 호출됩니다.
  2. 'makePopup'은 문서를 이미지로 렌더링하기 위해 html2canvas 를 실행 합니다.
  3. 이미지는 data-url 문자열로 변환되고 팝업의 배경 이미지로 페인트됩니다.
  4. 팝업의 bg가 흐려짐 -webkit-filter : blur에 흐려짐
  5. 팝업을 문서에 추가하십시오.
  6. 팝업을 드래그하는 동안 자체 배경 위치가 변경됩니다.

1
데모가 중단 된 후에 실제로 수행하는 작업에 대한 설명을 제공하면 도움이되지 않습니다.
Jonathan Drapeau

불행히도 html2canvas 는 너무 실험적이어서 아직 응용 프로그램이 아닌 스크린 샷이 아닌 한 너무 클 수도 있습니다.
키스

5
예상대로 @JonathanDrapeau의 다운.
Mark

우! 나는 링크 썩음을 좋아한다!
evolutionxbox

여전히 이미지에 흐림 효과를 사용하지만 끈적 끈적한 탐색 표시 줄과 같은 방식으로 작동하는 방법을 모르겠습니다.
maninak

10

다른 날에 찾은이 펜은 CSS와 21 줄의 자바 스크립트로 아름답게하는 것처럼 보입니다. 이것을 찾을 때까지 cloneNode js 명령에 대해 들어 보지 못했지만 완전히 필요한 부분을 처리했습니다.

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

세부 사항 : A. 기본적으로 콘텐츠 div를보고 그 위에 cloneNode를 호출하여 페이지 위에 앉아 overflow : hidden 헤더 객체 안에 배치하는 복제본을 만듭니다. B. 그런 다음 단순히 스크롤을 수신하여 두 이미지가 일치하고 헤더 이미지를 흐리게 만듭니다. annnnd BAM. 효과가 달성되었습니다.

언어에 약간의 스크립트 기능이 내장 될 때까지 CSS에서 실제로 완벽하게 수행 할 수는 없습니다.


좋아 보인다! 동적 콘텐츠에서는이 기능이 제대로 작동하지 않지만 변경 될 때마다 복제본을 업데이트하지 않으면 성능이 크게 저하 될 수 있습니다.
Nass

나는 당신이 이미지를 어디에서 바꾸고이 효과를 시도하려고하는지 확실하지 않습니까? 올바르게 수행하면 복제품을 재활용하더라도 큰 타격을 입어서는 안됩니다. 아마도 당신은 이것에 반대되는 사건을 자세히 설명 할 수 있습니까? 예를 들어 이미지 피드를 만들고 각 항목의 이미지 메뉴에 대해 일부 메뉴 옵션에이 효과를 적용하고 싶다고 가정 해보십시오. 패널과 패널이 노출되면 포스터가 원하는 것처럼 보일 때이를 실행하십시오. 메뉴를 열 때마다 dom이 이미지를 끝없이 복제하지 않고 잘 작동하도록 wee 리사이클을 추가하십시오.
Lux.Capacitor

5
  • 흐리게하려는 요소를 복제
  • 맨 위에 표시하려는 요소 (서리로 덥은 창)에 추가
  • 웹킷 필터로 복제 된 요소 흐림
  • 복제 된 요소가 절대 위치에 있는지 확인
  • 원래 요소의 부모를 스크롤 할 때 scrollTop 및 scrollLeft를 잡습니다.
  • requestAnimationFrame을 사용하여 x 및 y 값을 가진 3d를 scrollTop 및 scrollLeft로 변환하도록 webkit-transform을 동적으로 설정하십시오.

예를 들면 다음과 같습니다.

  • 웹킷 브라우저에서 열어야합니다
  • 전화보기 내부 스크롤 (애플 마우스로 가장 좋습니다 ...)
  • 바닥 글 흐리게 표시

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는 현재이 작업을 수행 할 수 없다고 생각합니다.

그러나 Chris Coyier는 이러한 효과를 얻기 위해 여러 이미지가 포함 된 오래된 기술에 대해 블로그를 작성했습니다 ( http://css-tricks.com/blurry-background-effect/).


이 작업을 수행하기 전에 화면의 캔버스 스냅 샷이 작동하고 아이콘과 배경을 함께 '잠글'수 있지만 배경이 흐려 졌을 때 아이콘 아래에서 시차 효과가 여전히 있는지 확인할 수 없었습니다 ... 't, 그러면 제어판 (투명 오버레이) 이동을 시작하는 순간 장치가 화면 이미지를 생성하고이 속임수를 오버 탑으로 수행합니다. 당신이 그것들을 os 레벨에 있기 때문에 이것을 할 때 canvas와 같은 웹 기반 것들에 의해 제한되지 않으며, 웹킷 것들에 제한되지 않을 수도 있습니다.
유쾌한

3

이것을 확인하십시오 http://codepen.io/GianlucaGuarini/pen/Hzrhf . 요소 자체의 배경 이미지를 복제하지 않고 효과가있는 것처럼 보입니다. 예제에서도 텍스트가 흐리게 표시되는 것을 참조하십시오.

Vague.js

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

1
그것은 중복 내용을 (이 iframe을 사용하면 링크 된 codepen 예에있다). 메뉴 항목을 클릭하면 흐리게 iframe이 업데이트되지 않습니다.
Guglie

어쨌든 일종의 해결책입니다.
Onur Çelik

2

좋은 소식

2020 년 4 월 11 일 현재 , 이것은 쉽게 가능합니다backdrop-filter 지금 크롬, 사파리 및 에지에서 안정적으로 기능입니다 CSS 속성입니다.

하이브리드 모바일 앱에서 이것을 원했기 때문에 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

McDonald의 앱은 매우 색채가 풍부하기 때문에 예를 들어 보겠습니다. 스크린 샷을 가져 body와서 앱 의 배경으로 추가했습니다 .

글로시 효과로 텍스트를 표시하고 싶었습니다. backdrop-filter: blur(20px);위의 오버레이를 사용하여 이것을 볼 수있었습니다 : 😍

메인 스크린 샷 여기에 이미지 설명을 입력하십시오


backdrop-filterFirefox에서는 여전히 자동으로 작동하지 않습니다. 사용자 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 속성은 포함 된 이미지에서 원하는 부분 만 선택합니다.
  • Keith의 <feGaussianBlur stdDeviation="10"/>예제 와 같이 필터를 원하는 것으로 변경하십시오 .
  • <image ...>태그를 사용하여 이미지에 적용하거나 여러 이미지를 사용할 수도 있습니다.
  • js로 이것을 구축하고 이미지로 사용하거나 CSS에서 ID를 사용할 수 있습니다.

이 어딘가에 실례가 있습니까? 아마도 jsFiddle 또는 유사합니까? 감사합니다
Blaker


-1

jQuery를 사용 하여이 작업을 수행합니다. 솔루션은 보편적이지 않으므로 실제 디자인에 따라 일부 위치와 내용을 조정해야합니다.

기본적으로 내가 한 일은 : 트리거 클론에서 / 전체 배경 (흐리게되어야하는 것)이 흐려지지 않은 내용 (선택적으로 전체 너비가 아닌 경우 오버플로가 숨겨져 있음)이있는 컨테이너로 이동하고 올바르게 배치하십시오. 주의 사항은 창 크기를 조정하면 희미한 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.