【问题标题】:CSS slide animation with angularjs带有 angularjs 的 CSS 幻灯片动画
【发布时间】:2015-01-24 06:52:15
【问题描述】:

我正在尝试使用带有 CSS3 过渡的 ng-show 为 div 设置动画。有 2 个 div:一个在前景中,另一个隐藏在它后面。当用户将鼠标悬停在前景 div 上时,隐藏的 div 应该向上滑动。如果用户光标移动到幻灯片 div 上,它也应该保持显示。如果用户光标离开幻灯片 div 或前景 div,它应该向下滑动。但它似乎无法正常工作。这是一个笨蛋:http://plnkr.co/edit/C1RaDTOXwpEMECGMkt19?p=preview

css 是否正确?

div#cover {
  background-color: lightblue;
  width: 90px;
  height: 30px;
  position:absolute;
  bottom: 0px;
  z-index:10;
}


.slide {
  background-color: white;
  width: 90px;
  height: 30px;
  position:absolute;
  bottom: 0px;
  z-index:5;
}

.slide.ng-hide-add, .slide.ng-hide-remove { 
    transition: bottom 1s ease;
}

.slide.ng-hide-remove-active {
    bottom: 30px
}

.slide.ng-hide-add-active {
    bottom: 0px
}

有什么想法吗?

【问题讨论】:

    标签: css angularjs animation transition slide


    【解决方案1】:

    你只需要两种状态:

    1. 显示
    2. 隐藏

    slide 基类定义显示的状态(距底部30px):

    .slide {
      background-color: white;
      width: 90px;
      height: 30px;
      position: absolute;
      bottom: 30px;
      z-index: 5;
      transition: 1s ease bottom !important;
      display: block !important;
    }
    

    ng-show 指令中使用的表达式被评估为 false 时,隐藏状态将被激活,并且 ng-hide 类将被 Angular 添加到元素中。

    使用该类来装饰基类并定义隐藏状态(距底部 0px):

    .slide.ng-hide {
      bottom: 0;
    }
    

    这意味着这两个状态在激活时将具有以下类:

    1. 显示:slide
    2. 隐藏:slide ng-hide

    如您所见,slide 类始终存在,这就是 transition 被放在那里的原因。

    您必须在transition 上使用!important,否则如果您在元素上来回移动光标,Angular 将用transition: none 短暂覆盖它,这将导致转换中断并且元素捕捉到它的最终位置。

    您还必须在slide 类中使用display: block !important 来覆盖ng-hide 的默认行为,即display: none

    演示: http://plnkr.co/edit/WN8v2riSYhhMyOgbZiWO?p=preview

    注意:我个人不建议为此使用ng-mouseenterng-mouseleave。每次他们触发整个摘要周期,所有的观察者都会被执行多次。另一种方法是创建一个使用事件侦听器手动添加/删除类的指令。

    【讨论】:

    • 太棒了,谢谢!只是出于对最后注释的好奇,将事件更改为 ng-mousedown 只是在 cover div 上可以防止这个问题吗?
    • 不客气 :) 是的,应该。 ng-mouseenterng-mouseleave 的问题在于,如果你有很多它们并且用户在屏幕上移动光标,触发其中的多个,你将有一堆不必要的摘要循环。这会对性能产生很大影响,尤其是在速度较慢的计算机或移动设备上(当然,除非您的应用程序真的很薄)。 ng-mousedown 通常不会不自觉地触发。
    • 我用$watch在这里注册了一个没有console.log的监听器的watchExpression,每次一个摘要循环运行时:plnkr.co/edit/zn3L3mSy7asa6KtMi3yo?p=preview尝试在打开控制台的元素上来回移动光标你会看到有多少人被解雇了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多