scroll - 平滑滚动 angular2

标签 scroll typescript angular smooth-scrolling

我无法在 Angular 2 中使用平滑滚动服务。在 Angular 2 团队获得 $anchorScroll angular2 等效工作之前,是否有任何平滑滚动或普通 anchor 滚动的服务可以工作?

到目前为止我刚刚尝试过:

在父 div 上设置 *ngFor 循环递增 id

[attr.id]="'point' + i"

在传递了 id 的按钮上调用 scrollto

<button 
     type="button" 
     class="btn btn-lg btn-default " 
     (click)="smoothScroll('point'+i)">
           Scroll to point
</button>

在关联的组件中,我试图实现一个普通的 js 平滑滚动功能

smoothScroll(eID) {
        var startY = currentYPosition();
        var stopY = elmYPosition(eID);
        var distance = stopY > startY ? stopY - startY : startY - stopY;
        if (distance < 100) {
            scrollTo(0, stopY); return;
        }
        var speed = Math.round(distance / 100);
        if (speed >= 20) speed = 20;
        var step = Math.round(distance / 25);
        var leapY = stopY > startY ? startY + step : startY - step;
        var timer = 0;
        if (stopY > startY) {
            for (var i = startY; i < stopY; i += step) {
                setTimeout(this.win.scrollTo(0, leapY), timer * speed);
                leapY += step; if (leapY > stopY) leapY = stopY; timer++;
            } return;
        }
        for (var i = startY; i > stopY; i -= step) {
            setTimeout(this.win.scrollTo(0,leapY), timer * speed);
            leapY -= step; if (leapY < stopY) leapY = stopY; timer++;
        }
    }
function currentYPosition() {
    // Firefox, Chrome, Opera, Safari
    if (self.pageYOffset) return self.pageYOffset;
    // Internet Explorer 6 - standards mode
    if (document.documentElement && document.documentElement.scrollTop)
        return document.documentElement.scrollTop;
    // Internet Explorer 6, 7 and 8
    if (document.body.scrollTop) return document.body.scrollTop;
    return 0;
}
function elmYPosition(eID) {
    var elm = document.getElementById(eID);
    var y = elm.offsetTop;
    var node = elm;
    while (node.offsetParent && node.offsetParent != document.body) {
        node = node.offsetParent;
        y += node.offsetTop;
    } return y;
}

我也在尝试为来自窗口提供程序服务的 this._win.scrollTo 提供对窗口的访问权限

import {Injectable, Provider} from 'angular2/core';
import {window} from 'angular2/src/facade/browser';
import {unimplemented} from 'angular2/src/facade/exceptions';

function _window(): Window {
  return window
}

export abstract class WINDOW {
  get nativeWindow(): Window {
    return unimplemented();
  }
}

class WindowRef_ extends WINDOW {
  constructor() {
    super();
  }
  get nativeWindow(): Window {
    return _window();
  }
}

export const WINDOW_PROVIDERS = [
  new Provider(WINDOW, { useClass: WindowRef_ }),
];

** 编辑 ----------------------**

我将 this.win.scrollTo 更改为 this.win.window.scrollTo 现在我得到了类似于 angular1.x $anchorscroll 的效果,其中滚动是快速的而不是平滑的过渡,但滚动是不顺利,我收到以下异常错误。

Exception error

更新

在发现 angular2 以不同方式执行 setTimeout 后,我​​不再收到该错误,但滚动仍然是瞬时的,而不是平滑的滚动。

我变了

  setTimeout(this.win.scrollTo(0, leapY), timer * speed);

 setTimeout(() => this.win.scrollTo(0, leapY), timer * speed);

最佳答案

window 对象中有一个名为scrollTo() 的方法。 如果将行为设置为“平滑”,页面将处理平滑滚动。 示例(滚动到页面顶部):

 window.scrollTo({ left: 0, top: 0, behavior: 'smooth' });

还有后备示例:

    try 
    { 
     window.scrollTo({ left: 0, top: 0, behavior: 'smooth' });
     } catch (e) {
      window.scrollTo(0, 0);
      }

关于scroll - 平滑滚动 angular2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36092212/

相关文章:

javascript - 使用 Chrome Materialize v1.0.0 时,鼠标滚轮滚动并不总是在 Materialize 下拉菜单中起作用

javascript - 是否有/什么是在 Angular 应用程序中查询所有 `img` 标签的最佳方法?

reactjs - 如何使用 Typescript 将 jest.spyOn 与 React 函数组件一起使用

angular - 取消订阅 ReplaySubject 返回 asObservable();

Angular 2 将表单分配给变量不起作用#f ="form"(提交)="onSubmit(f.value)"

html - 如何确保内容永远不会在固定 Material 工具栏下滚动?

jquery - 使用 jQuery,如何强制访问者滚动到文本区域的底部以启用提交按钮?

jquery - 检测 100% 高度固定 div 中的滚动

javascript - 简单的 javascript if 语句不起作用

javascript - 如何使用 "this"调用事件内的函数