【问题标题】:Make background color change on hover after setting style using ng-style使用 ng-style 设置样式后,在悬停时更改背景颜色
【发布时间】:2012-12-31 20:33:05
【问题描述】:

我有一个单词列表,每个单词都有一个数字(条纹)。我使用 AngularJS 的 ng 样式根据分配给它的数字设置每个单词的背景颜色。

html

   <ul class="unstyled">
     <li class="tHi" ng-repeat="item in items" ng-click="getEdit(item.word)" ng-style="bgstyle(item.streak)">
       <span>{{item.word}} {{item.streak}}</span>
     </li>
   </ul>

从 ng-style 调用的javascript。

$scope.bgstyle = function (streak) {
    var red = 255;
    var green = 255-streak;
    var blue = 255-streak;
    var rgb = blue | (green << 8) | (red << 16);
    var sColor = '#' + rgb.toString(16);
    return {backgroundColor: sColor};
}

这可行,但是,我希望当鼠标悬停在一个单词上时背景会突出显示。我添加了一个“tHi”类,它通常会在悬停时改变背景,但它会被添加的样式覆盖。

这里有一个 jsfiddle 演示了这个问题。

有没有比 ng-style 更好的方法来设置背景,使其与分配给每个单词的数字相对应?或者有没有办法在用户将鼠标悬停在某个词上时突出显示?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    这是我实际上建议在 CSS 中使用 !important 的极少数情况之一:

    .tHi:hover {
        cursor: pointer;
        background-color: #9f9 !important;
    }
    

    Updated JS Fiddle demo.

    使用!important 关键字本质上会导致应用规则,而不管选择器的具体性如何(假设更具体的选择器没有!important 关键字,课程)。但是,如果您或您的同事忘记使用!important,它确实可能会使调试变得相当困难。

    参考资料:

    【讨论】:

      【解决方案2】:

      如果不想使用!important,可以使用ng-mouseover动态添加类:

       <li ng-repeat="item in items" ng-click="getEdit(item.word)" 
          ng-style="bgstyle(item.streak)" ng-mouseover="hover($event)">
      

      然后添加到你的控制器:

      $scope.hover = function(e) {
          angular.element(e.srcElement).addClass('tHi')
      }
      

      在控制器中操作 DOM 不是“最佳实践”。一个指令会更好。

      更新:这是一个指令

      myApp.directive('ngHover', function() {
        return {
          link: function(scope, element) {
             element.bind('mouseenter', function() {
                angular.element(element.children()[0]).addClass('tHi')
             })
          }
        }
      });
      

      children()[0]用于将class应用于span,而不是li,以免与ng-style冲突。

      如下使用:

      <li ng-repeat="item in items" ng-click="getEdit(item.word)"
        ng-style="bgstyle(item.streak)" ng-hover>
      

      Fiddle

      【讨论】:

      • 我喜欢您的回答作为使用指令和 ng-mouseover 的示例。谢谢你。另外,您的回答让我意识到以前没有发生过的事情。最简单的解决方案是将类 'tHi' 添加到 span 而不是 li。这样我就不需要 !important 或指令。就像你说的那样,它避免了与 ng-style 的冲突。
      • 很棒的观察。 (而且它避免了所有额外的事件绑定和 $watching。)
      • 这是一个完全正交的注释,但如果你只是应用一个样式类,你总是可以使用好的 ol' CSS 并定义 :hover。
      • 一个问题,你为什么要使用 angular.element(element.children()... 如果你可以使用 element.children().eq(0)...?
      • @Kalamarico,没有充分的理由——可能是因为我最初写答案时没有想到使用较短的 eq(0) 方式。
      【解决方案3】:

      我发现通过指令是最简单的方法。

      App.directive('attr', function(){
          return function(scope, element) {
              element.bind('mouseenter', function(){
                  element.addClass('hover');
              }).bind('mouseleave', function(){
                element.removeClass('hover');
              })
          }
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-10
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多