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

标签 javascript jquery angularjs css angularjs-scope

我想给 <li> 添加一个类当它还是 child 的时候<a>徘徊但我似乎无法让它工作。正在发生的事情是,无论怎样<a>元素悬停,只有第一个 <li>受到影响,所以我需要能够只针对父 <li><a>目前悬停在上面。

这是我目前所拥有的:

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

代码如下:

Controller (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;
}

最佳答案

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

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>

我认为这样更好,因为悬停时的样式是一个 View 问题。虽然上面的解决方案在当前范围内设置了一个hover属性,但是 Controller 不需要关心这个。

http://jsfiddle.net/33ypvx3g/

关于javascript - 如何通过 Angular 将鼠标悬停在另一个元素上时添加和删除一个元素的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28243478/

相关文章:

javascript - 停止将更改传播到同一对象的多个实例

javascript - 在标签标签上使用 this.form.submit()

jquery - .hover 函数在菜单 jquery 中停止动画

javascript - 将动态元素绑定(bind)到函数;只剩下一个绑定(bind)

jquery - 纯点击滚动到

javascript - AngularJS:来自服务的数据未更新

javascript - 当我调用它时,angular 的 $rootScope.$on() 方法没有被触发。为什么?

javascript - D3 Javascript - 示例 SVG 在 HTML 中声明,无法嵌入 HTML 标签

javascript - Chrome 扩展 |有没有办法让 chrome.storage.local.get() 返回一些东西?

javascript - 无法从 Angular Controller 读取 lodash 属性