如何在无背景图片上使用mix-blend-mode且避免方形边框?
解决无背景图片使用mix-blend-mode的方形边框问题
当给透明背景的图片设置mix-blend-mode时,必须添加背景色才能让混合模式生效,但这会导致图片周围出现方形背景边框。以下是两种可行的解决方法:
方法一:使用CSS mask(推荐)
利用mask属性将背景色限制在图片的非透明区域内,完全隐藏方形背景边框:
修改.logo的CSS代码:
.logo { background-color: white; display: block; left: 50%; mix-blend-mode: exclusion; position: fixed; top: 25px; transform: translateX(-50%); width: 100px; z-index: 20; /* 添加mask属性,用图片自身作为遮罩 */ mask: url("https://cdn-icons-png.flaticon.com/512/220/220124.png?w=360") center/contain no-repeat; -webkit-mask: url("https://cdn-icons-png.flaticon.com/512/220/220124.png?w=360") center/contain no-repeat; }
原理:mask会把元素的绘制范围限定在遮罩图片的非透明部分,背景色只会出现在图片内容区域,周围的方形背景被完全隐藏。
方法二:改用background-image + 多层背景叠加
将图片作为元素的背景图,结合多层背景实现混合模式效果,同时避免方形边框:
替换原<img>标签为div:
<div class="logo"></div>
修改对应的CSS代码:
.logo { background: url("https://cdn-icons-png.flaticon.com/512/220/220124.png?w=360") center/contain no-repeat, white; background-blend-mode: normal; mix-blend-mode: exclusion; display: block; left: 50%; position: fixed; top: 25px; transform: translateX(-50%); width: 100px; height: 100px; z-index: 20; }
原理:通过将背景色和图片作为多层背景叠加,mix-blend-mode作用于整个元素的背景组合,同时元素的透明区域不会显示背景色。
完整修改后的代码示例
HTML代码:
<div class="container"> <!-- 使用mask解决的img标签 --> <img class="logo" src="https://cdn-icons-png.flaticon.com/512/220/220124.png?w=360" alt="logo"> <div class="header"></div> <div class="block"></div> <div class="block"></div> <div class="block"></div> <div class="block"></div> <div class="block"></div> <div class="footer"></div> </div>
CSS代码:
.container { position: relative; } .logo { background-color: white; display: block; left: 50%; mix-blend-mode: exclusion; position: fixed; top: 25px; transform: translateX(-50%); width: 100px; z-index: 20; mask: url("https://cdn-icons-png.flaticon.com/512/220/220124.png?w=360") center/contain no-repeat; -webkit-mask: url("https://cdn-icons-png.flaticon.com/512/220/220124.png?w=360") center/contain no-repeat; } .block { background: cornflowerblue; border: solid 2px black; height: 100px; margin: 20px auto; mix-blend-mode: difference; position: relative; width: 75%; z-index: 10; } .header { background: crimson; height: 500px; margin: 0 auto; width: 75%; } .footer { background: lightcoral; height: 500px; margin: 0 auto; width: 75%; }
内容的提问来源于stack exchange,提问作者Alain
相关产品推荐
相关产品推荐

