Маска в Chrome объединяет абсолютную позицию, скрытое переполнение, z-индекс и радиус границы - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь добиться эффекта, при котором у меня будет div с фоновым изображением с содержимым внутри. Этот контент должен быть в гибком позиционном элементе div с тем же изображением, но размытым (при сохранении его относительного положения относительно родительского).

В поисках спасения я обнаружил, что определенная комбинация правил CSS дает такой точный эффект, но только в Chrome.

.container {
  width: 320px;
  height: 240px;
  position: relative; /* it is required */
  display: flex; /* it is required */
  background: url(https://loremflickr.com/cache/resized/4848_46406748211_5572c760e0_320_240_nofilter.jpg);
}

.mask {
  z-index: 1; /* it is required */
  overflow: hidden; /* it is required */
  width: 150px;
  height: 150px;
  border-radius: 1px; /* it is required */
}

.element {
  background: url(https://loremflickr.com/cache/resized/4848_46406748211_5572c760e0_320_240_nofilter.jpg);
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  filter: blur(5px);
}


<div class="container">
  <div class="mask">
    <div class="element"></div>
  </div>
</div>

https://jsfiddle.net/39um580g/16/

Chrome / Chrome Mobile: enter image description here

Firefox: enter image description here

Safari: enter image description here

Это смешно. Есть ли способ сделать это решение кросс-браузерным?

Ответ Moorthy G:

Предположим, мой блок расположен справа. Текущее поведение версии Chrome такое, как я хочу: enter image description here

При добавлении любого вида преобразования .mask будет относительным, поэтому он уничтожит желаемый эффект: enter image description here

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Одним из решений является создание элемента маски position:absolute, чтобы переполнение работало должным образом, тогда вы можете отрегулировать background-position при настройке положения элемента для исправления положения изображения.

Iиспользовала переменную CSS для упрощения настройки:

.container {
  width: 320px;
  height: 240px;
  position: relative;
  display: flex;
  --img:url(https://loremflickr.com/cache/resized/4848_46406748211_5572c760e0_320_240_nofilter.jpg);
  background:var(--img);
}

.mask {
  z-index: 1;
  overflow: hidden;
  width: 150px;
  height: 150px;
  top:var(--t,0);
  left:var(--l,0);
  position:absolute;
  border-radius: 50px;
}

.mask::before {
  content:"";
  display:block;
  background:var(--img) calc(-1*var(--l)) calc(-1*var(--t)); 
  width:100%;
  height:100%;
  filter: blur(5px);
}
<div class="container" style="--t:20px;--l:80px">
  <div class="mask">
  </div>
</div>

<div class="container" style="--t:90px;--l:0px">
  <div class="mask">
  </div>
</div>
<div class="container" style="--t:50px;--l:50px;--img:url(https://picsum.photos/320/240?image=1069)">
  <div class="mask">
  </div>
</div>
0 голосов
/ 17 марта 2019

Добавление clip-path: polygon(0px 0px, 0px 100%, 100% 100%, 100% 0); обрезает вашу маску.

.mask {
  z-index: 1; /* it is required */
  overflow: hidden; /* it is required */
  width: 150px;
  height: 150px;
  border-radius: 1px; /* it is required */      
  clip-path: polygon(0px 0px, 0px 100%, 100% 100%, 100% 0); /* Fix for Firefox*/
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...