Page 125 - css揭秘
P. 125

另外一种方法是:在图片的上层覆盖一层半透明的纯色;或者把图片设
                                              置为半透明并覆盖在一层实色背景之上。但这其实并不是真正的染色效果:
                                              不仅没有把图片中的各种颜色转换为目标色调,同时也极大地削弱了图片的
                                              对比度。

                                                  此外还有基于 JavaScript 的方案,把图片置入 <canvas> 元素中,并利
                                              用脚本对其进行染色处理。这确实可以得到真实的染色效果,但性能不佳,
                                              而且限制很多。
                                                  难道就没有一种更简单的、纯 CSS 的方法能实现图片染色效果吗?


                                              基于滤镜的方案


                                                  由于没有一种现成的滤镜是专门为这个效果而设计的,我们需要花一些
                                              心思,把多个滤镜组合起来。

                                                  我们要使用的第一个滤镜是 sepia(),它会给图片增加一种降饱和度的
                                              橙黄色染色效果,几乎所有像素的色相值会被收敛到 35~40(参见图 4-10)。
                                不完全支持
                                              如果这种色调正是我们想要的,那就可以收工了。不过我们的需求通常并
                                              非如此。如果我们想要的主色调的饱和度比这更高,可以用 saturate() 滤
                                              镜来给每个像素提升饱和度。假设我们想要的主色调是                           hsl(335,  100%,
                                              50%),那就需要把饱和度提升一些,于是我们将饱和度参数设置为 4。具体
                                              取值取决于实际情况,我们通常需要用肉眼来观察和判断。如图 4-11 所示,
                                              这两个滤镜的组合会让我们的图片具有一种暖金色的染色效果。

                                                  图片现在看起来很不错,但我们并不希望把图片调为这种橙黄色调,而
                                              是稍深的亮粉色。因此,我们还需要再添加一个 hue-rotate() 滤镜,把每
                                              个像素的色相以指定的度数进行偏移。为了把原有的色相值 40 改变为 335,
                                              我们需要增加大约 295 度(335 – 40):

                                                  filter: sepia(1) saturate(4) hue-rotate(295deg);
                    图 4-10
                    原始图片(上图)和添加了                  此时,我们就把这张图片的色调改变了,效果如图 4-12 所示。如果这
                    sepia() 滤镜之后的图片(下图)
                                              个效果需要由 :hover 或其他状态来触发切换,我们甚至还可以为这个变化
                                              增加过渡动画:


                                                  img {
                                                      transition: .5s filter;
                                                      filter: sepia(1) saturate(4) hue-rotate(295deg);
                                                  }

                                                  img:hover,
                    图 4-11                        img:focus {
                                                      filter: none;
                    图片又添加了 saturate() 滤镜          }







                   94   第 4 章 视觉效果







          ඀ࠡ  JOEC
   120   121   122   123   124   125   126   127   128   129   130