角度材料设计中的纸叠(css3)

Posted

技术标签:

【中文标题】角度材料设计中的纸叠(css3)【英文标题】:paper stack (css3) in angular material design 【发布时间】:2015-07-05 09:43:59 【问题描述】:

我正在使用 Angular Material Design,我正在尝试创建纸叠效果,如下面的 codepen 链接所示:

Paper Stack using CSS3

它工作正常,但是在我添加 Angular Material Design CSS 的那一刻,它坏了(没有更多的纸叠 UI)你能帮我解决这个问题吗,下面是添加了 Material Design CSS 的链接。

Same Paper Stack code + Material Design CSS

<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/0.8.3/angular-material.min.css">
<div class="letter">
  <p>Dear Friends,</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent euismod porta tempor. Donec pulvinar turpis nec velit pellentesque quis rhoncus sapien facilisis. Mauris quis massa dui, rhoncus viverra quam. Nulla tempus, augue ut consectetur facilisis, arcu elit pellentesque arcu, sed rutrum orci turpis pulvinar augue. Donec eget arcu mauris. Vestibulum tristique consequat lacus eget laoreet. Integer sed nisl sed nibh pulvinar ornare quis nec quam. Aenean rhoncus ligula ut lectus placerat a commodo quam vulputate. In eu metus turpis.</p>

</div>

<!-- Angular Material Dependencies -->
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-animate.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-aria.min.js"></script>

    <script src="https://ajax.googleapis.com/ajax/libs/angular_material/0.8.3/angular-material.min.js"></script>

【问题讨论】:

您是否包含了所需的前缀? (用于转换等)在您的笔中注明他们使用了无前缀。 感谢您的回复,请多指教 - 请您详细说明一下。 在链接的笔中,他们选择了“无前缀”选项。为了让它在您的实际项目中工作,您需要添加任何“缺失”的前缀,以便它可以跨浏览器工作。 (例如,transform property 需要多个前缀。) 但是在没有材料设计 css 的情况下,相同的代码在第一笔中是否可以正常工作? 【参考方案1】:

问题似乎是 angular-material CSS 包含 html 正文的background: #fff。这与 CSS 中 .letter:before, .letter:after 中使用的 z-index: -1 结合使用以在字母下方显示纸叠是导致纸叠不显示的原因,因为它是在正文下方呈现的。

解决方案 1: 如果您在自己的 CSS 中为 body 元素包含 background: none !important;,您可以再次看到纸叠(注意使用 !important,因为 angular-material CSS 是在您自己的之后加载的)。

body 
  background: none !important;
  font: 14px sans-serif;
  padding: 20px;

body 
  background: none !important;
  font: 14px sans-serif;
  padding: 20px;

.letter 
  background: #fff;
  box-shadow: 0 0 10px rgba(0,0,0,0.3);
  margin: 26px auto 0;
  max-width: 550px;
  minheight: 300px;
  padding: 24px;
  position: relative;
  width: 80%;

.letter:before, .letter:after 
  content: "";
  height: 98%;
  position: absolute;
  width: 100%;
  z-index: -1;

.letter:before 
  background: #fafafa;
  box-shadow: 0 0 8px rgba(0,0,0,0.2);
  left: -5px;
  top: 4px;
  transform: rotate(-2.5deg);

.letter:after 
  background: #f6f6f6;
  box-shadow: 0 0 3px rgba(0,0,0,0.2);
  right: -3px;
  top: 1px;
  transform: rotate(1.4deg);
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/0.8.3/angular-material.min.css">
<div class="letter">
  <p>Dear Friends,</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent euismod porta tempor. Donec pulvinar turpis nec velit pellentesque quis rhoncus sapien facilisis. Mauris quis massa dui, rhoncus viverra quam. Nulla tempus, augue ut consectetur facilisis, arcu elit pellentesque arcu, sed rutrum orci turpis pulvinar augue. Donec eget arcu mauris. Vestibulum tristique consequat lacus eget laoreet. Integer sed nisl sed nibh pulvinar ornare quis nec quam. Aenean rhoncus ligula ut lectus placerat a commodo quam vulputate. In eu metus turpis.</p>
 
</div>

<!-- Angular Material Dependencies -->
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-animate.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-aria.min.js"></script>

    <script src="https://ajax.googleapis.com/ajax/libs/angular_material/0.8.3/angular-material.min.js"></script>

解决方案 2: 您可以调整.letterz-index(这也将调整.letter:before.letter:after 的z-index)以使所有内容都显示在主体背景之上。即使是 1 的 z-index 也可以解决问题。

.letter 
  z-index: 1;
 

不幸的是,在这种情况下,.letter:before.letter:after 将呈现在 .letter 之上,因此看起来你的堆栈顶部纸张有点弯曲。您可以通过参考规范in this question 的相关部分找到关于为什么会发生这种情况的解释。但是,如果您选择此解决方案,您始终可以通过对各种元素的旋转和位置进行一些操作来使堆栈显示为您想要的方式

.letter 
  z-index: 1;
  transform: rotate(1.4deg);

.letter p 
  transform: rotate(-1.4deg);

.letter:before 
  transform: rotate(-3.9deg);

.letter:after 
  transform: rotate(-1.4deg);

body 
  background: #888;
  font: 14px sans-serif;
  padding: 20px;

.letter 
  background: #f6f6f6;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
  margin: 26px auto 0;
  max-width: 550px;
  minheight: 300px;
  padding: 24px;
  position: relative;
  width: 80%;
  z-index: 1;
  transform: rotate(1.4deg);

.letter p 
  transform: rotate(-1.4deg);

.letter:before,
.letter:after 
  content: "";
  height: 98%;
  position: absolute;
  width: 100%;
  z-index: -1;

.letter:before 
  background: #fafafa;
  box-shadow: 0 0 8px rgba(0, 0, 0, 0.2);
  left: -5px;
  top: 4px;
  transform: rotate(-3.9deg);

.letter:after 
  background: #fafafa;
  box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
  right: 3px;
  top: 1px;
  transform: rotate(-1.4deg);
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/0.8.3/angular-material.min.css">
<div class="letter">
  <p>Dear Friends,</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent euismod porta tempor. Donec pulvinar turpis nec velit pellentesque quis rhoncus sapien facilisis. Mauris quis massa dui, rhoncus viverra quam. Nulla tempus, augue ut consectetur facilisis,
    arcu elit pellentesque arcu, sed rutrum orci turpis pulvinar augue. Donec eget arcu mauris. Vestibulum tristique consequat lacus eget laoreet. Integer sed nisl sed nibh pulvinar ornare quis nec quam. Aenean rhoncus ligula ut lectus placerat a commodo
    quam vulputate. In eu metus turpis.</p>

</div>

<!-- Angular Material Dependencies -->
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-animate.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-aria.min.js"></script>

<script src="https://ajax.googleapis.com/ajax/libs/angular_material/0.8.3/angular-material.min.js"></script>

【讨论】:

感谢您的回复。能否请您更新代码。我试着给出背景:无!重要;但随后您也需要对父元素执行此操作 - 依此类推。如果我们将 z-index 更改为 1,则论文会变得混乱,文本会移到底部 - 请检查 @user237865 我已经用代码 sn-ps 更新了我的答案,您可以在其中看到两个建议的解决方案。【参考方案2】:

Christina 走在正确的轨道上,但 beforeafter 是非常挑剔的 css3 行为。

不幸的是,设置

.letter 
z-index:1

将导致beforeafter 继承,并且当它们您的主div 之后呈现时,它们将在上面分层。偶数设置

.letter:before, .letter:after 
 z-index: -1 !important;

不会解决这个问题。

同样,设置

body 
 background: none !important;

不会被继承。

不完善的解决方案

1) 使主体透明:

body 
 background: transparent !important;

CodePen

这有一个缺点,就是你没有背景颜色。

为 div 和 p 子级设置 z-index

.letter 
    z-index: 1;

.letter div 
  z-index: 2;

.letter p 
  z-index: 3;

CodePen

这样做的缺点是使after 元素位于顶部,并且看起来您的主论文略微交叉。

【讨论】:

谢谢戴夫。我认为您的第二个解决方案现在会很好(尽管我们不需要 .letter div : z-index: 2)。将玩弄修复主纸直...【参考方案3】:

问题的根源在于字母上的伪元素必须具有负的z-index才能字母本身之下。

但是字母不能有明确的 z-index,因为这会限制负 z-index 的有效性。如果没有这个 z-index,那么伪元素不仅会在 letter 下,还会在 letter 的祖先(在本例中为 body)下。

我认为处理这个问题的最简单方法是让 letter 成为一个单独的堆叠上下文。

例如,一种可能性是设置一个变换

.letter 
    transform: translateZ(0px);

codepen

stacking context reference

【讨论】:

以上是关于角度材料设计中的纸叠(css3)的主要内容,如果未能解决你的问题,请参考以下文章

带有打字稿的角度材料设计

角度材料设计动画

如何自定义角度材料日期选择器?

如何在角度材料中使用输入类型文件

角度材料 MatButtonToggle 中的中心文本

如何为角度材料中的特定断点编写css