ефект затуманеного накладання iOS 7 за допомогою CSS?


161

Здається, накладка Apple - це більше, ніж просто прозорість. Будь-які ідеї, як досягти цього ефекту за допомогою CSS та, можливо, JS?

Більше, ніж просто прозорість


2
Більш актуальною проблемою, на мою думку, є те, як налаштувати елемент, який застосовує динамічне розмиття до будь-якого об’єкта, що знаходиться за ним. Тож якби у вас був об’єкт, який міг би панорумувати і збільшувати масштаб, елемент зверху динамічно розмиватиметься з низькою ефективністю.
Родос

1
Дивіться також це питання щодо подібної проблеми.
Кіт

43
Мені здається, що це найбільше хвилює, що це потрібно як "функція IOS7", тоді як інтерфейс Windows Vista Aero робить саме те саме із своїми віконними хромами з 2006 року.
Niels Keurentjes,

1
@NielsKeurentjes Хе, справжня точка. Я включив ефект у дизайн кілька років тому після того, як надихнувся 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, де елемент розмиває частини фону.
Дизайн Адріана

9
Я відредагував мій jsfiddle, тепер це робить трюк , як IOS7;) => CSS3 IOS7 ефект
Cana

34
Як зазначив Адріан, фільтр розмиває лише елемент, і це діти. Його не можна використовувати для накладання для розмивання батьківських елементів або сусідніх елементів, тому ефект iOS 7 неможливий за допомогою CSS.
Джейсон

10
Якщо ви думаєте, що для досягнення цього ефекту просто розмивається, ви помилитесь. Я працюю над простим сховищем з відкритими джерелами, яке досягає цього ефекту, використовуючи JS та CSS 3, будьте в курсі :)
Ryan Brodie

5
У FX це не працює - вони не підтримують -moz-filter: blur(). Замість цього вам потрібно використовувати фільтр SVG, детальну інформацію див. У моїй відповіді.
Кіт

48

Ви змусили мене спробувати спробувати, і я це зробив, ознайомтеся з прикладом тут:

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

Використання:

  1. Прискорені CSS фільтри
  2. JS для призначення класу та клавіші зі стрілками
  3. Властивість CSS Clip

Це воно.

Я також вважаю, що це можна зробити динамічно для будь-якого екрана, якщо використовувати полотно для копіювання поточного дому та розмивання його.


40

[Редагувати] У майбутньому (мобільному) 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
}

для розміщення для перетворення.

Зараз це працює в:

  • Chrome 29+ (увімкніть "експериментальні функції webkit" / "функції експериментального веб-платформи")
  • Сафарі 6,1 насіння 6
  • iOS7 ( повільно і без прокрутки )

1
Демо-версія вже не працює. Вміст йде нижче телефону, і я отримую помилку JS "TypeError: sheet.addRule - це не функція"
BoffinBrain

Добре працює з Safari на Mac та iOS.
Карлос Сільва

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 ), розширивши фрагмент розмитого фону, тому розмиття насправді відбувається на реальному вмісті, а не на нарізаному. Хороше виконання.
П'єр Паоло Рамон

@PierPaoloRamon приємно налаштувати - це я збирався використовувати це, я, ймовірно, трохи розширив SVG-фільтр, щоб включити підвищену яскравість / зменшений контраст, що робить i iOS7, але FX означає лише сувору пісочницю. Я задав ще одне запитання про обхідні шляхи.
Кіт

До речі, ваше рішення просто приносить розмиття, схоже на ios7, на Firefox OS, і це акуратно (я повинен це перевірити).
П'єр Паоло Рамон

14

Перегляньте цю демонстраційну сторінку.
Ця демонстрація використовує html2canvas для візуалізації документа як зображення.

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

  1. Коли натискається посилання "Показати спливаюче вікно", викликається функція "makePopup".
  2. 'makePopup' запускає html2canvas для візуалізації документа у вигляді зображення.
  3. Зображення перетворюється у рядок data-url і малюється у вигляді фонового зображення спливаючого вікна.
  4. Bg Popup розмивається на -webkit-filter: blur
  5. Додайте спливаюче вікно до документа.
  6. Під час перетягування спливаючого вікна він змінює власне фонове положення.

1
Будь ласка, надайте пояснення щодо того, що демонструє насправді демонстрація, після того як вона знизиться, це не допоможе.
Джонатан Драпо

Це дуже приємна ідея - на жаль, html2canvas є просто занадто експериментальним, щоб на нього можна покластися і, мабуть, занадто великим, якщо знімки екрана не є вашою програмою.
Кіт

5
його вниз @JonathanDrapeau, як ви передбачили.
Марк

Ву! Я люблю гниль посилань!
evolutionxbox

Досі використовує розмиття над зображеннями, я не бачу, як це могло б працювати на щось на кшталт липкого навібара.
maninak

10

Ця ручка, яку я знайшов днями, здавалася, робить це красиво, лише трохи css та 21 рядок javascript. Я не чув про команду cloneNode js, поки не знайшов це, але він повністю працював на те, що мені точно потрібно.

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

Детальніше: A. В основному він переглядає ваш вміст div та викликає на ньому cloneNode, тому він створює дублікат, який потім розміщує всередині переповнення: прихований об’єкт заголовка, що сидить у верхній частині сторінки. B. Тоді він просто прослуховує прокрутку, щоб обидва зображення, схоже, збігалися і розмивали зображення заголовка ... анулював BAM. Досягнутий ефект.

Насправді не вдається повністю працювати в CSS, поки вони не вбудують у мову вбудований біт сценарію lil.


Виглядає здорово! Хоча це, очевидно, не надто добре працює з динамічним контентом, якщо тільки ви не оновлюєте дублікат щоразу, коли щось змінюється - це, мабуть, буде великим хітом для продуктивності.
Насс

Я думаю, але не дуже впевнений, де ви міняли б зображення і намагалися зробити цей ефект? Якщо зробити все правильно, це не повинно бути великим хітом, якщо ви переробляєте клон. Можливо, ви можете детально описати випадок, суперечний цьому? Скажімо, наприклад, ви створюєте подачу зображень і хочете, щоб деякі параметри меню придумали цей ефект для меню зображень для кожного елемента ... запустіть це, коли ви відкриєте панель та панель, щоб накладки виглядали б так, як хотів плакат. Додайте утилізатор, щоб dom не нескінченно повторював зображення кожного разу, коли ви відкриваєте меню, і це повинно чудово працювати.
Lux.Capacitor

5
  • клонуйте елемент, який потрібно розмити
  • додайте його до елемента, який ви хочете бути зверху (матове вікно)
  • розмитий клонований елемент з веб-фільтром
  • переконайтесь, що клонований елемент розташований в абсолюті
  • під час прокрутки вихідного елемента початкового елемента вловлюйте scrollTop та scrollLeft
  • використовуючи requestAnimationFrame, тепер встановіть перетворення webkit динамічно на translate3d зі значеннями x та y для scrollTop та scrollLeft

Приклад тут:

  • обов'язково відкрийте у веб-браузері
  • прокручуйте внутрішній вигляд телефону (найкраще з яблучною мишкою ...)
  • див. розмиття нижнього колонтитула в дії

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


4

вчора зробила швидку демонстрацію, яка насправді робить те, про що ти говориш. 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);
}

3

Я не дуже впевнений у цьому, я вважаю, що CSS наразі не здатний на це

Однак Кріс Койєр розказав про стару техніку з кількома зображеннями, щоб досягти такого ефекту, http://css-tricks.com/blurry-background-effect/


Знімок екрана на полотні може спрацювати та "заблокувати" піктограми та фон разом, але я не зміг зрозуміти, чи фон все ще мав ефект паралаксації під іконками, коли він був розмитим ... якщо він не 't, то в хвилину, коли ви почнете переміщувати панель управління (прозора накладка), пристрій створює зображення екрана і виконує цю хитрість зверху. Пам’ятайте, вони не просто обмежуються такими веб-речами, як полотно, коли це роблять, оскільки це знаходиться на рівні OS, і не можуть бути обмежені лише веб-речами.
нотаріус

3

Перевірте це http://codepen.io/GianlucaGuarini/pen/Hzrhf Схоже, це робить ефект без дублювання фонового зображення елемента під собою. Дивіться, що тексти розмиваються також у прикладі.

Vague.js

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

1
Він дублює вміст (у прикладі codepen є два iframe). Спробуйте натиснути на пункт меню, якщо розмита рамка не оновлюється.
Гуглі

Це все одно таке рішення.
Онур Челік

2

Гарні новини

Станом на сьогодні, 11 квітня 2020 року , це легко можливо завдяки backdrop-filterвластивості CSS, яка є стабільною функцією в Chrome, Safari & Edge.

Я хотів, щоб це було в нашому мобільному додатку Hybrid, також доступному в 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
}

Приклад користувальницького інтерфейсу

Дивіться, як це працює в цій ручці, або спробуйте демонстрацію:

#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>

Приклад інтерфейсу користувача 2

Візьмемо приклад програми McDonald's, оскільки він досить колоритний. Я взяв його скріншот і додав як тло в 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.

Чи трапляється вам десь діючий приклад цього? Можливо, jsFiddle чи подібне? Спасибі
Блейкер


-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');
    }
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.