애플의 오버레이는 단순한 투명성이 아닙니다. CSS와 JS로이 효과를 얻는 방법에 대한 아이디어가 있습니까?
애플의 오버레이는 단순한 투명성이 아닙니다. CSS와 JS로이 효과를 얻는 방법에 대한 아이디어가 있습니까?
답변:
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
-moz-filter: blur()
. 지원하지 않습니다 . 대신 SVG 필터를 사용해야합니다. 자세한 내용은 답변을 참조하십시오.
http://codepen.io/Edo_B/pen/cLbrt
사용 :
그게 다야.
캔버스를 사용하여 현재 돔을 복사하고 흐리게 만드는 경우 모든 화면에서 동적으로 수행 할 수 있다고 생각합니다.
[편집] 미래 (모바일) 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
}
변환을 수용합니다.
이것은 현재 일하고 있습니다 :
이것은 요소 스타일 속성 덕분에 FireFox에서 가능 합니다.
이 실험적인 속성을 사용하면 HTML 내용을 배경 이미지로 사용할 수 있습니다. 따라서 배경을 만들려면 세 가지 오버레이가 필요합니다.
-moz-element
내용을 설정 하는 배경으로 오버레이 합니다. FX는이 filter: blur()
속성을 지원하지 않으므로 SVG가 필요합니다.따라서 다음과 같이 정리하십시오.
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"> </div>
<div class="header behind-blur"> </div>
<div class="header">
Header Text, content blurs behind
</div>
그런 다음이 주위를 이동하려면 background-position
(jQuery의 샘플이지만 아무것도 사용할 수 있습니다)를 설정하십시오.
$('.behind-blur').css({
'background-position': '-' + left + 'px -' + top + 'px'
});
이 데모 페이지를 확인하십시오.
이 데모는 html2canvas를 사용하여 문서를 이미지로 렌더링합니다.
http://blurpopup.labs.daum.net/
다른 날에 찾은이 펜은 CSS와 21 줄의 자바 스크립트로 아름답게하는 것처럼 보입니다. 이것을 찾을 때까지 cloneNode js 명령에 대해 들어 보지 못했지만 완전히 필요한 부분을 처리했습니다.
http://codepen.io/rikschennink/pen/zvcgx
세부 사항 : A. 기본적으로 콘텐츠 div를보고 그 위에 cloneNode를 호출하여 페이지 위에 앉아 overflow : hidden 헤더 객체 안에 배치하는 복제본을 만듭니다. B. 그런 다음 단순히 스크롤을 수신하여 두 이미지가 일치하고 헤더 이미지를 흐리게 만듭니다. annnnd BAM. 효과가 달성되었습니다.
언어에 약간의 스크립트 기능이 내장 될 때까지 CSS에서 실제로 완벽하게 수행 할 수는 없습니다.
예를 들면 다음과 같습니다.
어제 빠른 데모를 만들었습니다. 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);
}
확실하지 않습니다, CSS는 현재이 작업을 수행 할 수 없다고 생각합니다.
그러나 Chris Coyier는 이러한 효과를 얻기 위해 여러 이미지가 포함 된 오래된 기술에 대해 블로그를 작성했습니다 ( http://css-tricks.com/blurry-background-effect/).
이것을 확인하십시오 http://codepen.io/GianlucaGuarini/pen/Hzrhf . 요소 자체의 배경 이미지를 복제하지 않고 효과가있는 것처럼 보입니다. 예제에서도 텍스트가 흐리게 표시되는 것을 참조하십시오.
Vague.js
var vague = $blurred.find('iframe').Vague({
intensity:5 //blur intensity
});
vague.blur();
2020 년 4 월 11 일 현재 , 이것은 쉽게 가능합니다backdrop-filter
지금 크롬, 사파리 및 에지에서 안정적으로 기능입니다 CSS 속성입니다.
하이브리드 모바일 앱에서 이것을 원했기 때문에 Android / Chrome Webview 및 Safari WebView에서도 사용할 수 있습니다.
CSS 속성을 추가하기 만하면됩니다.
.my-class {
backdrop-filter: blur(30px);
background: transparent; // Make sure there is not backgorund
}
이 펜 에서 작동하는지 확인 하거나 데모를 시도하십시오.
#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>
McDonald의 앱은 매우 색채가 풍부하기 때문에 예를 들어 보겠습니다. 스크린 샷을 가져 body
와서 앱 의 배경으로 추가했습니다 .
글로시 효과로 텍스트를 표시하고 싶었습니다. backdrop-filter: blur(20px);
위의 오버레이를 사용하여 이것을 볼 수있었습니다 : 😍
backdrop-filter
Firefox에서는 여전히 자동으로 작동하지 않습니다. 사용자 backdrop-filter
가이 효과를보기 위해 의도적 으로 활성화하는 옵션을 설정해야한다고 의심합니다 .
스프라이트에 비슷한 효과를 내기 위해 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>
<feGaussianBlur stdDeviation="10"/>
예제 와 같이 필터를 원하는 것으로 변경하십시오 .<image ...>
태그를 사용하여 이미지에 적용하거나 여러 이미지를 사용할 수도 있습니다.이것은 당신을 도울 수 있습니다!
.myBox {
width: 750px;
height: 500px;
border: rgba(0, 0, 0, 0.5) 1px solid;
background-color: #ffffff;
}
.blurBg {
width: 100%;
height: 100%;
overflow: hidden;
z-index: 0;
}
.blurBg img {
-webkit-filter: blur(50px);
margin-top: -150px;
margin-left: -150px;
width: 150%;
opacity: 0.6;
}
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');
}
});