@better-scroll/core
Version:
Minimalistic core scrolling for BetterScroll, it is pure and tiny
81 lines (73 loc) • 1.9 kB
text/typescript
import {
style,
safeCSSStyleDeclaration,
EventEmitter,
} from '@better-scroll/shared-utils'
export interface TranslaterPoint {
x: number
y: number
[key: string]: number
}
interface TranslaterMetaData {
x: [string, string]
y: [string, string]
[key: string]: any
}
const translaterMetaData: TranslaterMetaData = {
x: ['translateX', 'px'],
y: ['translateY', 'px'],
}
export default class Translater {
content: HTMLElement
style: CSSStyleDeclaration
hooks: EventEmitter
constructor(content: HTMLElement) {
this.setContent(content)
this.hooks = new EventEmitter(['beforeTranslate', 'translate'])
}
getComputedPosition() {
let cssStyle = window.getComputedStyle(
this.content,
null
) as safeCSSStyleDeclaration
let matrix = cssStyle[style.transform].split(')')[0].split(', ')
const x = +(matrix[12] || matrix[4]) || 0
const y = +(matrix[13] || matrix[5]) || 0
return {
x,
y,
}
}
translate(point: TranslaterPoint) {
let transformStyle = [] as string[]
Object.keys(point).forEach((key) => {
if (!translaterMetaData[key]) {
return
}
const transformFnName = translaterMetaData[key][0]
if (transformFnName) {
const transformFnArgUnit = translaterMetaData[key][1]
const transformFnArg = point[key]
transformStyle.push(
`${transformFnName}(${transformFnArg}${transformFnArgUnit})`
)
}
})
this.hooks.trigger(
this.hooks.eventTypes.beforeTranslate,
transformStyle,
point
)
this.style[style.transform as any] = transformStyle.join(' ')
this.hooks.trigger(this.hooks.eventTypes.translate, point)
}
setContent(content: HTMLElement) {
if (this.content !== content) {
this.content = content
this.style = content.style
}
}
destroy() {
this.hooks.destroy()
}
}