热搜:前端 nest neovim nvim

CSS的两种图片的上色方案

lxf2023-05-20 01:51:24

开启编程成长之旅!这是我参与「编程 · 12 月更文挑战」的第4天,点击查看活动详情

在平时的工作需求中,我们经常会遇到要给图片上色的需求,比如一个褪色的头像,鼠标放在上上面之后恢复其原本的颜色,当然最笨的方法是准备两个图片分别显示,但可能会遇到网络问题导致功能无法实现,或是使用万能的canvas,但是性能上又可能存在问题,实际上,使用CSS就可以解决这个需求,而且可以选用两种不同的方案。

距离来说,我们需要解决这样一个需求,这是一张平平无奇的妹子图:

CSS的两种图片的上色方案

而我们要将其风格化成老照片的风格,这时候,我们可以选择采用滤镜的方式:

filter: sepia(1) saturate(4);

这里选用的是两个滤镜的组合,sepia可以降低整个画面的饱和度实际上就是对整个画面的色相进行收敛,saturate则是用来提升画面中主色调的饱和度,经过前一个步骤去色之后,saturate会让画面呈现金黄色的感觉:

CSS的两种图片的上色方案

关于sepia和saturate的更多内容可以查阅MDN

第二种发难则是采用混合模式,对你没有听错,这个经常出现在PhotoShop中,各个图层之间层叠方式的功能,的确也可以在CSS中实现,要对一个元素设置混合模式,有两个属性可以派上用场:mix-blend-mode 可以为整个元素设置混合模式,background-blend-mode可以为每层背景单独指定混合模式,但是这两种方式各有缺点:

  • 使用mix-blend-mode:需要把图片包裹在一个容器中,并把容器的背景色设
    置为我们想要的主色调,这会多出一个DOM元素,性能上可能有影响,而且两个属性要在两个元素上分别设置,可读性很差
  • 使用background-blend-mode:不用图片元素,而是用一个<div>把这个元素的
    第一层背景设置为要染色的图片,并把第二层的背景设置为我们想要的主色调。这种方式的确不会多出一个DOM元素,但是采用背景的方式来展现图片,就只能把图片的大小写死,而且在SEO方面会存在不少问题

我们以第一种方式为例:

<div style="background:#9f9400;display:inline-block;">
  <img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/462e4a6f03fe48c08f771935a77cad6d~tplv-k3u1fbpfcp-watermark.image?"/>
</div>
img {
  mix-blend-mode: luminosity;
}

在两个不同的DOM上,一个设置背景颜色,一个设置混合模式,呈现出了这样的效果:

CSS的两种图片的上色方案

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!