初衷
黄奕大佬的开源项目 better-scroll
写挺好的,不过用起来总是感觉不太方便。为了知道原因,有必要去深究一下。
由于篇幅原因,本篇将只对源码做一个简单的概览,具体实现将在后面进行分析。
整体架构
├── better-scroll
├── core
├── infinity
├── mouse-wheel
├── movable
├── nested-scroll
├── observe-dom
├── pull-down
├── pull-up
├── scroll-bar
├── shared-utils
├── slide
├── vuepress-docs
├── wheel
└── zoom
采用了可插拔式架构,core
是插座,infinity
/mouse-wheel
等是插件。
better-scroll
先来看 better-scroll
文件夹下的实现。
import BScroll from '@better-scroll/core'
import MouseWheel from '@better-scroll/mouse-wheel'
// ...
export {
createBScroll,
BScrollInstance,
Options,
CustomOptions,
TranslaterPoint,
MountedBScrollHTMLElement,
Behavior,
Boundary,
CustomAPI
} from '@better-scroll/core'
export {
MouseWheel,
// ...
}
BScroll.use(MouseWheel)
// ...
export default BScroll
整体上是起着一个统一导出的作用,注意 BScroll.use()
的使用,说明该包具备完整的插件能力,当然整体体积也偏大,如果不需要插件能力或者只需要使用到部分插件,那么不推荐使用该包。
core
这是 better-scroll
的核心代码,承载了 better-scroll
的核心滚动能力。
core源码结构
src
├── BScroll.ts
├── Instance.ts
├── Options.ts
├── animater
│ ├── Animation.ts
│ ├── Base.ts
│ ├── Transition.ts
│ └── index.ts
├── base
│ └── ActionsHandler.ts
├── index.ts
├── scroller
│ ├── Actions.ts
│ ├── Behavior.ts
│ ├── DirectionLock.ts
│ ├── Scroller.ts
│ └── createOptions.ts
├── translater
│ └── index.ts
└── utils
├── bubbling.ts
├── compare.ts
└── typesHelper.ts
core源码入口
// index.ts
import { BScroll } from './BScroll'
export { BScrollInstance } from './Instance'
export { Options, CustomOptions } from './Options'
export { TranslaterPoint } from './translater'
export { MountedBScrollHTMLElement } from './BScroll'
export { Behavior, Boundary } from './scroller/Behavior'
export { createBScroll, CustomAPI } from './BScroll'
export default BScroll
可以看到核心代码位于BScroll.ts
,该文件主要作用便是导出BScrollConstructor
类
// BScroll.ts
export class BScrollConstructor<O = {}> extends EventEmitter {
static plugins: PluginItem[] = []
static pluginsMap: PluginsMap = {}
scroller: Scroller
options: OptionsConstructor
hooks: EventEmitter
plugins: { [name: string]: any }
wrapper: HTMLElement
content: HTMLElement
[key: string]: any
static use(ctor: PluginCtor) {}
constructor(el: ElementParam, options?: Options & O) {}
init() {}
refresh() {}
enable() {}
disable() {}
destroy() {}
eventRegister() {}
// ...
}
插件
根据 core 中的源码来看,一个 better-scroll
插件必须包含一个静态属性 pluginName
,用于作为插件的唯一标识。当然这篇文章不会重点去研究插件的实现,感兴趣的小伙伴可以自己研究。
export default class MouseWheel {
static pluginName = 'mouseWheel'
}
shared-utils
这是公用的一些工具,后面会结合源码一起享用。
小结
那我们现在应该清楚了better-scroll
基本架构,core作为滚动的核心部分,扮演着重要的角色,接下来的文章将会终点分析改目录下的源码~
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!