1.3.1 • Published 12 months ago

@mrtujiawei/web-utils v1.3.1

Weekly downloads
-
License
MIT
Repository
github
Last release
12 months ago

@mrtujiawei/web-utils

Demo

Scroller

弹性滚动

垂直滚动

/* style.css */
* {
  margin: 0;
  padding: 0;
  color: #fff;
}

.list {
  /* 必须 */
  height: 100vh;
  overflow: hidden;
}

.list-item {
  list-style: none;
  text-align: center;
  padding: 20px;
  margin-bottom: 1px;
  background: #008c8c;
}
/* App.js */
import { memo, useEffect, useRef, useState } from 'react';
import './style.css';

const List = memo(() => {
  return Array.from({ length: 50 }, (_, i) => i).map((value) => (
    <li key={value} className="list-item">
      {value}
    </li>
  ));
});

function App() {
  const [translateY, setTranslateY] = useState(0);
  const contentRef = useRef();

  useEffect(() => {
    const scroller = new window.TWebUtils.Scroller(setTranslateY);
    const cancel = scroller.addEvent(contentRef.current);
    return () => cancel();
  }, []);

  return (
    <div className="list">
      <ul
        ref={contentRef}
        style={{
          transform: `translateY(${translateY}px) translateZ(0)`,
        }}
      >
        <List></List>
      </ul>
    </div>
  );
}

export default App;

水平滚动

/* style.css */
* {
  margin: 0;
  padding: 0;
}

.list {
  display: flex;
  flex-wrap: nowrap;
  color: #fff;
}

.list-item {
  flex-shrink: 0;
  list-style: none;
  text-align: center;
  width: 100px;
  padding: 20px;
  margin-bottom: 1px;
  background: #008c8c;
}
/* App.js */
import { memo, useEffect, useRef, useState } from 'react';
import { preventDefaultEvent } from '@mrtujiawei/web-utils';
import './style.css';

const List = memo(() => {
  return Array.from({ length: 50 }, (_, i) => i).map((value) => (
    <li key={value} className="list-item">
      {value}
    </li>
  ));
});

function App() {
  const [translateY, setTranslateY] = useState(0);
  const contentRef = useRef();

  useEffect(() => {
    const data = new window.TWebUtils.Scroller(setTranslateY);
    const touchStart = (e) => {
      const content = contentRef.current;
      const childNodes = content?.childNodes;
      const lastChild = childNodes[childNodes.length - 1];
      // 关键是计算这个 min 能够向左滚动的最小值
      const min =
        content?.clientWidth - lastChild.offsetLeft - lastChild.clientWidth;
      data.touchStart(e.changedTouches[0].pageX, min);
    };

    const touchMove = (e) => {
      data.touchMove(e.changedTouches[0].pageX);
    };

    const touchEnd = (e) => {
      data.touchEnd(e.changedTouches[0].pageX);
    };

    preventDefaultEvent();

    const wrapper = contentRef.current?.parentNode;
    wrapper.addEventListener('touchstart', touchStart);
    wrapper.addEventListener('touchmove', touchMove);
    wrapper.addEventListener('touchend', touchEnd);
  }, []);

  return (
    <ul
      className="list"
      ref={contentRef}
      style={{
        transform: `translateX(${translateY}px) translateZ(0)`,
      }}
    >
      <List></List>
    </ul>
  );
}

export default App;
1.3.1

12 months ago

1.3.0

12 months ago

1.2.12

1 year ago

1.2.13

1 year ago

1.2.14

1 year ago

1.2.11

1 year ago

1.2.10

1 year ago

1.2.9

1 year ago

1.2.8

2 years ago

1.2.7

2 years ago

1.2.6

2 years ago

1.2.5

2 years ago

1.2.4

2 years ago

1.2.2

2 years ago

1.2.1

2 years ago

1.2.0

2 years ago

1.1.9

2 years ago

1.1.8

2 years ago

1.1.7

2 years ago

1.1.6

2 years ago

1.1.1

2 years ago

1.1.5

2 years ago

1.1.4

2 years ago

1.1.3

2 years ago

1.1.2

2 years ago

1.1.0

3 years ago

1.0.19

3 years ago

1.0.20

3 years ago

1.0.18

3 years ago

1.0.17

3 years ago

1.0.16

3 years ago

1.0.15

3 years ago

1.0.14

3 years ago

1.0.13

3 years ago

1.0.12

3 years ago

1.0.11

3 years ago

1.0.10

3 years ago

1.0.9

3 years ago

1.0.8

3 years ago

1.0.7

3 years ago

1.0.6

3 years ago

1.0.5

3 years ago

1.0.4

3 years ago

1.0.3

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago