npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

h-tools-js

v2.0.0

Published

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

Downloads

17

Readme

h-tools-js

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


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 对象中对应键中的方法数组并调用,这实际上是一个代理操作。


Carousel

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

  • 配置参数类型
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 时解绑绑定的事件。