像渐变一样将图像淡化为透明

60

我想要一张图片(作为背景图片)逐渐变得透明,这样就可以看到它后面的内容(由于透明度,可能只能模糊地看到)。

当然,我可以通过使用PNG图像来实现这个效果,但每次我想要改变起始=>终止透明度点时,我都需要向我的平面设计师提出更改图片的请求(也许我想要更多颜色或者我想要更少的颜色和更多的透明度)。

是否有任何机会我可以用CSS3实现同样的效果?我尝试在jpg(和png)上应用渐变到透明,但除非PNG已经具有透明度(和基本渐变),否则我无法看到它(这使CSS渐变变得无用)。

有什么建议吗?我正在努力搜寻网络,但似乎我没有使用正确的关键字,或者可能不可能实现。

更新1:

代码说得比很多话都要好,我想做这样的事情(但语法显然不对):

background: linear-gradient(to bottom, rgba(url('splash_bottom3.png'), 0.0), rgba(url('splash_bottom3.png'), 1.0));

1
你需要搜索“遮罩”。但是在跨浏览器上让它正常工作很困难。 - vals
哦,你的建议真的很好,我没有找到正确的关键词。好的,我在网上查了一下,我可以支持IE10+/Chrome最新版本/Firefox最新版本。如果我在这些浏览器上遇到问题,显然我不能使用它。 - Francesco Belladonna
3个回答

105

如果你想要这样做:

enter image description here

你可以这样做:

<html>
  <style type='text/css'>
    div, img { position:absolute; top:0; left:0; width:250px; height:250px; }
    img {
      -webkit-mask-image:-webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(rgba(0,0,0,0)));
      mask-image: linear-gradient(to bottom, rgba(0,0,0,1), rgba(0,0,0,0));
    }
  </style>
  <body>
    <div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi sit amet porttitor massa. Morbi eget tortor congue, aliquet odio a, viverra metus. Ut cursus enim eu felis sollicitudin, vitae eleifend urna lobortis. Mauris elementum erat non facilisis cursus. Fusce sit amet lacus dictum, porta libero sed, euismod tellus. Aenean erat augue, sodales sed gravida ac, imperdiet ac augue. Ut condimentum dictum mauris. Donec tincidunt enim a massa molestie, vel volutpat massa dictum. Donec semper odio vitae adipiscing lacinia.</div>
    <img src='https://i.imgur.com/sLa5gg2.jpg' />
  </body>
</html>


1
是的,但这样做图片就不会透明了,我错了吗?所以如果我有一些文本在#under div后面,我不能通过图像看到它。我之前测试过类似于这样的东西。 - Francesco Belladonna
正确的,图片不会是透明的。如果你在#under后面有文字,它将被覆盖(假设自然堆叠顺序)。你可以使用z-index来解决这个问题。我会在我的答案中发布更新。 - bishop
1
问题在于我需要让文字在图像后面淡出,这是我的主要目的。 - Francesco Belladonna
现在你的答案好多了,是的我也在研究 webkit-mask-image。在 Firefox 上看起来可以使用 mask-image(没有-webkit),但必须使用 SVG 图像,我正在尝试构建一个。 - Francesco Belladonna
如果您想阅读文本,您可以在图像上增加一些不透明度,这样做您不必另加图层。 - Ben Taliadoros
显示剩余2条评论

24

如果您只想将背景颜色(在此例中为白色)渐变为背景颜色,请查看此处的工作示例:

http://jsfiddle.net/yw9v7zm5/

图像容器 div 的 .css 使用:

background: -moz-linear-gradient(top,  rgba(255,255,255,0) 0%, rgba(255,255,255,1) 80%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0)), color-stop(80%,rgba(255,255,255,1)));
background: -webkit-linear-gradient(top,  rgba(255,255,255,0) 0%,rgba(255,255,255,1) 80%);
background: -o-linear-gradient(top,  rgba(255,255,255,0) 0%,rgba(255,255,255,1) 80%);
background: -ms-linear-gradient(top,  rgba(255,255,255,0) 0%,rgba(255,255,255,1) 80%);
background: linear-gradient(to bottom,  rgba(255,255,255,0) 0%,rgba(255,255,255,1) 80%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=0 );

6
这个解决方案在我使用 BrowserStack 进行测试时,已经在所有的 IE/FF/Chrome/Safari 浏览器上都能正常运行! - ZedTuX
1
提问者指定希望内容在淡出效果后仍可见。 - ivanjonas
你可以将这段代码放入另一个容器中,使其背景透明,在该容器中淡出(进入透明背景),从而使其后面的东西可见。 - Nerdi.org
1
Fiddle不再工作,因为缺少图像背景。 - pbarney

18

2021更新: 'mask-image'部分支持。在父元素(.image_preview_container)上设置遮罩图像(在本例中为线性渐变)。在此示例中,子元素(.image_preview)从50%开始逐渐淡出透明度。然后在100%处完全透明。(也可以使用其他长度,如'px')

在火狐浏览器中可以工作。可能在其他浏览器中也可以。到目前为止,这对我有用。如果在您的浏览器中无法正常工作,请发表评论。

CSS:

.image_preview_container {
  mask-image: linear-gradient(to right, rgba(0, 0, 0, 1.0) 50%, transparent 100%);
}
.image_preview {
  background-image: url("IMAGE LOCATION");
}

HTML:

<div class="image_preview_container">
    <div class="image_preview"></div>
</div>
在原问题的背景下: CSS:
.parent{
  mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1.0) 50%, transparent 100%);
}
.child{
  background-image: url("splash_bottom3.png");
}

HTML:

<div class="parent">
    <div class="child"></div>
</div>

https://caniuse.com/css-masks 目前不支持IE或Opera Mini。 - Luke Brown
完美地工作了,谢谢。我不确定它是否支持多个浏览器,但在Chrome上运行良好。对于Safari,我可能需要进行一些研究。苹果总是让一切变得困难。 - 13garth
@LukeBrown,我怀疑一个发布了近十年的浏览器是否能够在没有重要的js shiv的情况下支持这些高级功能,如果可能的话。 - pbarney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接