6

From what I understand $anchorScroll yOffset is impossible within a child element: "In order for yOffset to work properly, scrolling should take place on the document's root and not some child element." https://docs.angularjs.org/api/ng/service/$anchorScroll

Example (modified from the the AngularJS docs): I want to click a link and include the word "between" above what is being scroll to.

index.html

<body ng-app="anchorScrollOffsetExample">
    <div class="fixed-header" ng-controller="headerCtrl">
    <a href="" ng-click="gotoAnchor(x)" ng-repeat="x in [1,2,3,4,5]">
      Go to inner-anchor {{x}}
    </a>
  </div>
  <div id="anchor" class="anchor">
    <div ng-repeat="x in [1,2,3,4,5]">
        between
        <div id="innerAnchor{{x}}" class="anchor" >Inner-Anchor {{x}} of 5</div>
    </div>
  </div>
</body>

style.css

  .anchor {
    border: 2px dashed DarkOrchid;
    padding: 10px 10px 200px 10px;
    max-height:500px;
    overflow-y: auto;
  }

script.js

angular.module('anchorScrollOffsetExample', [])
.run(['$anchorScroll', function($anchorScroll) {
  $anchorScroll.yOffset = 500;
}])
.controller('headerCtrl', ['$anchorScroll', '$location', '$scope',
  function ($anchorScroll, $location, $scope) {
    $scope.gotoAnchor = function(x) {
      var newHash = 'anchor' + x;
      if ($location.hash() !== newHash) {
        $location.hash('innerAnchor' + x);
      } else {
        $anchorScroll();
      }
    };
  }
]);

http://plnkr.co/edit/yFj9fL3sOhDqjhMawI72?p=preview

Is there a good way to do this within AngularJS (preferably no jQuery or additional libraries) without moving "between" to inside the DIV I'm scrolling to?

Sean
  • 152
  • 1
  • 13

1 Answers1

0

Why don't you use an anchor tag?

<body ng-app="anchorScrollOffsetExample">
    <div class="fixed-header" ng-controller="headerCtrl">
    <a href="" ng-click="gotoAnchor(x)" ng-repeat="x in [1,2,3,4,5]">
      Go to inner-anchor {{x}}
    </a>
  </div>
  <div id="anchor" class="anchor">
    <div ng-repeat="x in [1,2,3,4,5]">
        <!-- Add an anchor above the text, and we scroll here instead of the div -->
        <a name="innerAnchor{{x}}"></a>
        between
        <div class="anchor" >Inner-Anchor {{x}} of 5</div>
    </div>
  </div>
</body>
Alec
  • 2,432
  • 2
  • 18
  • 28