CSS动画,仅在特定元素上渲染叠加 [英] CSS animation, only render overlay on specific elements

查看:31
本文介绍了CSS动画,仅在特定元素上渲染叠加的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经制作了此加载占位符CSS动画.在白色背景上,它看起来是正确的,因为动画/运动渐变是白色的,不透明度为20%.

I have made this loading placeholder css animation. And on white bacground it looks correct because the animated/moving gradient is white with 20% opacity.

但是,有时占位符将位于不同颜色的背景上,并且移动的部分也将在背景上可见,而不仅仅是在变暗的颜色上(这是不希望的).请参见下面的代码段:

However sometimes the placeholder will be on a different coloured background and the the moving part also becomes visible on the background instead of just on the coloured darkened (which is undesired). please see snippet below:

.ph-item {
  position: relative;
  margin-bottom: 10px;
  overflow: hidden;
  border-radius: 2px;
}

.ph-item,
.ph-item *,
.ph-item ::after,
.ph-item ::before {
  box-sizing: border-box;
}

.ph-item::before {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 50%;
  z-index: 1;
  width: 500%;
  margin-left: -250%;
  animation: phAnimation 0.8s linear infinite;
  background: linear-gradient(to right, rgba(255, 255, 255, 0) 46%, rgba(255, 255, 255, 0.35) 50%, rgba(255, 255, 255, 0) 54%) 50% 50%;
}

.ph-item > * {
  padding-right: 10px;
}

.ph-row {
  margin-bottom: 5px;
}

.ph-row div {
  border-radius: 3px;
  height: 10px;
  background-color: rgba(0, 0, 0, 0.2);
}

.ph-row .standard,
.ph-row.big div {
  height: 20px;
  margin-right: 10px;
}


.ph-float-right {
  float: right;
  padding-left: 10px;
  margin-right: auto;
}

.ph-col-2 {
  width: 16.66667%;
  display: inline-block;
}

.ph-col-4 {
  width: 33.33333%;
  display: inline-block;
}

.ph-col-6 {
  width: 50%;
  display: inline-block;
}

.ph-col-8 {
  width: 66.66667%;
  display: inline-block;
}

.ph-col-10 {
  width: 83.33333%;
  display: inline-block;
}

.ph-col-12 {
  width: 100%;
  display: inline-block;
}

.ph-avatar {
  position: relative;
  width: 100%;
  min-width: 50px;
  background-color: rgba(0, 0, 0, 0.2);
  border-radius: 50%;
  overflow: hidden;
}

.ph-avatar::before {
  content: "";
  display: block;
  padding-top: 100%;
}

@keyframes phAnimation {
  0% {
    transform: translate3d(-30%, 0, 0);
  }

  100% {
    transform: translate3d(30%, 0, 0);
  }
}

<div style="width: 500px; height: 50px; background-color: darkblue; padding: 20px;">
  <div class="ph-item" style="max-width: 360px;">
    <div class="ph-col-2">
      <div class="ph-avatar"></div>
    </div>
    <div class="ph-col-10 ph-float-right">
      <div class="ph-row">
        <div class="ph-col-6 standard"></div>
        <div class="ph-col-10"></div>
      </div>
    </div>
  </div>
</div>
<div style="width: 500px; height: 50px; background-color: white; padding: 20px;">
  <div class="ph-item" style="max-width: 360px;">
    <div class="ph-col-2">
      <div class="ph-avatar"></div>
    </div>
    <div class="ph-col-10 ph-float-right">
      <div class="ph-row">
        <div class="ph-col-6 standard"></div>
        <div class="ph-col-10"></div>
      </div>
    </div>
  </div>
</div>

我的问题是,是否有可能以某种方式掩盖动画,使其仅在变暗的部分( ph-avatar ph-col-xx )上渲染?

My question is, is it possible somehow to mask the animation to only be rendered on top of the darkened parts (ph-avatar and ph-col-xx) ?

这是如何实现的?

推荐答案

edit这实际上是

edit This is actually a duplicate of Background animation performance

另一种方法是使用after伪代码,并使用 background-position 进行线性梯度重置.为了使每个伪对象具有连贯的渐变, background-attachment 会将它们放在一起.背景尺寸也有帮助.

Another approach could to use the after pseudo with the linear gradient reset with background-position. to keep each pseudo with coherent pieces of gradient, background-attachment will put things together. background-size will help also.

以下想法的演示.CSS注释了更新或修改的地方

Demo of the idea below. CSS commented where updated or modified

.ph-item {
  position: relative;
  margin-bottom: 10px;
  overflow: hidden;
  border-radius: 2px;
}

.ph-item,
.ph-item *,
.ph-item ::after,
.ph-item ::before {
  box-sizing: border-box;
}
   /* selector removed 

.ph-item::before 

       and replaced by : */
.ph-avatar::after,
.ph-row .standard::after,
.ph-row .ph-col-10::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 50%;
  z-index: 1;
  width: 500%;
  margin-left: -250%;
  animation: phAnimation 2s linear infinite;/* duration to set to your needs */
  background: linear-gradient(
      to right,
      rgba(255, 255, 255, 0) 46%,
      rgba(255, 255, 255, 0.35) 50%,
      rgba(255, 255, 255, 0) 54%
    )
    50% 50% 
    rgba(0, 0, 0, 0.2);/* move here & added */
  background-attachment: fixed;/*  added */
  background-size: 1000px auto;/*  added */
}

.ph-item > * {
  padding-right: 10px;
}

.ph-row {
  margin-bottom: 5px;
}

.ph-row div {
  border-radius: 3px;
  height: 10px;
 /*background-color: rgba(0, 0, 0, 0.2); or move animation here from pseudo*/
}

.ph-row .standard,
.ph-row.big div {
  height: 20px;
  margin-right: 10px;
}

.ph-float-right {
  float: right;
  padding-left: 10px;
  margin-right: auto;
}

.ph-col-2 {
  width: 16.66667%;
  display: inline-block;
}

.ph-col-4 {
  width: 33.33333%;
  display: inline-block;
}

.ph-col-6 {
  width: 50%;
  display: inline-block;
  position: relative;/*  added */
  overflow: hidden;/*  added */
}

.ph-col-8 {
  width: 66.66667%;
  display: inline-block;
}

.ph-col-10 {
  width: 83.33333%;
  display: inline-block;
  position: relative;/*  added */
  overflow: hidden;/*  added */
}

.ph-col-12 {
  width: 100%;
  display: inline-block;
}

.ph-avatar {
  position: relative;
  width: 100%;
  min-width: 50px;
  border-radius: 50%;
  overflow: hidden;
}

.ph-avatar::before {
  content: "";
  display: block;
  padding-top: 100%;
}

@keyframes phAnimation {
  0% {
    background-position: -1000px 0;/*  modified */
  }

  100% {
    background-position: 1000px 0;/*  modified */
  }
}

<div style="width: 500px; height: 50px; background-color: darkblue; padding: 20px;">
  <div class="ph-item" style="max-width: 360px;">
    <div class="ph-col-2">
      <div class="ph-avatar"></div>
    </div>
    <div class="ph-col-10 ph-float-right">
      <div class="ph-row">
        <div class="ph-col-6 standard"></div>
        <div class="ph-col-10"></div>
      </div>
    </div>
  </div>
</div>
<div style="width: 500px; height: 50px; background-color: white; padding: 20px;">
  <div class="ph-item" style="max-width: 360px;">
    <div class="ph-col-2">
      <div class="ph-avatar"></div>
    </div>
    <div class="ph-col-10 ph-float-right">
      <div class="ph-row">
        <div class="ph-col-6 standard"></div>
        <div class="ph-col-10"></div>
      </div>
    </div>
  </div>
</div>
<div style="width: 500px; height: 50px; background-color: tomato; padding: 20px;">
  <div class="ph-item" style="max-width: 360px;">
    <div class="ph-col-2">
      <div class="ph-avatar"></div>
    </div>
    <div class="ph-col-10 ph-float-right">
      <div class="ph-row">
        <div class="ph-col-6 standard"></div>
        <div class="ph-col-10"></div>
      </div>
    </div>
  </div>
</div>
<div style="width: 500px; height: 50px; background-color: gold; padding: 20px;">
  <div class="ph-item" style="max-width: 360px;">
    <div class="ph-col-2">
      <div class="ph-avatar"></div>
    </div>
    <div class="ph-col-10 ph-float-right">
      <div class="ph-row">
        <div class="ph-col-6 standard"></div>
        <div class="ph-col-10"></div>
      </div>
    </div>
  </div>
</div>
<div style="width: 500px; height: 50px; background-color: purple; padding: 20px;">
  <div class="ph-item" style="max-width: 360px;">
    <div class="ph-col-2">
      <div class="ph-avatar"></div>
    </div>
    <div class="ph-col-10 ph-float-right">
      <div class="ph-row">
        <div class="ph-col-6 standard"></div>
        <div class="ph-col-10"></div>
      </div>
    </div>
  </div>
</div>
<div style="width: 500px; height: 50px; background-color: turquoise; padding: 20px;">
  <div class="ph-item" style="max-width: 360px;">
    <div class="ph-col-2">
      <div class="ph-avatar"></div>
    </div>
    <div class="ph-col-10 ph-float-right">
      <div class="ph-row">
        <div class="ph-col-6 standard"></div>
        <div class="ph-col-10"></div>
      </div>
    </div>
  </div>
</div>
<div style="width: 500px; height: 50px; background-color: gray; padding: 20px;">
  <div class="ph-item" style="max-width: 360px;">
    <div class="ph-col-2">
      <div class="ph-avatar"></div>
    </div>
    <div class="ph-col-10 ph-float-right">
      <div class="ph-row">
        <div class="ph-col-6 standard"></div>
        <div class="ph-col-10"></div>
      </div>
    </div>
  </div>
</div>
<div style="width: 500px; height: 50px; background-color: teal; padding: 20px;">
  <div class="ph-item" style="max-width: 360px;">
    <div class="ph-col-2">
      <div class="ph-avatar"></div>
    </div>
    <div class="ph-col-10 ph-float-right">
      <div class="ph-row">
        <div class="ph-col-6 standard"></div>
        <div class="ph-col-10"></div>
      </div>
    </div>
  </div>
</div>

注意,可以直接在元素内部设置背景动画,除非有其他用途,否则不需要伪元素.可能的选项 https://codepen.io/gc-nomade/pen/byJOJa

Note , the background-animation can be set directly inside elements , pseudo are not necessary unless they have another purpose. possible option https://codepen.io/gc-nomade/pen/byJOJa

这篇关于CSS动画,仅在特定元素上渲染叠加的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆