h-tools-js
TypeScript icon, indicating that this package has built-in type declarations

2.0.0 • Public • Published

h-tools-js

Version Downloads License TopLang

🚀 具有轮播图、瀑布流、懒加载、事件代理器等功能的工具库


demo

https://18023785187.github.io/h-tools/


安装

$ npm install h-tools-js --save

引入

import { Slide, Waterfall, LazyLoad, EventListener } from 'h-tools-js'



import h from 'h-tools-js'
const { Slide, Waterfall, LazyLoad, EventListener } = h

组件

Slide

强大的、支持 pc 端和移动端的轮播图。

  • 功能特性:

    • 支持横向轮播和纵向轮播。
    • 能够订阅轮播触发事件。
    • 具有可更新操作。
    • 可自定义导航点样式。
  • 使用

<!-- html -->
<div id='slide'>
  <div class='box'>
    <item />
    <item />
    <item />
    ...
  </div>
</div>
/* css */
#slide {
  width: 100%;
}
/* js */
const el = document.getElementById('slide')
const slide = new Slide(el)
  • 配置参数类型
type Options = {
  mode: boolean // 轮播模式,true 为横向,false 为纵向
  transition: number // 轮播动画过渡时间,单位秒
  delay: number // 轮播延时,单位 ms
  range: number // 触发范围,范围 0 ~ 100
  nav: boolean // 是否开启导航栏
  navOptions: NavOptions // 导航配置
  bindEvent: boolean // 是否绑定事件
  control: slideControlStyle // 是否显示控件
}

// 导航栏位置
enum slideNavPosition {
  top = 'Top',
  right = 'Right',
  bottom = 'Bottom',
  left = 'Left',
}

// 导航栏配置
type NavOptions = {
  style: string, // 导航点样式,过渡属性需要在 transition 字段中设置
  highStyle: string, // 导航点高亮样式,过渡属性需要在 transition 字段中设置
  position: slideNavPosition, // 放置位置
  range: number, // 放置位置的方位,范围 0 ~ 1
  transition: number, // 导航点动画过渡时间,单位 ms
}

// 控件样式
export enum slideControlStyle {
  default = 'Default',
  fade = 'Fade',
}
  • API
const slide = new Slide(el: HTMLElement, options?: Options)

创建轮播图。

slide.subscribe(callback: (index?: number) => void)

绑定轮播图的触发事件,在每次触发轮播时触发。

callback: (index?: number) => void 传入一个回调函数,回调函数的参数是当前第几个内容。

slide.unsubscribe(callback: (index?: number) => void)

取消目标事件的订阅。

slide.move(direction?: boolean)

手动触发一次轮播事件,true 向左移动,false 向右移动。

slide.change(index: number)

轮播图定位到第 index 个内容。

slide.openTimer()

开启轮播定时器。

slide.closeTimer()

关闭轮播定时器。

slide.update(
  updateChildren: (elChild: HTMLElement) => void
)

更新轮播图视图,在轮播图有子节点需要更新时使用。

updateChildren: (elChild: HTMLElement) => void 传入一个回调函数,该回调函数用于写入添加、插入、删除子节点的操作,提供 elChild elChild 为子节点的父元素,可使用 elChild 进行修改操作。

slide.destroy()

清理函数,在 slide 时解绑绑定的事件。


Waterfall

瀑布流式布局。

  • 配置参数类型
type Options = {
    marginTop?: number /* 可选值,上边距 */,
    minMargin?: number /* 可选值,左右下最小边距,边距只能大于或等于这个值 */,
    throttle?: number /* 可选值,节流防抖的时间间隔。视口尺寸改变时会调用重置方法,这时需要节流,默认为 200ms,在 pc 端生效 */
}
  • 使用
<!-- html -->
<div id='waterfall'>
  <div class='box'>
    <item />
    <item />
    <item />
    ...
  </div>
</div>
/* css */
#waterfall {
  width: 100%;
}

item {
  width: 48%; /* 需要提前指定子元素宽度 */
}
/* js */
const el = document.getElementById('waterfall')
const waterfall = new Waterfall(el)

waterfall.reset() // 在实例化后待内容区生成后需要调用一次reset来确认布局
  • api
waterfall.reset(transition = 0)

重新布局,参数 transition 为布局时的过渡时间,reset 用于重新布局或删除元素后布局或插入元素后布局。

waterfall.update()

更新布局,在往后添加元素后使用。

waterfall.destroy()

清理函数,在 waterfall 时解绑绑定的事件。

  • 注意

    1. 在内容区的子元素宽度应一致。
    2. 请为带有图片等延迟加载资源的子元素设置高度,例如:
      <子元素>
        <img src='xxx' height='xxx' />
      </子元素>
    1. Waterfall 实例化后请在内容区取得第一个子元素时调用 waterfall.reset(),因为在实例化时 Waterfall 并没有对布局情况进行记录,需要通过 waterfall.reset() 进行记录,才可以使用 waterfall.update()。

LazyLoad

具有针对图片进行懒加载的功能。

  • 工作原理

    • 用户为图片设置 [data-src] 属性,然后由 LazyLoad 获取所有含有 [data-src] 属性的元素。
    • LazyLoad 对含有 [data-src] 属性的元素进行存储。
    • 监听每个含有 [data-src] 属性的元素的最近设置了 [overflow:scroll] 的父元素的各种事件(由用户传入,默认监听 scroll 事件)。
    • 通过事件判断含有 [data-src] 属性的元素的位置是否进入浏览器视口,如果进入则把元素的属性 [data-src] 上的值赋值给属性 [src]。
    • 符合条件的元素将被 LazyLoad 在存储容器中移除,从而实现懒加载功能。
  • 配置参数类型

type Options = {
    preload: number, /* 预加载的宽高,默认为 1 */
    loading: string, /* 加载中的显示的图片的路径,默认为 '' */
    error: string, /* 加载失败时现实的图片的路径,默认为 '' */
    attempt: number, /* 失败后尝试加载的次数,默认为 3 次 */
    throttle: number,  /* 节流时间,默认为 200ms */
    eventListener: Array<string> /* 需要监听的事件,以数组的形式传入事件名称,默认为 ['scroll'] */
}
  • 使用
<!-- html -->
<img data-src='xxx.com' src='' />
/* js */
const lazyLoad = new LazyLoad({/* 配置参数,也可以不传使用默认参数 */})
  • API
lazyLoad.update()

在视图发生更新后调用,使 LazyLoad 获取带有属性 [data-src] 的元素并存储。

lazyLoad.render()

在插件内部会在监听事件的时候自动调用,也可以手动调用该方法。

  • 注意

    在每次更新视图时(如增加了带有 data-src 属性的图片),请调用 lazyLoad.update(),以便使 lazyLoad 获取这些图片进行懒加载管理。


EventListener

事件代理池,为目标元素劫持事件,方便管理该元素的事件,该类适用于一些需要绑定多个或多种事件的元素。

  • 使用
const el = document.body
// 生成实例,为 el 元素绑定一个 click 事件
const eventListener = new EventListener(
  el,
  {
    click: [function() { console.log(444) }], // click 可以是数组,也可以是方法
  }
)

// 以下几种方法都可以使 el 的 click 事件发生改变,用户可以随心所欲地改变数组内的方法或直接给 click 赋值一个方法
eventListener.on.click = [() => console.log(555)]
eventListener.on.click.pop()
delete eventListener.on.click[0]


delete eventListener.on.click // el 的 click 事件被移除
  • 事件代理池类型
type Listener<T> = (ev: T) => void
type ListenerHandler = Listener<any> | Array<Listener<any>>

/**
 * 事件绑定对象类型,key 为事件名称,value 为事件函数或者事件函数数组
 * 
 * {
 *    click: [fn1, fn2, fn3],
 *    change: fn,
 *    ...
 * }
 */
type On = {
  [N in keyof HTMLElementEventMap]?: // HTMLElementEventMap 事件名类型
  | Listener<HTMLElementEventMap[N]>
  | Array<Listener<HTMLElementEventMap[N]>>
} & {
  [event: string]: ListenerHandler
}
  • API
const eventListener = new EventListener(
  el: HTMLElement,
  on?: On
)

实例化事件代理池,并为 el 元素绑定 on 对象中的事件。

eventListener.reflect(On)

重新劫持一个事件代理池 On。

  • 杂项

    EventListener 并不是真正的绑定事件,而是获取事件代理池 on 对象中的键,如果键存在,则以键作为事件名称绑定一个侦听器,当事件被触发会调用侦听器,由侦听器去遍历 on 对象中对应键中的方法数组并调用,这实际上是一个代理操作。


走马灯,用于商品走马观花地展示。

  • 配置参数类型
type Options = {
    speed?: number /* 可选值,速率,必须大于 0,默认值为 1 */,
}
  • 使用
<!-- html -->
<div id='carousel'>
  <div class='box'>
    <item />
    <item />
    <item />
    ...
  </div>
</div>
/* css */
#carousel {
  width: 100%;
}
/* js */
const el = document.getElementById('carousel')
const carousel = new Carousel(el)
  • api
carousel.destroy()

清理函数,在 carousel 时解绑绑定的事件。


Readme

Keywords

Package Sidebar

Install

npm i h-tools-js

Weekly Downloads

60

Version

2.0.0

License

MIT

Unpacked Size

152 kB

Total Files

19

Last publish

Collaborators

  • qq1069532844