Здається, накладка Apple - це більше, ніж просто прозорість. Будь-які ідеї, як досягти цього ефекту за допомогою CSS та, можливо, JS?
Здається, накладка Apple - це більше, ніж просто прозорість. Будь-які ідеї, як досягти цього ефекту за допомогою 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-трюки
Ця методика використовує CSS Regions, тому підтримка браузера на даний момент не найкраща. ( 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>
Дві важливі частини цього макета є .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 рядок javascript. Я не чув про команду cloneNode js, поки не знайшов це, але він повністю працював на те, що мені точно потрібно.
http://codepen.io/rikschennink/pen/zvcgx
Детальніше: A. В основному він переглядає ваш вміст div та викликає на ньому cloneNode, тому він створює дублікат, який потім розміщує всередині переповнення: прихований об’єкт заголовка, що сидить у верхній частині сторінки. B. Тоді він просто прослуховує прокрутку, щоб обидва зображення, схоже, збігалися і розмивали зображення заголовка ... анулював BAM. Досягнутий ефект.
Насправді не вдається повністю працювати в CSS, поки вони не вбудують у мову вбудований біт сценарію lil.
Приклад тут:
вчора зробила швидку демонстрацію, яка насправді робить те, про що ти говориш. http://bit.ly/10clOM9 цей демонстратор робить паралакс на базі акселерометра, тому він найкраще працює на самому iPhone. Я в основному просто копіюю вміст, який ми накладаємо, у фіксований позиційний елемент, який розмивається.
Примітка: проведіть пальцем вгору, щоб побачити панель.
(я використовував жахливий ідентифікатор CSS, але ви розумієте)
#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 наразі не здатний на це
Однак Кріс Койєр розказав про стару техніку з кількома зображеннями, щоб досягти такого ефекту, 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();
Станом на сьогодні, 11 квітня 2020 року , це легко можливо завдяки backdrop-filter
властивості CSS, яка є стабільною функцією в Chrome, Safari & Edge.
Я хотів, щоб це було в нашому мобільному додатку Hybrid, також доступному в 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's, оскільки він досить колоритний. Я взяв його скріншот і додав як тло в 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 ...>
тег, щоб застосувати його до будь-якого зображення або навіть використовувати кілька зображень.Це може допомогти вам !!
Це динамічно змінює фон, як це робить IOS
.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');
}
});