后退背景模态框

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200美元免费信用额度!

你们都知道 Hakim El Hattab 吧?他在 他的博客 上创建了一些非常酷炫的渐进式演示。他的 CodePen 个人资料 也充满了惊人的作品。

他最近的作品之一是 Avgrund。这是一种用于对话框的设计模式,其中主页面逐渐淡出,模态框从上方(或下方)飞入。主页面变小并变得模糊,使其看起来更远,类似于摄影中的 景深。模态框位于顶部,使其看起来更靠近您,并清晰地要求您关注。这是好事,因为 模态框 的目的就是要求用户在进行其他操作之前提供一些输入。

avgrund

当你看到并使用它时,感觉非常神奇。有点想右键单击看看它是否是 Flash。但它不是,就像网络上许多东西一样,当你开始深入挖掘时,神奇之处仅仅是简单效果的巧妙组合。

让我们按顺序看看它们。注意: 这并不完全是 Avgrund 的工作原理,这只是我反向工程的结果。

步骤 1) 分离页面标记和模态标记

整个页面上的所有内容都应包含在一个包装器 div 中。模态位于该包装器之外。

<body>

  <div id="page-wrap">
    <!-- all page content -->
  </div>

  <div id="modal">
    <!-- modal box content -->
  </div>

</body>

标记如何到达那里取决于您。如果我在实际使用它,我可能会在需要时通过我专门为处理对话框创建的 JavaScript 代码动态注入它。

步骤 2) 基于状态的 CSS

无需使用过于复杂的 JavaScript。如果我们考虑“基于状态”,我们只需要在 body 元素上添加一个类名,然后就可以根据需要使用该类调整所有视觉设计。这是一个更大的概念,在很多方面都很有用,值得进一步讨论(例如如何/在哪里/为什么要触发状态),但在这里让我们只使用一些 jQuery 来保持简单。

// Something happens
$("button").on("click", function() {

  // State changes
  $("body").toggleClass("dialogIsOpen");

});

步骤 3) 模态的默认状态

模态将是一个固定位置的框,位于屏幕的正中间。默认情况下,它将隐藏(不透明度为零)且不可点击(pointer-events)。让我们先忽略浏览器对它的支持。如果这对你来说很重要,你可以用很多其他方法隐藏它,比如将其定位到屏幕外。

#modal {
  background: white;

  position: fixed;
  width: 50%;
  top: 50%;
  left: 50%;
  margin: -25% 0 0 -25%;

  /* Embiggen */
  transform: scale(1.5); /* prefix me */

  /* Hidden */
  opacity: 0;
  pointer-events: none;
}

步骤 4) 活动模态状态(神奇之处!)

现在我们拥有了使页面在模态打开时“后退”所需的一切。让我们在状态处于活动状态时定位 #page-wrap 并执行魔法。

神奇之处在于: 通过变换缩放 #page-wrap 使其变小,并过滤 #page-wrap 使其模糊且色彩减少。

.dialogIsOpen #page-wrap {

  /* Blur and de-color */
  -webkit-filter: blur(5px) grayscale(50%);

  /* Recede */
  -webkit-transform: scale(0.9);

}

仅限 WebKit?嗯……过滤器目前仅在 WebKit 中可用。您可以选择是否加载供应商前缀。如果我要在网站上实际使用它,我会花一些时间确保此效果有备用方案,这应该不难。也许只是强调一下 box-shadow 就行了。

然后: 使对话框从上方出现,强制执行景深效果。不透明度使其出现;变换缩放使其从上方出现。

.dialogIsOpen #modal {
  
  /* Regular size and visible */
  transform: scale(1); /* prefix me */
  opacity: 1;

  /* Clickable */
  pointer-events: auto;

}

步骤 5) 过渡

为了使其感觉自然和神奇,在两个参与者身上都添加一些过渡。

#page-wrap, #modal {
  
  transition: all 0.4s ease; /* prefix me */

}

当然,Sass/Compass 使所有这些都变得更容易,因为它对所有这些东西都有 @mixins。例如:

@include transition(all 0.4s ease);
@include filter(blur(5px) grayscale(50%));
@include transform(scale(0.9));

公平警告,这些东西相当占用内存/处理能力。有时,像触发 3D 变换这样的少量技巧可以帮助 WebKit,但存在 文本外观难看 的风险。

body {
  /* Use at your own discretion */
  -webkit-transform: translateZ(0);
}

总结

如果您无法访问支持的浏览器或其他任何内容,请观看视频

我将本文中反向工程的演示 发布在 CodePen 上,但您确实应该去看看 Hakim 的演示,它也 发布在 CodePen 上