如何通过Angular将鼠标悬停在另一个元素上时添加和删除一个元素的类?

时间:2015-01-30 19:47:19

标签: javascript jquery angularjs css3 angularjs-scope

当我的孩子<li>被徘徊时,我想为<a>添加一个课程,但我似乎无法让它工作。发生的事情是,无论<a>元素悬停在哪个元素上,只有第一个<li>受到影响,因此我需要只能定位<li>的父<a>目前正在徘徊。

这是我到目前为止所做的:

http://jsfiddle.net/faGTg/39/

这是代码:

控制器(Javascript)

var myApp = angular.module('myApp',[]);
myApp.controller("Ctrl", function($scope){
    $scope.addClass = function(){
        angular.element(document.querySelector('.li-hover')).addClass('hovering');
    }
    $scope.removeClass = function(){
        angular.element(document.querySelector('.li-hover')).removeClass('hovering');
    }
});

HTML

<div ng-app='myApp'>
    <div ng-controller="Ctrl">
        <ul>
            <li class="li-hover" >
                <a href="" ng-mouseover="addClass()" ng-mouseleave="removeClass()">
                    <span>Home</span>
                </a>
            </li>
            <li class="li-hover" >
                <a href="" ng-mouseover="addClass()" ng-mouseleave="removeClass()">
                  <span>About</span>
                </a>
            </li>
            <li class="li-hover" >
                <a href="" ng-mouseover="addClass()" ng-mouseleave="removeClass()">
                  <span>Contact</span>
                </a>
            </li>
        </ul>
    </div>
</div>

CSS

.hovering {
    background-color: pink;
    border-bottom: 5px solid red;
}
li {
    margin: 1em;
    padding: 2em;
    border-bottom: 5px solid #aaa;
    background: #ccc;
}
a { 
    background: white;
    padding: 0.5em;
}

2 个答案:

答案 0 :(得分:1)

您可以使用转发器隔离范围,并更改重复项的属性:

myApp.controller("Ctrl", function($scope) {
  $scope.items = [
    {
      href: '',
      title: 'Home',
    },
    {
      href: '',
      title: 'About',
    },
    {
      href: '',
      title: 'Contact',
    }
  ];
});

然后,您可以在item上存储over属性,并使用它来更改类:

<ul>
  <li ng-repeat="item in items" ng-class="{hovering: item.over}">
    <a ng-href="{{item.href}}" title="{{item.title}}" ng-mouseover="item.over=true" ng-mouseleave="item.over=false">
      <span>{{item.title}}</span>
    </a>
  </li>
</ul>

http://jsfiddle.net/faGTg/41/

或者您现在可以使用简单的var,因为ng-repeat指令隔离了新范围中的每个项目:

<ul>
  <li ng-repeat="item in items" ng-class="{hovering: over}">
    <a ng-href="{{item.href}}" title="{{item.title}}" ng-mouseover="over=true" ng-mouseleave="over=false">
      <span>{{item.title}}</span>
    </a>
  </li>
</ul>

我认为这更好,因为悬停时的造型是一个视角问题。虽然上面的解决方案在当前作用域中设置了hover属性,但控制器不需要关心这一点。

http://jsfiddle.net/33ypvx3g/

答案 1 :(得分:0)

您不需要任何js或jQuery代码,您可以使用css :hover选择器完成此操作。将此添加到您的CSS:

li:hover {
   background-color: pink;
   border-bottom: 5px solid red;
}

以下是工作示例:http://jsfiddle.net/faGTg/40/