以编程方式在 AngularJS 中的 Div 上设置 zIndex

Set zIndex programmatically on a Div in AngularJS

我在一个布局上有多个 Div,每个都是可拖动的,因此用户可以将它们拖动到它们将重叠的位置。

我想将最近可见的 div 的 z-index 值设置为比上一个增加 1,为此我使用了递增的 $scope.nextIndex 变量每次 div 中的一个可见。

每个 div 都有自己的变量来跟踪自己的 z-index 值:$scope.one_zIndex、$scope.two_zIndex、$scope.three_zIndex,并且每个都正确分配随着每个 div 的显示、隐藏和再次显示,值逐渐变大。

每个 div 都有自己的 class:one_z、two_z、three_z

我做不到的是通过控制器将变量分配给 divs 本身的 z-index 样式。

    var myVar = document.getElementsByClassName("one_z");

如果我将此记录到控制台,我会得到我所期望的 - 一个包含一个元素 [0]

的数组
    []
     0 : div#one_z
     length : 1
     one_z : div#one_z
    __proto__ : HTMLCollection

我假设我可以像这样简单地设置 z-index:

    myVar[0].style.zIndex = $scope.one_zIndex;

但是这会引发错误:

     Uncaught TypeError: Cannot set property 'zIndex' of undefined

我错过了什么?或者有更好的方法来完成这个吗?

这是一个正在工作的 plunker https://plnkr.co/edit/aaDipIWdqpajghc2F2Da?p=preview

您可以通过 ng-style 设置 zindex:

<div ng-style="{'z-index': $lastIndex;}">...</div>

这个例子在你的情况下完全没用,但是有一个 ng-style 用法的例子。在你的情况下,我将索引设置为 属性 of you div element data source.

最终起作用的是:

首先,我切换到 ID 而不是 类,这可能不会影响解决方案,但由于每个 div 只会存在一次,ID 是更正确的方法识别它们。

然后,在显示 div 的函数中,我使用了这个:

        _.defer(function(){
            jQuery('#one_z').css('z-index', $scope.one_zIndex);
         });

我在显示 div 并尝试在 DOM 更新为包含 div 之前设置其 z-index 时出现问题,因此 _.defer(我正在使用 Underscore.js)阻止了对 z-index 的访问,直到所有内容都更新一次,并且它有效。

正如我在另一条评论中提到的那样 - 使用 ng-style 对我不起作用,我也尝试过 _.defer 最初也没有成功。

郑重声明 - 我使用了 jQuery() 而不是 $() 所以在代码中很清楚这是一个 jQuery 而不是 Angular 解决方案,虽然理想情况下我希望有一个纯粹的 Angular 解决方案来解决这个问题,但这对我来说已经足够干净了,并且不会在 Angular 的权限之外进行任何 DOM 操作以任何方式影响应用程序的其余部分,它纯粹是展示糖果。