【问题标题】:CSS/jQuery animation positioning issueCSS/jQuery 动画定位问题
【发布时间】:2014-12-20 17:42:41
【问题描述】:

我一直在使用 CSS 过渡和 jQuery 测试动画。这个想法是向用户显示一组可点击的 div 以加载新页面。单击 div 后,它会展开以填满整个屏幕并“加载”下一页。

下面是我要实现的目标的模型:

我设置它的方式是让每个 div 相对定位并向左浮动以彼此相邻。然后,一旦单击 div,我将 div 淡出,将未单击的 div 分开并展开单击的 div。问题是当 div 点击不是第一个(即蓝色或绿色)时,它最终会在展开之前“捕捉”到左侧。当然这会发生,因为定位设置为相对。

position: relative;

可以在此处查看示例:http://codepen.io/anon/pen/eKynL

为了解决这个问题,我设置了绝对定位的 div。动画按我的意愿完美运行,但是我不喜欢这样一个事实,即由于绝对定位,我必须分别定位每个 div 的左侧和顶部,而且在调整窗口大小时,div 不会自动移动到新行。

position: absolute;

可以在此处查看示例:http://codepen.io/anon/pen/jIqcL

我不确定是否有任何方法可以更改我的实现以改进它并使其更易于维护(尤其是 div 的内联样式)。

【问题讨论】:

    标签: jquery html css css-animations


    【解决方案1】:

    我使用了你的position:relative; (http://codepen.io/anon/pen/eKynL) 作为来源:

    $(document).ready(function() {
      $('.mydiv').click(function() {
        if(!$(this).hasClass('clicked')) {
          var clicked_div = $(this);
          clicked_div.addClass('clicked');
          clicked_div.find('h1').fadeOut(150);
    
          $('.mydiv').not('.clicked').addClass('hide'); //<----CHANGED LINE
          clicked_div.addClass('animate');
    
          $('.loading').css('opacity', 1);
    
          setTimeout(function() {
            $('.mydiv').not('.clicked').css('display','none'); //<----NEW LINE
            $('.loading').css('opacity', 0);
            clicked_div.addClass('blog-post');
            clicked_div.find('h1').fadeIn(150);
            $('.blog-content').addClass('active');
          }, 1500);
        }
      });
    });
    *,*:before,*:after {
      box-sizing: border-box;
    }
    html, body {
      width: 100%;
      height: 100%;
      position: relative;
      padding: 0;
      margin: 0;
      overflow: hidden;
    }
    .mydiv {
      width: 200px;
      height: 200px;
      background-color: #bada55;
      position: relative;
      float: left;
      left: 0;
      top: 0;
      transition: width 0.5s, height 0.5s, left 0.5s, top 0.5s, opacity 0.25s; /*<----ADDED 'opacity'*/
    }
    .mydiv h1 {
      position: absolute;
      bottom: 0;
      left: 10px;
      color: #fff;
      font-family: sans-serif;
    }
    .teal {
      background-color: teal;
    }
    .orange {
      background-color: orange;
    }
    
    /*-----NEW CODE---------------------------------*/
    .mydiv.hide {
      width: 0px;
      height: 0px;
      opacity: 0;
    }
    /*----------------------------------------------*/
    
    .mydiv.animate {
      width: 100%;
      height: 100%;
      left: 0;
      top: 0;
    }
    
    .mydiv.blog-post {
      width: 50%;
    }
    
    .blog-content {
      background-color: #efefef;
      width: 50%;
      height: 100%;
      position: absolute;
      right: 0;
      top: 100%;
      transition: top 0.5s;
      font-family: sans-serif;
      color: #3c3c3c;
      font-size: 30px;
      padding: 20px;
    }
    
    .blog-content.active {
      top: 0%;
    }
    
    .loading {
      position: absolute;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      margin: auto 0;
      width: 100%;
      height: 100px;
      text-align: center;
      font-family: sans-serif;
      font-size: 30px;
      font-weight: bold;
      color: #fff;
      opacity: 0;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    
    <div class="mydiv">
      <h1>Green</h1>
    </div>
    <div class="mydiv teal">
      <h1>Teal</h1>
    </div>
    <div class="mydiv orange">
      <h1>Orange</h1>
    </div>
    
    <div class="loading">Loading...</div>
    <div class="blog-content">
      Content
    </div>

    codepen:http://codepen.io/anon/pen/lFIhH


    CSS 中,我只添加了这个:

    .mydiv {
      ...
      transition: ..., opacity 0.25s;
    }
    
    .mydiv.hide {
      width: 0px;
      height: 0px;
      opacity: 0;
    }
    


    而在JS中,

    我更改了这一行:
    $('.mydiv').not('.clicked').fadeOut(150, function() {

    $('.mydiv').not('.clicked').addClass('hide');

    并在 setTimeout 函数中添加了这一行:

    $('.mydiv').not('.clicked').css('display','none');



    工作原理如下:

    1. 在被点击的div获得.animate-class的同时,未被点击的divs获得.hide-class。
    2. 现在,当点击的div 以动画方式填充页面时,其他divs 以动画方式消失(使用width/heightopacity)。
      • width/height 的所有divs 转换以相同的速度,所以当点击的div 增长,另一个divs 缩小,点击的div 不会捕捉到左/上。
      • 未点击的divsopacity 转换快一点(0.25 秒)以创建(看似)与原始代码笔相同的结果(即未点击的 div 在点击的 div 展开之前消失) .
    3. 最后(在setTimeout-function中),对于未点击的divs,将display设置为none,完成手动淡出。

    【讨论】:

    • 很棒的东西谢谢你的解释:) 我知道我的代码很好,只是需要解决一些问题:) 非常感谢。我刚刚将height: 0px 添加到.hide 类中,以防.mydiv 在另一行:)
    • 很高兴为您提供帮助。是的,你的代码很好,我自己从中学到了一些新东西。并很好地拨打height,我已将其添加到答案中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多