How do I get the x and y positions of an element in an AngularJS directive

后端 未结 1 1653
傲寒
傲寒 2021-02-14 21:54

Within the link function part of a directive we have access to the element object. I wish to determine if the element object is within the current view

1条回答
  •  梦如初夏
    2021-02-14 22:30

    You can use element[0].getBoundingClientRect, it works - there is an example:

    http://plnkr.co/edit/2eOw3B0MaM2vw3bQuFnf

    If you need to track element visibility in angular directive, except scroll you also need to handle events: DOMContentLoaded, load and resize. Also it would be better to create only one handler for those events, and stop tracking element when directive is destroyed

    app.directive('trackVisibility', function(){
      function isVisible(el) {
        var rect = el.getBoundingClientRect();
        var clw = (window.innerWidth || document.documentElement.clientWidth);
        var clh = (window.innerHeight || document.documentElement.clientHeight) ;
    
        // checks if element is fully visible
        //return (rect.top >= 0 && rect.bottom <= clh) && (rect.left >= 0 && rect.right <= clw);
    
        // checks if part of element is visible
        return (rect.left <= clw && 0 <= rect.right && rect.top <= clh && 0 <= rect.bottom);
    
      }
      var reg = [];
    
      function register(element, fn) {
        reg.push([element, fn]);
      }
    
      function deregister(element) {
        reg = angular.filter(reg, function (item) {
          return item[0] !== element;
        });
      }
    
      angular.element(window).on('DOMContentLoaded load resize scroll', function () {
        angular.forEach(reg, function (item) {
            item[1](isVisible(item[0]));
        });
      });
    
      return {
        restrict: 'A',
        link: function (scope, element, attrs, controller) {
          register(element[0], function(isVisible){
            scope.$apply(function(){
              scope.isVisible = isVisible;
            })
          });
          scope.$on('$destroy', function(){
            deregister(element);
          })
        }
      };
    });
    

    there is an example: http://plnkr.co/edit/VkCgBvGnCWZ0JCM8tlaJ

    I have used this approach to dynamically load images when they become visible.

    0 讨论(0)
提交回复
热议问题