ฉันจะทำให้เอฟเฟกต์แก้ว / เบลอ CSS ทำงานสำหรับภาพซ้อนทับได้อย่างไร


110

ฉันมีปัญหาในการใช้เอฟเฟกต์เบลอใน div ภาพซ้อนทับแบบกึ่งโปร่งใส ฉันต้องการให้ทุกอย่างที่อยู่เบื้องหลัง div เบลอเช่นนี้:

ภาพ SFW

นี่คือ jsfiddle ที่ใช้ไม่ได้: http://jsfiddle.net/u2y2091z/

มีความคิดอย่างไรในการทำงานนี้? ฉันต้องการให้สิ่งนี้ไม่ซับซ้อนที่สุดเท่าที่จะเป็นไปได้และกำหนดให้เป็นข้ามเบราว์เซอร์ นี่คือ CSS ที่ฉันใช้:

#overlay {
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;

    background:black;
    background:rgba(0,0,0,0.8);

    filter:blur(4px);
    -o-filter:blur(4px);
    -ms-filter:blur(4px);
    -moz-filter:blur(4px);
    -webkit-filter:blur(4px);
}

1
FYI - CSS filterไม่รองรับ Firefox คุณไม่ควรใช้มัน
Weafs.py

2
อาจทำให้ div ทึบแสง แต่ใช้องค์ประกอบหลอกกับรูปภาพเนื่องจากเป็นพื้นหลังซึ่งสามารถเบลอได้โดยอิสระ
bjb568

1
@ chipChocolate.py ตัวกรอง CSS ได้รับการสนับสนุนใน FF35 + โดยค่าเริ่มต้น แต่ฉันเห็นด้วยกับคุณเราในฐานะนักพัฒนาไม่ควรพึ่งพาเนื่องจากไม่ใช่คุณลักษณะข้ามเบราว์เซอร์
Hashem Qolami

คำตอบ:


83

สำหรับคำตอบที่ง่ายและทันสมัยยิ่งขึ้น:

backdrop-filter: blur(6px);

หมายเหตุการรองรับเบราว์เซอร์ไม่สมบูรณ์แบบ แต่ในกรณีส่วนใหญ่การเบลอจะไม่จำเป็น


1
นี่เป็นคำตอบที่ดีที่สุด
ฟอกหนังเบอร์ตัน

71

นี่คือตัวอย่างที่ใช้svgตัวกรอง

แนวคิดคือการใช้svgองค์ประกอบที่heightเหมือนกับ#overlayและใช้feGaussianblurตัวกรองกับมัน ตัวกรองนี้ใช้กับsvg imageองค์ประกอบ หากต้องการให้เอฟเฟกต์อัดขึ้นรูปคุณสามารถใช้ a box-shadowที่ด้านล่างของภาพซ้อนทับ

สนับสนุนเบราว์เซอร์สำหรับsvgฟิลเตอร์

Demo on Codepen

body {
  background: #222222;
}
#container {
  position: relative;
  width: 450px;
  margin: 0 auto;
}
img {
  height: 300px;
}
#overlay {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  z-index: 1;
  color: rgba(130, 130, 130, 0.5);
  font-size: 50px;
  text-align: center;
  line-height: 100px;
  box-shadow: 0 3px 5px rgba(0, 0, 0, 0.3);
}
<div id="container">
  <img src="http://lorempixel.com/450/300/sports" />
  <div id="overlay">WET</div>
  <svg width="450" height="100" viewBox="0 0 450 100" style="position: absolute; top: 0;">
    <defs>
      <filter id="blur">
        <feGaussianBlur in="SourceGraphic" stdDeviation="3" />
      </filter>
    </defs>
    <image filter="url(#blur)" xlink:href="http://lorempixel.com/450/300/sports" x="0" y="0" height="300px" width="450px" />
  </svg>
</div>


51

ผมสามารถที่จะข้อมูลชิ้นด้วยกันจากทุกคนที่นี่และ Googling ต่อไปและฉันมากับต่อไปนี้ซึ่งทำงานใน Chrome และ Firefox: http://jsfiddle.net/xtbmpcsu/ ฉันยังคงทำงานนี้สำหรับ IE และ Opera

กุญแจสำคัญคือการใส่เนื้อหาภายใน div ที่จะใช้ตัวกรอง:

<div id="mask">
    <p>Lorem ipsum ...</p>
    <img src="http://www.byui.edu/images/agriculture-life-sciences/flower.jpg" />
</div>

แล้ว CSS:

body {
    background: #300000;
    background: linear-gradient(45deg, #300000, #000000, #300000, #000000);
    color: white;
}
#mask {
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    background-color: black;
    opacity: 0.5;
}
img {
    filter: blur(10px);
    -webkit-filter: blur(10px);
    -moz-filter: blur(10px);
    -o-filter: blur(10px);
    -ms-filter: blur(10px);
    position: absolute;
    left: 100px;
    top: 100px;
    height: 300px;
    width: auto;
}

มาสก์จึงมีการใช้ตัวกรอง นอกจากนี้โปรดทราบการใช้งานของ URL () สำหรับตัวกรองที่มี<svg>แท็กสำหรับค่า - ความคิดที่มาจากhttp://codepen.io/AmeliaBR/pen/xGuBr หากคุณลดขนาด CSS ของคุณคุณอาจต้องแทนที่ช่องว่างในมาร์กอัปตัวกรอง SVG ด้วย "% 20"

ตอนนี้ทุกอย่างภายในหน้ากาก div จะเบลอ


มันฉลาดมาก
Jamaluddin Rumi

3
filter: url(...โครเมี่ยมไม่ชอบสุดท้าย ลบที่และ Chrome filter: blur(10px);ใช้ประสบความสำเร็จ
Doug S

2
ฉันเข้าใจผิดหรือเปล่า? ไม่ใช่สิ่งที่ OP ต้องการ ตำราไม่ควรเบลอ
Eric

2
@ เอริกคุณเข้าใจผิดอย่างชัดเจนเนื่องจากผู้ตอบคือ OP
tao

10

หากคุณกำลังมองหาวิธีการข้ามเบราว์เซอร์ที่เชื่อถือได้ในวันนี้คุณจะไม่พบวิธีที่ยอดเยี่ยม ตัวเลือกที่ดีที่สุดที่คุณมีคือการสร้างภาพสองภาพ (อาจเป็นแบบอัตโนมัติในบางสภาพแวดล้อม) และจัดเรียงให้ภาพหนึ่งซ้อนทับอีกภาพหนึ่ง ฉันได้สร้างตัวอย่างง่ายๆด้านล่าง:

<figure class="js">
    <img src="http://i.imgur.com/3oenmve.png" />
    <img src="http://i.imgur.com/3oenmve.png?1" class="blur" />
</figure>
figure.js {
    position: relative;
    width: 250px; height: 250px;
}

figure.js .blur {
    top: 0; left: 0;
    position: absolute;
    clip: rect( 0, 250px, 125px, 0 );
}

แม้ว่าวิธีนี้จะได้ผล แต่ก็ไม่จำเป็นต้องเหมาะอย่างยิ่ง ที่ถูกกล่าวว่ามันไม่ผลผลิตผลลัพธ์ที่ต้องการ

ป้อนคำอธิบายภาพที่นี่


8

นี่คือทางออกที่เป็นไปได้

HTML

<img id="source" src="http://www.byui.edu/images/agriculture-life-sciences/flower.jpg" />

<div id="crop">
    <img id="overlay" src="http://www.byui.edu/images/agriculture-life-sciences/flower.jpg" />
</div>

CSS

#crop {
    overflow: hidden;

    position: absolute;
    left: 100px;
    top: 100px;

    width: 450px;
    height: 150px;
}

#overlay {
    -webkit-filter:blur(4px);
    filter:blur(4px);

    width: 450px;
}

#source {
    height: 300px;
    width: auto;
    position: absolute;
    left: 100px;
    top: 100px;
}

ฉันรู้ว่า CSS สามารถทำให้ง่ายขึ้นและคุณน่าจะกำจัดรหัสได้ แนวคิดในที่นี้คือการใช้ div เป็นคอนเทนเนอร์การครอบตัดแล้วใช้การเบลอภาพที่ซ้ำกัน ซอ

เพื่อให้งานนี้ใน Firefox คุณจะต้องใช้SVG สับ


@ chipChocolate.py ผมคิดว่าคุณต้องใช้สับ SVG ในกรณีที่ว่านั้นdemosthenes.info/blog/534/Crossbrowser-Image-Blur
Juho Vepsäläinen

โปรดทราบว่าสำหรับตัวกรอง CSS คุณสามารถละเว้นคำนำหน้าผู้ขายนอกเหนือจาก-webkit-นั้นเนื่องจากไม่มีการใช้งานในเบราว์เซอร์เหล่านั้น จะเป็นการดีกว่าที่จะใส่คำประกาศมาตรฐานไว้ในตอนท้าย - หลังจากเวอร์ชันที่มีคำนำหน้าทั้งหมด
Hashem Qolami

@HashemQolami เสร็จแล้ว. ขอบคุณ.
Juho Vepsäläinen

FF ก็โอเคตอนนี้ (54.0.1 (32 บิต)) สมบูรณ์แบบ! Tx!
Pedro Ferreira

8
background: rgba(255,255,255,0.5);
backdrop-filter: blur(5px);

แทนการเพิ่มพื้นหลังเบลออีกครั้งเพื่อให้เนื้อหาของคุณคุณสามารถใช้ฉากหลังกรอง FYI IE 11 และ Firefox อาจไม่รองรับ ตรวจสอบcaniuse

การสาธิต:

header {
  position: fixed;
  width: 100%;
  padding: 10px;
  background: rgba(255,255,255,0.5);
  backdrop-filter: blur(5px);
}
body {
  margin: 0;
}
<header>
  Header
</header>
<div>
  <img src="https://dummyimage.com/600x400/000/fff" />
  <img src="https://dummyimage.com/600x400/000/fff" />
  <img src="https://dummyimage.com/600x400/000/fff" />
</div>


เสนอวิธีแก้ปัญหาเดียวกันแล้ว: stackoverflow.com/a/58083568/3702797
Kaiido

มีวิธีในการบรรลุสิ่งที่คล้ายกันสำหรับ SVG แบบอินไลน์หรือไม่?
71GA

1
@ 71GA check this sitepoint.com/…
Allen Wong

4

#bg, #search-bg {
  background-image: url('https://images.pexels.com/photos/719609/pexels-photo-719609.jpeg?w=940&h=650&auto=compress&cs=tinysrgb');
  background-repeat: no-repeat;
  background-size: 1080px auto;
}

#bg {
  background-position: center top;
  padding: 70px 90px 120px 90px;
}

#search-container {
  position: relative;
}

#search-bg {
  /* Absolutely position it, but stretch it to all four corners, then put it just behind #search's z-index */
  position: absolute;
  top: 0px;
  right: 0px;
  bottom: 0px;
  left: 0px;
  z-index: 99;

  /* Pull the background 70px higher to the same place as #bg's */
  background-position: center -70px;

  -webkit-filter: blur(10px);
  filter: url('/media/blur.svg#blur');
  filter: blur(10px);
}

#search {
  /* Put this on top of the blurred layer */
  position: relative;
  z-index: 100;
  padding: 20px;
  background: rgb(34,34,34); /* for IE */
  background: rgba(34,34,34,0.75);
}

@media (max-width: 600px ) {
  #bg { padding: 10px; }
  #search-bg { background-position: center -10px; }
}

#search h2, #search h5, #search h5 a { text-align: center; color: #fefefe; font-weight: normal; }
#search h2 { margin-bottom: 50px }
#search h5 { margin-top: 70px }
<div id="bg">
  <div id="search-container">
    <div id="search-bg"></div>
    <div id="search">
      <h2>Awesome</h2>
      <h5><a href="#">How it works »</a></h5>
    </div>
  </div>
</div>


1

ฉันคิดวิธีแก้ปัญหานี้ขึ้นมา

คลิกเพื่อดูภาพเอฟเฟกต์เบลอ

มันเป็นเคล็ดลับชนิดหนึ่งที่ใช้ลูกที่อยู่ในตำแหน่งที่แน่นอนdivตั้งค่าภาพพื้นหลังเหมือนกับแม่divและจากนั้นใช้background-attachment:fixedคุณสมบัติ CSS ร่วมกับbackgroundคุณสมบัติเดียวกันที่ตั้งไว้ในองค์ประกอบหลัก

จากนั้นคุณใช้filter:blur(10px)(หรือค่าใด ๆ ) กับ div ลูก

*{
    margin:0;
    padding:0;
    box-sizing: border-box;
}
.background{
    position: relative;
    width:100%;
    height:100vh;
    background-image:url('https://images.unsplash.com/photo-1547937414-009abc449011?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1350&q=80');
    background-size:cover;
    background-position: center;
    background-repeat:no-repeat;
}

.blur{
    position: absolute;
    top:0;
    left:0;
    width:50%;
    height:100%;
    background-image:url('https://images.unsplash.com/photo-1547937414-009abc449011?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1350&q=80');
    background-position: center;
    background-repeat: no-repeat;
    background-attachment: fixed;
    background-size:cover;
    filter:blur(10px);
    transition:filter .5s ease;
    backface-visibility: hidden;
}

.background:hover .blur{
    filter:blur(0);
}
.text{
    display: inline-block;
    font-family: sans-serif;
    color:white;
    font-weight: 600;
    text-align: center;
    position: relative;
    left:25%;
    top:50%;
    transform:translate(-50%,-50%);
}
<head>
    <title>Blurry Effect</title>
</head>
<body>
    <div class="background">
        <div class="blur"></div>
        <h1 class="text">This is the <br>blurry side</h1>
    </div>
</body>
</html>

ดู codepen


1

สิ่งนี้จะทำการเบลอซ้อนทับเนื้อหา:

.blur {
  display: block;
  bottom: 0;
  left: 0;
  position: fixed;
  right: 0;
  top: 0;
  -webkit-backdrop-filter: blur(15px);
  backdrop-filter: blur(15px);
  background-color: rgba(0, 0, 0, 0.5);
}

0

นี่คือวิธีแก้ปัญหาที่ใช้งานได้กับพื้นหลังคงที่หากคุณมีพื้นหลังคงที่และคุณมีองค์ประกอบที่ซ้อนทับและคุณต้องการพื้นหลังที่เบลอสำหรับพวกเขาวิธีนี้ใช้ได้:

รูปภาพเรามี HTML ง่ายๆนี้:

<body> <!-- or any wrapper -->
   <div class="content">Some Texts</div>
</body>

พื้นหลังคงที่สำหรับ<body>หรือองค์ประกอบของ wrapper:

body {
  background-image: url(http://placeimg.com/640/360/any);
  background-size: cover;
  background-repeat: no-repeat;
  background-attachment: fixed;
}

ตัวอย่างเช่นเรามีองค์ประกอบซ้อนทับที่มีพื้นหลังโปร่งใสสีขาว:

.content {
  background-color: rgba(255, 255, 255, 0.3);
  position: relative;
}

ตอนนี้เราจำเป็นต้องใช้ภาพพื้นหลังเดียวกันของเสื้อคลุมของเราสำหรับองค์ประกอบการวางซ้อนของเราด้วยฉันใช้มันเป็น:beforeคลาส psuedo:

.content:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
  filter: blur(5px);
  background-image: url(http://placeimg.com/640/360/any);
  background-size: cover;
  background-repeat: no-repeat;
  background-attachment: fixed;
}

เนื่องจากพื้นหลังคงที่ทำงานในลักษณะเดียวกันทั้งในองค์ประกอบกระดาษห่อหุ้มและองค์ประกอบที่ซ้อนทับเราจึงมีพื้นหลังอยู่ในตำแหน่งเลื่อนเดียวกันขององค์ประกอบที่ซ้อนทับและเราสามารถเบลอได้ นี่คือซอที่ใช้งานได้ซึ่งทดสอบใน Firefox, Chrome, Opera และ Edge: https://jsfiddle.net/0vL2rc4d/

หมายเหตุ:ใน firefox มีข้อผิดพลาดที่ทำให้หน้าจอกะพริบเมื่อเลื่อนและมีพื้นหลังเบลอคงที่ หากมีการแก้ไขโปรดแจ้งให้เราทราบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.