development

지시어에서 마우스 오버시 클래스 변경

big-blog 2020. 10. 11. 10:50
반응형

지시어에서 마우스 오버시 클래스 변경


중첩 된 지시문에서 클래스를 변경하는 방법을 찾는 데 문제가 있습니다.

이것은 외부 ng-repeat입니다.

<div data-courseoverview data-ng-repeat="course in courses | orderBy:sortOrder | filter:search"
         data-ng-controller ="CourseItemController"
         data-ng-class="{ selected: isSelected }">

아래는 다른 지시문을 사용하는 내부 ng-repeat입니다.

<li data-ng-repeat="item in social" class="social-{{item.name}}" ng-mouseover="hoverItem(true);"
    ng-mouseout="hoverItem(false);"
    index="{{$index}}"><i class="{{item.icon}}"
    box="course-{{$index}}"></i></li>

다음은 hover 이벤트를 호출하는 지시문입니다.

ecourseApp.directive("courseoverview", function() { 
  return {    
    restrict : 'A',    
    replace: true, 
    /*scope: {
        index: '@'
    },*/        
    transclude: true,      
    templateUrl: "views/course-overview.html",
    link: function link(scope, element, attrs) {
        scope.switched = false;
        //hover handler
        scope.hoverItem = function(hovered){
            if (hovered) {
                element.addClass('hover');
                $('#course-0 figure').addClass('tint')
            }
            else
                element.removeClass('hover');
        };
    }  
}});

이것은 $('#course-0 figure').addClass('tint')호출 항목을 변경 해야 합니다.


일반적으로 Jason의 CSS 선택기 사용에 전적으로 동의하지만 경우에 따라 타사 CSS 템플릿을 사용할 때 CSS를 변경하지 않고 요소에 클래스를 추가 / 제거하는 것을 선호 할 수 있습니다.

다음 샘플은 ng-mouseenter / mouseleave에서 클래스를 추가 / 제거하는 간단한 방법을 보여줍니다.

<div ng-app>
  <div 
    class="italic" 
    ng-class="{red: hover}"
    ng-init="hover = false"
    ng-mouseenter="hover = true"
    ng-mouseleave="hover = false">
      Test 1 2 3.
  </div>
</div>

스타일링 :

.red {
  background-color: red;
}

.italic {
  font-style: italic;
  color: black;
}

여기에서 실행 예제를 참조하십시오 : jsfiddle 샘플

호버링시 스타일링은 뷰 문제입니다. 위의 솔루션은 현재 범위에서 "hover"속성을 설정하지만 컨트롤러는 이에 대해 걱정할 필요가 없습니다.


과거에 IE와 css : hover 선택기에 문제가 발생 했으므로 내가 취한 접근 방식은 사용자 지정 지시문을 사용하는 것입니다.

.directive('hoverClass', function () {
    return {
        restrict: 'A',
        scope: {
            hoverClass: '@'
        },
        link: function (scope, element) {
            element.on('mouseenter', function() {
                element.addClass(scope.hoverClass);
            });
            element.on('mouseleave', function() {
                element.removeClass(scope.hoverClass);
            });
        }
    };
})

그런 다음 요소 자체에 마우스가 요소 위에있을 때 활성화 할 클래스 이름으로 지시문을 추가 할 수 있습니다. 예를 들면 다음과 같습니다.

<li data-ng-repeat="item in social" hover-class="hover tint" class="social-{{item.name}}" ng-mouseover="hoverItem(true);" ng-mouseout="hoverItem(false);"
                index="{{$index}}"><i class="{{item.icon}}"
                box="course-{{$index}}"></i></li>

이렇게하면 마우스가 요소 위에있을 때 클래스 호버 및 색조가 추가되고 범위 변수 이름 충돌의 위험이 없습니다. 나는 테스트하지 않았지만 mouseenter 및 mouseleave 이벤트가 여전히 포함 요소로 버블 링되어야하므로 주어진 시나리오에서 다음이 여전히 작동합니다.

<div hover-class="hover" data-courseoverview data-ng-repeat="course in courses | orderBy:sortOrder | filter:search"
 data-ng-controller ="CourseItemController"
 data-ng-class="{ selected: isSelected }">

물론 li이 부모 div의 사실상 자식임을 제공합니다.


This is my solution for my scenario:

<div class="btn-group btn-group-justified">
    <a class="btn btn-default" ng-class="{'btn-success': hover.left, 'btn-danger': hover.right}" ng-click="setMatch(-1)" role="button" ng-mouseenter="hover.left = true;" ng-mouseleave="hover.left = false;">
        <i class="fa fa-thumbs-o-up fa-5x pull-left" ng-class="{'fa-rotate-90': !hover.left && !hover.right, 'fa-flip-vertical': hover.right}"></i>
        {{ song.name }}
    </a>
    <a class="btn btn-default" ng-class="{'btn-success': hover.right, 'btn-danger': hover.left}" ng-click="setMatch(1)" role="button" ng-mouseenter="hover.right = true;" ng-mouseleave="hover.right = false;">
        <i class="fa fa-thumbs-o-up fa-5x pull-right" ng-class="{'fa-rotate-270': !hover.left && !hover.right, 'fa-flip-vertical': hover.left}"></i>
        {{ match.name }}
    </a>
</div>

default state: enter image description here

on hover: enter image description here


I think it would be much easier to put an anchor tag around i. You can just use the css :hover selector. Less moving parts makes maintenance easier, and less javascript to load makes the page quicker.

This will do the trick:

<style>
 a.icon-link:hover {
   background-color: pink;
 }
</style>

<a href="#" class="icon-link" id="course-0"><i class="icon-thumbsup"></id></a>

jsfiddle example

참고URL : https://stackoverflow.com/questions/16923111/change-class-on-mouseover-in-directive

반응형