对于一个投资组合网站,我正在用普通的HTML,CSS和JS与jQuery,我想有一个图像列表与我的小组中的每个人的头像. 然而,我想实现一种效果,通常情况下,化身图像会被它的纯色轮廓所取代(图1),然后当你将鼠标悬停在图像上时,它会淡出到原来的 colored颜色 (图2).

image 1: Avatar Image when not hovering in solid color (solid color silouhette)


image 2: Avatar Image when hovering (original image)


到目前为止,我已经通过将两张图像叠加在一起来实现了这个效果.上面的是彩色的剪影,下面的是原始图像.然后简单地使用css中的:hover Select 器来淡出顶部的图像,并显示下面的图像.

<div class="mb-player">
    <img src="../Assets/Players/Test/Test_color.png" class="mb-player-color">
    <img src="../Assets/Players/Test/Test_normal.png">
</div>
.mb-player {
    position: relative;
    height: 300px;
    width: fit-content;
}

.mb-player img {
    object-fit: cover;
    height: 300px;
}

.mb-player-color {
    z-index: 1;
    transition: 0.3s;
    position: absolute;
    top: 0;
    left: 0; 
}

.mb-player:hover .mb-player-color{
    opacity: 0;
    transition: 0.1s;
}

然而,这意味着对于我添加的每个头像,我需要有2张图片,这意味着我最终将使用大量内存,并可能降低低端设备的性能.

因此,我想知道是否有其他解决方案可以使用代码来更改原始图像,并将其转换为自身的纯色版本(如图1所示). 我试过使用css滤色器,但它们只应用了轻微的 colored颜色 变化,并没有像我想要的那样产生纯色效果.

推荐答案

this answer中获得灵感,就有可能变得非常接近.

要应用的第一个滤镜是contrast(0),它会将图像拼合为纯灰色.然后你可以用sepia(100%)添加一些 colored颜色 (不饱和的黄褐色).您的下一个过滤器将是saturate(1000%),以将饱和度提高到接近完全饱和度的值.最后,您添加hue-rotate(320deg),以使 colored颜色 轮周围的大部分 colored颜色 从黄色变为红色.

你可以try saturate()brightness()hue-rotate()的组合来找到你喜欢的 colored颜色 .不过,我不知道实现特定 colored颜色 的方法,所以这是一个反复试验的过程,尽管this answer中提到的生成器可能会有所帮助,或者this question中其他答案中包含的建议.

img {
  width: 100px;
}

img:nth-child(1) {
  filter: contrast(0);
}

img:nth-child(2) {
  filter: contrast(0) sepia(100%);
}

img:nth-child(3) {
  filter: contrast(0) sepia(100%) saturate(1000%);
}

img:nth-child(4) {
  filter: contrast(0) sepia(100%) saturate(1000%) hue-rotate(320deg);
}

img:hover {
  filter: none;
}
<img src="https://i.stack.imgur.com/zhNE1.png">
<img src="https://i.stack.imgur.com/zhNE1.png">
<img src="https://i.stack.imgur.com/zhNE1.png">
<img src="https://i.stack.imgur.com/zhNE1.png">

Javascript相关问答推荐

如何使用JavaScript动态地将CSS应用于ToDo列表?

Flisk和JS错误:未捕获的Syntax错误:意外的令牌'<'

单击更新页面的按钮后,页面刷新;测试/断言超时,有两个标题,但没有一个标题

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

Mongoose post hook在使用await保存时不返回Postman响应

在grafana情节,避免冲突的情节和传说

setcallback是什么时候放到macrotask队列上的?

IF语句的计算结果与实际情况相反

如何在Svelte中从一个codec函数中调用error()?

在画布中调整边上反弹框的大小失败

向数组中的对象添加键而不改变原始变量

Reaction-SWR-无更新组件

在验证和提交表单后使用useNavigate()进行react 重定向,使用带有加载器和操作的路由

当我点击一个按钮后按回车键时,如何阻止它再次被点击

我正在试着做一个TicTacToe Ai来和我玩.但是,我试着在第一个方块被点击时出现一个X,然后在第二个方块之后出现一个O

用于测试其方法和构造函数的导出/导入类

在JavaScript中将Base64转换为JSON

使用Library chart.js在一个带有两个y轴的图表中绘制两个数据集

无法在Adyen自定义卡安全字段创建中使用自定义占位符

相对于具有选定类的不同SVG组放置自定义工具提示