【问题标题】:CSS opacity transition, make it truly linear [closed]CSS不透明度过渡,使其真正线性[关闭]
【发布时间】:2017-08-13 03:20:20
【问题描述】:

如何在两个 div 之间转换而在转换过程中不看到页面背景。在这个例子中,我只希望看到数字发生变化:

https://jsfiddle.net/j2td4hd7/15/

过渡缓动设置为linear

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误在问题本身中重现它所需的最短代码。没有明确的问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example
  • 你可以将内容包装在一个 div 或 span 中并转换它而不是整个 div 吗?
  • 我以后可能会使用不同的背景。那只是一个最小的例子。这是一个具有不同背景的人:jsfiddle.net/j2td4hd7/15。为什么过渡时页面背景会显示?谢谢

标签: javascript jquery css css-transforms


【解决方案1】:

这与缓动没有任何关系,只是你不必要地转换了两个元素。

这很容易过于复杂 - 而不是将两个图像视为堆栈:底部的图像可以始终保持可见,只有顶部的图像需要淡入和淡出。

下面比较:

goodswap = function() {
  $('#div2').fadeToggle(); // transitions the top element in and out
}

badswap = function() {
  $('#div1, #div2').fadeToggle(); // transitions both elements in and out
}
.block-div {
  position: absolute;
  height: 200px;
  width: 400px;
  color: #fff;
  font-size: 40px;
  text-align: center;
}
.container { position: relative }
#div1 { background-color: red;}
#div2 { background-color: brown; display: none;}
#div3 { background-color: blue }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

<button onclick="goodswap()">Good fade</button>
<button onclick="badswap()">Bad fade</button>

<div class="container">
  <div class="block-div" id="div3">(This is the page background)</div>
  <div class="block-div" id="div1">1</div>
  <div class="block-div" id="div2">2</div>
</div>

如果图像尺寸不同,只要将较大的图像与较高的 z-index 堆叠在一起,此技术仍然有效。为了防止页面的其余部分跳来跳去,请将容器的大小设置为较大图像的大小。

goodswap = function() {
  $('#div2').fadeToggle(); // transitions the top element in and out
}

badswap = function() {
  $('#div1, #div2').fadeToggle(); // transitions both elements in and out
}
.block-div {
  position: absolute;
  height: 200px;
  width: 400px;
  color: #fff;
  font-size: 40px;
  text-align: center;
}
.container { position: relative }
#div1 { background-color: red;}
#div2 { background-color: brown; width: 500px; display: none;}
#div3 { background-color: blue }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

<button onclick="goodswap()">Good fade</button>
<button onclick="badswap()">Bad fade</button>

<div class="container">
  <div class="block-div" id="div3">(This is the page background)</div>
  <div class="block-div" id="div1">1</div>
  <div class="block-div" id="div2">2</div>
</div>

【讨论】:

    【解决方案2】:

    如果您有两个元素具有黑色背景且每个元素的不透明度为 50% - 它们组合成 100% 黑色:)

    检查以下内容:

    div {
      background: black;
      width: 150px;
      height: 150px;
      position: absolute;
    }
    div.half {
      opacity: 0.5;
      left: 0;
      top: 0;
    }
    div.full {
      top: 0;
      left: 150px;
    }
    <div class="half"></div>
    <div class="half"></div>
    <div class="full"></div>

    在动画期间 - 两个元素的不透明度从 0 变为 100 和从 100 变为 0,但背景颜色没有“组合”。

    我认为以下内容将提供您正在寻找的内容:

    window.swap = function(divId){
    	if(divId === 'div1'){
      	jQuery('#div1').css('zIndex', 1);
        jQuery('#div2').css('zIndex', 2);
        jQuery('#div2').fadeIn({easing: 'linear', complete: function() {
          jQuery('#div1').fadeOut({easing: 'linear'})
          } }
        );
      }else{
      	jQuery('#div2').css('zIndex', 1);
        jQuery('#div1').css('zIndex', 2);
        jQuery('#div1').fadeIn({easing: 'linear', complete: function() {
          jQuery('#div2').fadeOut({easing: 'linear'})
          }
        });
      }
    }
    .block-div {
      position: absolute;
      height: 200px;
      width: 400px;
      color: #fff;
      font-size: 40px;
      text-align: center;
    }
    
    #div2{ display: none; background-color: brown; }
    #div1{ background-color: red; }
    
    html, body{
      background-color: #fff;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="block-div" onclick="swap('div1')" id="div1">1</div>
    <div class="block-div" onclick="swap('div2')" id="div2">2</div>

    关于 OP 中的 cmets 的注意事项:
    如果您希望两个具有不同高度的元素具有相同的效果,您可以创建两个虚拟 div,一个用于您拥有的每个 div。 dummy1 的大小与 div1 相同,但包含 div2 的 bg,dummy2 也是如此。现在您可以使用这些虚拟 div 进行转换。

    【讨论】:

    • 谢谢。如果 DIV 大小相同,则效果很好。当大小不同时,它看起来不正确:jsfiddle.net/j2td4hd7/18.
    • 您希望在这种情况下会发生什么?
    • 我希望两个 DIV 同时转换,但这样做会导致页面背景可见。延迟有效,但会导致较高的 div 一直存在,直到较短的 div 完全淡入之后。这可能是不可能的。
    • 您可以创建两个虚拟 div,每个 div 一个。 dummy1 的大小与 div1 相同,但包含 div2 的 bg,dummy2 也是如此。现在您可以使用这些虚拟 div 进行转换 :)
    猜你喜欢
    • 2021-07-26
    • 2011-11-24
    • 2020-05-29
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 2012-12-18
    • 2019-01-03
    • 2018-08-01
    相关资源
    最近更新 更多