在剪贴蒙版内悬停时从灰度更改为彩色

Posted

技术标签:

【中文标题】在剪贴蒙版内悬停时从灰度更改为彩色【英文标题】:Change from greyscale to color on hover within clipping mask 【发布时间】:2020-12-14 01:29:27 【问题描述】:

我了解如何通过 CSS 和/或 javascript 在悬停时将图像从灰色更改为彩色,但想知道您是否可以使用剪贴蒙版来做同样的事情。

请查看附件图片,显示我想要实现的目标。我见过的其他示例要么转换整个图像,要么转换鼠标指针区域。我希望图像的特定部分或剪切区域在悬停时改变颜色。

group shot showing highlighted colored area

【问题讨论】:

【参考方案1】:

我认为您可以使用 SVG 过滤器 和 CSS。

用矢量工具制作形状并将其转换为base64 对图像应用带有<feColorMatrix> 的滤镜。这可能是模糊、灰度等(有关SVG filters 的更多信息) 设置适当的大小以在背景图像上应用成形滤镜。

这是一个例子:

svg 
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;


image 
  filter: grayscale(1);

image:hover 
  filter: url(#blurlayer2);
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
          <filter id="blurlayer2"  >
            <feColorMatrix
    type="matrix"
   values='0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0' />
            <feGaussianBlur  stdDeviation="0" result="blur"/>
            <feImage id="feimage" xlink:href="data:image/svg+xml;charset=utf-8;base64,PHN2ZyB3aWR0aD0iMTAyNCIgaGVpZ2h0PSIzMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQoNCiA8Zz4NCiAgPHRpdGxlPmJhY2tncm91bmQ8L3RpdGxlPg0KICA8cmVjdCBmaWxsPSJub25lIiBpZD0iY2FudmFzX2JhY2tncm91bmQiIGhlaWdodD0iNDAyIiB3aWR0aD0iNTgyIiB5PSItMSIgeD0iLTEiLz4NCiA8L2c+DQogPGc+DQogIDx0aXRsZT5MYXllciAxPC90aXRsZT4NCiAgPHBhdGggaWQ9InN2Z18zIiBkPSJtNTEwLDMwMGMtMSwwIC01MDgsLTMgLTUwOCwtM2w1MDgsM3oiIGZpbGwtb3BhY2l0eT0ibnVsbCIgc3Ryb2tlLW9wYWNpdHk9Im51bGwiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2U9Im51bGwiIGZpbGw9IiMwMDAiLz4NCiAgPHBhdGggaWQ9InN2Z181IiBkPSJtMTEuOTQ1LDI5Mi40Njc0OWwwLC0yODQuOTk5OTlsMzE0LDI4NC45OTk5OWwtMzE0LDB6IiBmaWxsLW9wYWNpdHk9Im51bGwiIHN0cm9rZS1vcGFjaXR5PSJudWxsIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlPSJudWxsIiBmaWxsPSIjMDAwIi8+DQogIDxwYXRoIGlkPSJzdmdfNiIgZD0ibTIwMS41NSwxNDIuOTIyNWwxNDUuNDk5OTksLTEzNS41bDE0NS40OTk5OSwxMzUuNWwtMTQ1LjQ5OTk5LDEzNS41bC0xNDUuNDk5OTksLTEzNS41eiIgZmlsbC1vcGFjaXR5PSJudWxsIiBzdHJva2Utb3BhY2l0eT0ibnVsbCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZT0ibnVsbCIgZmlsbD0iIzAwMCIvPg0KICA8cGF0aCB0cmFuc2Zvcm09InJvdGF0ZSgtMTgwIDU0Mi45NDUwMDczMjQyMTg4LDE1MC45Njc0OTg3NzkyOTY4OCkgIiBpZD0ic3ZnXzciIGQ9Im0zODUuOTQ1LDI5My40Njc0OWwwLC0yODQuOTk5OTlsMzE0LDI4NC45OTk5OWwtMzE0LDB6IiBmaWxsLW9wYWNpdHk9Im51bGwiIHN0cm9rZS1vcGFjaXR5PSJudWxsIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlPSJudWxsIiBmaWxsPSIjMDAwIi8+DQogIDxwYXRoIGlkPSJzdmdfMiIgZD0ibTcwMC4yMzU2NSwyOTIuNDY3NDlsMCwtMjg0Ljk5OTk5bDMxNCwyODQuOTk5OTlsLTMxNCwweiIgZmlsbC1vcGFjaXR5PSJudWxsIiBzdHJva2Utb3BhY2l0eT0ibnVsbCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZT0ibnVsbCIgZmlsbD0iIzAwMCIvPg0KIDwvZz4NCjwvc3ZnPg==" x="0%" y="0%"   result="imgmask" preserveAspectRatio="none"/>
            
            <feComposite in2="imgmask" in="blur" in3="rect2" operator="in" result="comp" />
            <feMerge result="merge">
              <feMergeNode in="SourceGraphic" />
              <feMergeNode in="comp" />
            </feMerge> 
          </filter>
        </defs>
 <image  x="0"   xlink:href="https://trucoslondres.com/wp-content/uploads/2017/04/people-1.jpg" />
  </svg>
  

【讨论】:

非常感谢您的回答,转Base64的向量肯定解决了使用向量掩码的问题。我希望从灰度图像开始并在悬停时显示颜色。我了解彩色图像上的灰度滤镜。我假设您将从彩色图像开始,对整个图像应用灰度滤镜,然后在悬停时以某种方式在矢量形状内反转它?

以上是关于在剪贴蒙版内悬停时从灰度更改为彩色的主要内容,如果未能解决你的问题,请参考以下文章

JQuery灰度图像在悬停时变为彩色

将精灵从灰度着色为彩色

带有CSS的图像灰度和鼠标悬停时重新着色?

灰度于RGB彩色

在彩色图像上使用精明

在图像悬停时以圆形设置背景大小