CSS秘密花园: 通过模糊来De-emphasize(去强调)
JaclynSargo
9年前
<p>《 <a href="/misc/goto?guid=4958976660757929944" rel="nofollow,noindex">CSS Secrets</a> 》是 <a href="/misc/goto?guid=4958976660849001117" rel="nofollow,noindex">@Lea Verou</a> 最新著作,这本书讲解了有关于CSS中一些小秘密。是一本CSSer值得一读的一本书,经过一段时间的阅读,我、@南北和@彦子一起将在W3cplus发布一系列相关的读后感,与大家一起分享。</p> <p><img src="https://simg.open-open.com/show/b873adc9c0b700ab68ae0efe9cf398be.jpg"></p> <p><a href="/misc/goto?guid=4959670152088440266" rel="nofollow,noindex">在上一节的“通过调节亮度去强调”中</a> ,我们看到了通过调节亮度来让Web APP上的一些部分de-emphasize的方法,使用了一个半透明的黑色覆盖层。但是,当页面上有很多东西的时候,我们需要调暗很多,才可以为其上的文本提供足够的对比度,或是把用户的注意力转移到突出显示的盒子上或其它元素上边。还有一种更优雅的方式,如下图所示,是除了调光之外(或者直接不要调光)还把其它的所有东西都模糊。这看起来更真实,因为它模仿了我们看对象的视觉创建了一个深度,也就是当我们专心看物理上离我们近的东西时的视线。</p> <p><img src="https://simg.open-open.com/show/6835721824c93a411eabdd625db86c30.png"></p> <p>游戏网站 <a href="/misc/goto?guid=4958839392527398208" rel="nofollow,noindex">polygon.com</a> 提供了一个非常棒的示例,通过模糊对话框后面的所有东西,把用户的注意力集中到对话框上。</p> <p>但是,这个效果要实现的话却不是那么容易。在 <a href="/misc/goto?guid=4959670152197941684" rel="nofollow,noindex">滤镜效果</a> 出现之前,这几乎是不可能实现的,即使是有 blur() 滤镜,要实现起来也很困难。我们要怎么应用模糊滤镜呢,如果我们想要把它应用到除了某个元素之外的所有东西上呢?如果我们把它应用给 <body> 元素,页面上的所有东西都会被模糊,包括我们希望吸引用户注意力的元素。这和我们在第四章第四节中碰到的问题非常相似,但在这里我们不能应用相同的解决方案,因为所有东西都在我们的对话框后边,而不仅仅是一个背景图片。我们怎么做呢?</p> <h2>解决方案</h2> <p>我们需要额外的HTML元素来完成这个效果:我们需要把我们页面上的所有东西包裹在一个元素中,除了那个我们不想要让它变模糊的元素,这样我们才可以对它应用模糊。 <main> 元素非常适合,因为:它不仅可以包裹页面的主要内容(对话框通常不是主要内容),还可以让我们同我们想要的样式挂钩。HTML标签如下:</p> <pre> <code class="language-css"><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 --> </code></pre> <p>我们假设所有的 <dialog> 元素都是初始情况下隐藏的,任何时候都是最多只有一个可见。</p> <p><img src="https://simg.open-open.com/show/77ea267575bd98fea94f180be6d85b68.png"></p> <p>你可以在上图中看到它的最终效果。然后,在我们每次想要让对话框出现,并给它们应用模糊滤镜的时候,我们需要给 <main> 元素应用一个类,如下:</p> <pre> <code class="language-css">main.de-emphasized { filter: blur(5px); } </code></pre> <p>如下图所示,这已经是一个很大的进步了。</p> <p><img src="https://simg.open-open.com/show/41313f8a1e533c1213c6d506cf06a54a.png"></p> <p>但是,现在模糊应用得非常快,看起来有些不自然,感觉是比较尴尬的用户体验。因为CSS滤镜可以应用动画效果,我们可以在模糊页面时应用一个平滑的过渡:</p> <pre> <code class="language-css">main { transition: .6s filter; } main.de-emphasized { filter: blur(5px); } </code></pre> <p>把这两种de-emphasizing效果(调光和模糊)结合起来使用是一个不错的主意。一种方法是使用 brightness() 和/或 contrast() 滤镜:</p> <pre> <code class="language-css">main.de-emphasized { filter: blur(3px) contrast(.8) brightness(.8); } </code></pre> <p>你可以在下图看到结果。</p> <p><img src="https://simg.open-open.com/show/18b843dc9939c7d95c45792c5796f3d2.png"></p> <p>通过CSS滤镜调光意味着,如果它们不被支持的话,没有降级。所以通过其它方法来实现调光效果可能会更好,也可以把它作为一个降级(如,我们在上一节中看到的 box-shadow 方法)。这还可以帮我们解决光圈效应的问题,如上图的边缘。在下图中我们使用了一个阴影用于调光,这个问题就解决了。</p> <p><img src="https://simg.open-open.com/show/3808bbe95f6045b9f145f74bcac7c030.png"></p> <p>来自: <a href="/misc/goto?guid=4959670152278897841" rel="nofollow">http://www.w3cplus.com/css3/css-secrets/de-emphasize-by-blurring.html</a></p>