《 CSS Secrets 》是 @Lea Verou 最新著作,这本书讲解了有关于CSS中一些小秘密。是一本CSSer值得一读的一本书,经过一段时间的阅读,我、@南北和@彦子一起将在W3cplus发布一系列相关的读后感,与大家一起分享。
在上一节的“通过调节亮度去强调”中 ,我们看到了通过调节亮度来让Web APP上的一些部分de-emphasize的方法,使用了一个半透明的黑色覆盖层。但是,当页面上有很多东西的时候,我们需要调暗很多,才可以为其上的文本提供足够的对比度,或是把用户的注意力转移到突出显示的盒子上或其它元素上边。还有一种更优雅的方式,如下图所示,是除了调光之外(或者直接不要调光)还把其它的所有东西都模糊。这看起来更真实,因为它模仿了我们看对象的视觉创建了一个深度,也就是当我们专心看物理上离我们近的东西时的视线。
游戏网站 polygon.com 提供了一个非常棒的示例,通过模糊对话框后面的所有东西,把用户的注意力集中到对话框上。
但是,这个效果要实现的话却不是那么容易。在 滤镜效果 出现之前,这几乎是不可能实现的,即使是有 blur() 滤镜,要实现起来也很困难。我们要怎么应用模糊滤镜呢,如果我们想要把它应用到除了某个元素之外的所有东西上呢?如果我们把它应用给
元素,页面上的所有东西都会被模糊,包括我们希望吸引用户注意力的元素。这和我们在第四章第四节中碰到的问题非常相似,但在这里我们不能应用相同的解决方案,因为所有东西都在我们的对话框后边,而不仅仅是一个背景图片。我们怎么做呢? 我们需要额外的HTML元素来完成这个效果:我们需要把我们页面上的所有东西包裹在一个元素中,除了那个我们不想要让它变模糊的元素,这样我们才可以对它应用模糊。
<main>Bacon Ipsum dolor sit amet…</main><dialog> O HAI, I’m a dialog. Click on me to dismiss.</dialog><!-- any other dialogs go here too -->
我们假设所有的
你可以在上图中看到它的最终效果。然后,在我们每次想要让对话框出现,并给它们应用模糊滤镜的时候,我们需要给
main.de-emphasized { filter: blur(5px);}
如下图所示,这已经是一个很大的进步了。
但是,现在模糊应用得非常快,看起来有些不自然,感觉是比较尴尬的用户体验。因为CSS滤镜可以应用动画效果,我们可以在模糊页面时应用一个平滑的过渡:
main { transition: .6s filter;}main.de-emphasized { filter: blur(5px);}
把这两种de-emphasizing效果(调光和模糊)结合起来使用是一个不错的主意。一种方法是使用 brightness() 和/或 contrast() 滤镜:
main.de-emphasized { filter: blur(3px) contrast(.8) brightness(.8);}
你可以在下图看到结果。
通过CSS滤镜调光意味着,如果它们不被支持的话,没有降级。所以通过其它方法来实现调光效果可能会更好,也可以把它作为一个降级(如,我们在上一节中看到的 box-shadow 方法)。这还可以帮我们解决光圈效应的问题,如上图的边缘。在下图中我们使用了一个阴影用于调光,这个问题就解决了。