如何获取 AngularJS 指令中元素的 x 和 y 位置

2024-05-02

在指令的链接函数部分中,我们可以访问element目的。我想确定是否element对象位于当前视口内/如果可用。

我目前有以下内容:

link: function (scope, element, attrs, controller) {


                var page = angular.element(window);
                page.bind('scroll', function () {
                   var windowScroll = page[0].pageYOffset,
                       windowHeight = page[0].innerHeight;
                       // elementScroll = element.xpos; - this is undefined?
                       // elementScroll = element.getBoundingClientRect().top - this does not work... undefined?

                       // elementScroll = element[0].getBoundingClientRect().top - this does not work... undefined?
                       // ... logic follows that if elementScroll is between windowScroll & windowScroll + windowHeight it is visible!

                });

我似乎无法获取特定元素的 x 和 y 位置(该指令可能会重复多次)。

请注意,我不打算在我的应用程序中安装或使用 jQuery。


您可以使用element[0].getBoundingClientRect,它有效 - 有一个例子:

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

如果您需要跟踪角度指令中的元素可见性,除了scroll您还需要处理事件:DOMContentLoaded, load and resize。另外,最好只为这些事件创建一个处理程序,并在指令被销毁时停止跟踪元素

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);
      })
    }
  };
});

有一个例子:http://plnkr.co/edit/VkCgBvGnCWZ0JCM8tlaJ http://plnkr.co/edit/VkCgBvGnCWZ0JCM8tlaJ

我使用这种方法在图像可见时动态加载图像。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取 AngularJS 指令中元素的 x 和 y 位置 的相关文章

随机推荐