# 概述

  1. 描述:常见的返回顶部的按钮的实现(市面上也有已实现的成熟的组件,如 Antd,<BackTop/>组件)。

# 主要实现

ScrollToTop.tsx

import * as React from "react";
import ToTopBtn from "../ToTopBtn";

import style from "./scroll-to-top.styl?css-modules";

class ScrollToTop extends React.Component {
  private toTopBtnRef: React.RefObject<HTMLDivElement>;
  constructor(props) {
    super(props);

    this.toTopBtnRef = React.createRef();
  }
  public componentDidMount() {
    window.addEventListener("scroll", this.handleScroll);
  }
  public componentWillUnmount() {
    window.removeEventListener("scroll", this.handleScroll);
  }
  private handleScroll = () => {
    const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    if (scrollTop >= window.innerHeight) {
      this.toTopBtnRef.current.style.display = "block";
    } else {
      this.toTopBtnRef.current.style.display = "none";
    }
  }
  private handleClick() {
    const initialScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    // 计算每次减少的步长
    const step = Math.round(initialScrollTop / 10);
    const scroll = () => {
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
      window.scrollTo(0, scrollTop - step);
      if (scrollTop > 0) {
        requestAnimationFrame(scroll);
      }
    }
    requestAnimationFrame(scroll);
  }
  public render() {
    return (
      <div className={style.toTopBtn} ref={this.toTopBtnRef}
        onClick={() => {this.handleClick()}}>
        <ToTopBtn />
      </div>
    );
  }
}

export default ScrollToTop;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

scroll-to-top.styl

$baseRem = 20
px2rem($px, $rem = $baseRem)
  ($px / $rem)rem
.to-top-btn
  display: none
  position: fixed
  right: px2rem(12)
  bottom: px2rem(17)
  z-index: 999
  width: px2rem(52)

1
2
3
4
5
6
7
8
9
10
11

ToTopBtn.tsx

import * as React from "react";

const ToTopBtn = () => {
  return (
    <svg
      data-name="\u56FE\u5C42 1"
      xmlns="http://www.w3.org/2000/svg"
      viewBox="0 0 52 52"
    >
      <title>top btn</title>
      <g data-name="ic top">
        <circle cx="26" cy="26" r="18" fill="#fafbfb" />
        <path
          d="M26.75 23.56v10.69a.75.75
     0 0 1-1.5 0V23.56L19.1 29.7a.75.75 0 0 1-1.1-1.06l7.42-7.42a.75.75
      0 0 1 1 0L34 28.64a.75.75 0 1 1-1.06 1.06zm-8-5.56h14.5a.75.75 0
       0 1 0 1.5h-14.5a.75.75 0 0 1 0-1.5z"
          fill="#757575"
        />
      </g>
    </svg>
  );
};

export default ToTopBtn;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25