【问题标题】:How to hack unsupported mix-blend-mode CSS property?如何破解不支持的混合混合模式 CSS 属性?
【发布时间】:2015-09-16 16:22:30
【问题描述】:

我正在编写具有特定悬停效果的图片库。当用户看到图像时,我使用 ::before 伪元素使用 mix-blend-mode CSS 属性在带有图像的 div 上创建“窗帘”:

div.img::after {
    content: "";
    display: block;
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    z-index: 2;
    mix-blend-mode: soft-light;
    background-color: red;
}

产生的效果是这样的:

但不幸的是,IE(以及根据 caniuse 的其他一些)不支持此属性并在图像上显示完整的红色矩形,因此它不可见。

是否可以破解这种混合模式行为,使其像在 Firefox 或 Chrome 中一样?

如果不支持,是否可以隐藏覆盖 div 或将其设置为半透明,当且仅当 mix-blend-mode 不受支持?

谢谢

【问题讨论】:

  • 尝试使用 opacity 属性,如果不起作用,为什么不使用 RGBA?

标签: css internet-explorer


【解决方案1】:

我知道这是一个老问题,但您也可以使用 @supports 功能查询来检测某个属性是否可用。

@supports not (mix-blend-mode: multiply) {
  .image {
    ...
  }
}

如果您有兴趣,可以阅读更多关于功能查询的信息:https://developer.mozilla.org/en-US/docs/Web/CSS/@supports

【讨论】:

  • 主要问题是 ie 11 不支持 @supports 或 mix-blend-mode caniuse.com/#search=supports
  • 既然如此@jopfre,那么您可以简单地将其用作渐进增强。设置后备(不透明度等),然后如果 @supports... 则为增强版本编写代码。
【解决方案2】:

如果您不想使用纯不透明度作为后备:

跨浏览器支持的方法

Javascript 填充 这会很慢,并且不允许您轻松制作动画。但是,它可以让您为每个匹配的图像创建一个备用图像,然后您可以淡化不透明度或在两者之间执行其他 CSS 过渡技巧。

http://codepen.io/brav0/pen/bJDxt(不是我的笔 - 使用倍增,而不是柔光)

服务器端处理 不会是我的首选,但如果您控制服务器端代码,则可以使用服务器端映像库(GD 等)准备备用图像

只开启支持浏览器的效果

用于检测 IE 的 Css hack

@media screen { @media (min-width: 0px) {
    div.img::after{ ... }
} }

使用 JavaScript

if (window.getComputedStyle(document.body).mixBlendMode !== undefined)
    $("div.img").addClass("curtain");

...和 ​​CSS...

img.curtain::after { ... }

【讨论】:

  • 谢谢,特别是那个检查属性支持的 JS 解决方案。我只需要用 mixBlendMode 替换 backgroundBlendMode 并使用不带引号的 undefined
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
相关资源
最近更新 更多