【问题标题】:Background blend mode on PNG imagesPNG图像上的背景混合模式
【发布时间】:2018-04-22 04:50:06
【问题描述】:

长话短说,我希望我的(任何)图像在悬停时改变颜色,但我无法让它在 PNG 图像上正常工作。问题在于透明度。我不想在透明空间上应用我的颜色。我的 CSS 如下所示:

background-blend-mode: color-burn;
background-color: #edeb52;

这是完整的jsFiddle example。我只想去掉图标周围的那种颜色,它应该是透明的。

【问题讨论】:

    标签: css


    【解决方案1】:

    晚会 6 个月,但您可以使用 mask-image CSS property。它的实验性但得到相当好的支持:

    .maskedimage {
      display: inline-block;
      width: 200px;
      height: 200px;
      background-image: url("https://gameartpartners.com/wp-content/uploads/edd/2015/06/goblin_featured.png");
      background-size: cover;
      -webkit-mask-image: url("https://gameartpartners.com/wp-content/uploads/edd/2015/06/goblin_featured.png");
      -webkit-mask-mode: alpha;
      -webkit-mask-size: cover;
      mask-image: url("https://gameartpartners.com/wp-content/uploads/edd/2015/06/goblin_featured.png");
      mask-mode: alpha;
      mask-size: cover;
    }
    
    .maskedimage.blue {
      background-blend-mode: luminosity;
      background-color: blue;
    }
    
    .maskedimage.red {
      background-blend-mode: luminosity;
      background-color: red;
    }
    
    .maskedimage:hover {
      background-blend-mode: multiply;
      background-color: red;
    }
    <div class="maskedimage original"></div>
    <div class="maskedimage blue"></div>
    <div class="maskedimage red"></div>

    您也可以使用css filters 获得类似的效果:

    .filteredimage {
      display: inline-block;
      width: 200px;
      height: 200px;
      background-image: url("https://gameartpartners.com/wp-content/uploads/edd/2015/06/goblin_featured.png");
      background-size: cover;
    }
    
    .filteredimage.blue {
      filter: sepia(1) hue-rotate(170deg) brightness(45%) saturate(1000%);
    }
    
    .filteredimage.red {
      filter: sepia(1) hue-rotate(313deg) brightness(45%) saturate(1000%);
    }
    
    .filteredimage:hover {
      filter: sepia(1) hue-rotate(313deg) brightness(25%) saturate(1000%);
    }
    <div class="filteredimage original"></div>
    <div class="filteredimage blue"></div>
    <div class="filteredimage red"></div>

    您的里程可能会有所不同。

    【讨论】:

    • 好吧,好吧,好吧。看起来很酷,也可以在 Firefox 中工作。我认为我们对这个问题做了其他解决方案,所以我不再需要解决这个问题,但它肯定会在未来有所帮助。谢谢。
    【解决方案2】:

    这可以用 css 完成,但不幸的是浏览器支持很差(可能只有 webkit)。

    https://jsfiddle.net/devefrontend/fowzemd2/2/

    .image .img {-webkit-mask-box-image:'YOURIMAGEURL';}
    

    这可能和你是同一个问题:

    Is there any way to colorize a white PNG image with CSS only?

    【讨论】:

    • 很多浏览器不兼容doc
    • 你也可以在 svg 的帮助下让它在 FireFox 中工作。 jsfiddle.net/uw1mu81k/4
    • 这看起来不错,但浏览器支持不好。看来我需要寻找另一种解决方案。肯定会尝试使用该 SVG 过滤器。
    【解决方案3】:

    这是一个例子

    你可以学到更多 https://www.w3schools.com/howto/howto_css_image_overlay.asp

    .container {
        position: relative;
        width: 50%;
    }
    
    .image {
      opacity: 1;
      display: block;
      width: 100%;
      height: auto;
      transition: .5s ease;
      backface-visibility: hidden;
    }
    
    .middle {
      transition: .5s ease;
      opacity: 0;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      -ms-transform: translate(-50%, -50%)
    }
    
    .container:hover .image {
      opacity: 0.3;
    }
    
    .container:hover .middle {
      opacity: 1;
    }
    
    .text {
    
      color: white;
      font-size: 16px;
    width:400px; height:350px;
    }
    <div class="container">
      <img src="http://www.kaptest.co.uk/sites/kaptest.co.uk/files/pictures/icon-lightbulb-grey.png" alt="Avatar" class="image" style="width:100%">
      <div class="middle"  ">
        <div class="text">example</div>
      </div>
    </div>

    【讨论】:

    • 谢谢,但这只是不透明度的变化。我必须更改图像颜色,类似于 Photoshop 的颜色叠加过滤器。
    【解决方案4】:

    试试这样。看看有没有帮助。我在这里使用了filter 属性。

    .image {
      display: inline-block;
    
      
    }
    .image .img {
      width: 375px;
      height: 360px;
      background-image: url('http://www.kaptest.co.uk/sites/kaptest.co.uk/files/pictures/icon-lightbulb-grey.png');
      background-size: cover;
    
    -webkit-filter: opacity(.5) drop-shadow(0 0 0 yellow);
      filter: opacity(.5) drop-shadow(0 0 0 yellow);
    }
    <div class="image">
      <div class="img"></div>
    </div>

    【讨论】:

    • 谢谢,但这并不是我所需要的。它必须将颜色更改为精确的颜色。您的示例不适用于彩色图像。
    【解决方案5】:

    必须是PNG吗?最好您可以使用内联 svg。这样,您不仅可以通过 css 应用您选择的fill 颜色,还可以获得基于矢量图形的所有好处:在任何大小和较小的文件上都很脆(一定要使用svgo 进行优化)

    【讨论】:

    • 不幸的是,这些图像是客户的图像,应该在悬停时改变颜色,所以它可以是 PNG、JPG 或 GIF。不知道他们会上传什么:)
    • 好吧,这很不幸。您可以使用 php 进行服务器端图像处理吗?未经测试,但像 grafika 这样的库可能会工作。如果您有预算,您还可以通过 CDN 提供您的图像。 cloudinary 或 imgix 等服务还通过参数提供动态图像处理。
    • 我使用 PHP 作为后端,但最好只使用前端。我会考虑更好的悬停效果。
    猜你喜欢
    • 2019-08-03
    • 2020-07-13
    • 1970-01-01
    • 2011-07-23
    • 2021-07-25
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多