使用CSS cross-fade()实现背景图像半透明效果的示例代码

所属分类: 网页制作 / CSS 阅读数: 598
收藏 0 赞 0 分享

一、需求描述

某元素,希望 background-image 背景图片是半透明的,但是,元素里面的其他内容,例如文字,图标之类的还是不透明。

如果是纯色背景或者是CSS渐变背景,很好处理,使用 rgba 或者 hsla 颜色色值即可。

但是,如果是 url() 背景图像,似乎就无能为力了。

如果是个内联的 <img> 图像那很好处理,无论是filter滤镜、 mask遮罩 还是 opacity 透明度设置都可以实现我们的效果,但是偏偏这里是背景图像,所有前面提到的这些方法都会影响文字的正常显示。

我估计很多人会想到使用 ::before / ::after 伪元素实现,例如:

.box {
   position: relative;
   z-index: 0;
}
.box::before {
   content: '';
   position: absolute;
   left: 0; right: 0; top: 0; bottom: 0;
   background: url(xxx.jpg) no-repeat center / contain;
   z-index: -1;
   opacity: .5;
}

实时效果如下(如果没有效果请访问原文 作者张鑫旭 ):

by-zhangxinxu

但是这个方法太啰嗦,成本太高(创建了大量的层叠上下文、尺寸是不是需要调整),无法大规模使用。

有没有什么好的实现方法呢?

试试使用 cross-fade() 图像函数。

二、cross-fade()实现背景图像半透明

cross-fade() 函数可以让两张图像半透明混合。

例如:

<div class="cross-fade-image"></div>
.cross-fade-image {
    width: 300px; height: 300px;
    background: no-repeat center / contain;
    background-image: -webkit-cross-fade(url(1.jpg), url(2.jpg), 50%);
    background-image: cross-fade(url(1.jpg), url(2.jpg), 50%);   
}

就会有下图所示的效果。

2.jpg 这张图以50%的透明度和 1.jpg 进行了混合渲染。

上面案例使用的是 cross-fade() 函数的传统语法,具体如下:

<dfn id="ltimage-combination">
<image-combination>
</dfn> = cross-fade( <image>, <image>, <percentage> )

其中 <percentage> 指的是透明度,只会改变第2个图像的透明度,最终的效果是第1个图像完全不透明和第2个图像半透明叠加的效果。

关于 cross-fade() 图像函数中的百分比值改变的仅仅是后面一个图像的透明度,我很久以前做过一个demo页面进行过测试,您可以狠狠地点击这里: CSS3 cross-fade属性透明度作用对象测试

示意截图如下:

虽然 cross-fade() 函数设计的初衷是多个图像半透明叠加,但是,这样的场景实际开发很少遇到,因此, cross-fade() 反而更适合控制单个背景图像的半透明效果。

实现原理很简单,第1张图使用透明图片,第2张图使用目标图片就可以了。

举个例子:

某背景图在黑暗模式下太亮了,希望调整下背景图的明暗度,使用 cross-fade() 函数实现就是下面这段CSS代码(宽高设置的CSS略):

.dark {
    /* 兜底,IE和Firefox浏览器 */
    background-image: url(2.jpg);
    --transparent: url(data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==);
    /* Safari最近版本已经不需要私有前缀了 */
    background-image: cross-fade(var(--transparent), url(2.jpg), 40%);
    /* 如使用自定义属性,-webkit-语句需要放在没有私有前缀语句的下面 */
    background-image: -webkit-cross-fade(var(--transparent), url(2.jpg), 40%);

    background-size: cover;
}

效果如下:

是不是很简单,是不是比伪元素实现要靠谱的多,对应的demo访问 这里 。

cross-fade() 本质上就是个 <image> 图像数据类型,和 url() 图像,gradient渐变图像,image-set()函数是一个性质,可以用在 border-image , mask-image 等属性中。

因此,使用 cross-fade() 函数替换 url() 函数实现背景图片的半透明效果决定是成本最低,效果最好的方法。

三、移动端兼容性极佳

cross-fade() 函数webkit浏览器支持的非常早,iOS 5,Android 4.4均支持,只不过需要设置私有前缀,具体如下图所示:

因此,在移动端可以放心使用,至于PC端,不需要考虑IE浏览器的项目也是可以放心使用的,就算需要考虑IE也没毛病,不过就是背景图还是完全不透明而已,视觉体验稍微低了一点而已。

这世界上没有所谓的没有用的CSS属性,只是没有遇到合适的场景而已;就像依然单身的诸位,只是还没有遇到合适的那个他/她而已。

另外, cross-fade() 函数加入CSS规范后有了新的语法,更灵活更强大,但是目前没有任何浏览器支持,因此本文没有做相关介绍。

到此这篇关于使用CSS cross-fade()实现背景图像半透明效果的示例代码的文章就介绍到这了,更多相关CSS cross-fade()背景图像半透明内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

更多精彩内容其他人还在看

Opera中国的WEB标准课程

网页制作Webjx文章简介:在这篇文章里,我要向大家介绍我和其他很多人花费数月时间开发的一个课程——Web标准课程,该课程旨在向大家提供Web设计和开发的坚实基础,无论读者是谁,此教程完全免费、可访问,并且不需要预备知识。当然,我主要还
收藏 0 赞 0 分享

CSS样式表渐进增强的基本概念

网页制作Webjx文章简介:如果你挠着头想弄清楚优雅降级和渐进增强的区别,我告诉你,这是视角问题。优雅降级和渐进增强都考虑网站在各种设备的各种浏览器上如何良好运转。两者区别的关键在于它们各自关注的焦点,以及这种关注对工作流程的影响
收藏 0 赞 0 分享

简单介绍Web Developer插件制作网页

网页制作Webjx文章简介:Firefox浏览器是一个良好支持W3C标准的开放源代码的浏览器,拥有Linux/Windows/Mac版本。因为Firefox浏览器良好支持W3C标准,所以使用Firefox来调试网页是非常好的。 Firefox浏览器是
收藏 0 赞 0 分享

CSS布局带来的巨大影响:CSS display属性值

网页制作Webjx文章简介:网页元素应用上那些与表格相关的display属性值后,能够模仿出与表格相同的特性。我将会在该文中给大家演示这种方法给CSS布局带来的巨大影响。 应原书编辑要求,先在文章顶部给出链接:《Everything You
收藏 0 赞 0 分享

用div css模拟表格对角线

这只是探讨一种CSS模拟表格对角线的用法,实际在工作中可能觉得这样做有点小题大作,这不是本主题讨论的重点。如果对此深以为然的朋友,请一笑过之 首先声明: 这只是探讨一种CSS模拟表格对角线的
收藏 0 赞 0 分享

IE Firefox在css中的差别 (部分)

1、单位问题 问题:任何距离的数值ie可以不加单位,ff必须要求写单位(0除外) 解决:写全单位如padding:0px; 2、水平居中 问题:div里的内容,ie默认为center,而ff默认left 解决:mairgin:0px auto; 3、高度问题
收藏 0 赞 0 分享

不用js可以实现信息提示效果

[code] <style> body { font:verdena; font-size:14px; color:#000 } h1{ font:verdena; font-size:22px; color:#000 } h2{ font:verdena;
收藏 0 赞 0 分享

CSS解决未知高度的垂直水平居中自适应问题

今天有人问起,晚上试着写出来,供参考; 以下代码兼容主流浏览器IE6、IE7、Firefox、Opera。 从最简单的开始………… 一、如何让一个DIV水平居中? 这个简单不作过多说明! [code] <st
收藏 0 赞 0 分享

CSS cursor 属性 -- 鼠标指针样式效果

取值: [ [<uri> ,]* [ auto | crosshair | default | pointer | move | e-resize | ne-resize | nw-resize | n-resize | se-resize | sw-resize |
收藏 0 赞 0 分享

css 简单区别ie6,ie7,firefox的写法

同一样式里可以这样 [code] margin:17px; FF +margin:17px; IE6 IE7 _margin:17px; IE6 [/code] 按这个顺序,刚好区分开三个浏览器
收藏 0 赞 0 分享
查看更多