lu2
Version:
Simple and flexible UI component library based on native HTML and JavaScript
53 lines (43 loc) • 1.67 kB
JavaScript
/**
* @description 基于 ScrollSnap 的滑动单元格效果
* @author zhangxinxu
* @created 2022-07-05
*/
class uiScrollSnapCell extends HTMLElement {
constructor () {
super();
this.element = this.element || {};
}
create () {
// 按钮的尺寸,布局计算的处理
let eleButtons = this.element.buttons;
let numWidthButton = 0;
let numLengthButton = eleButtons.length;
if (numLengthButton) {
[...eleButtons].reverse().forEach((button, index) => {
let offsetWidth = button.offsetWidth;
button.style.setProperty('--ui-offset-width', numWidthButton);
button.style.setProperty('--ui-offset-index', index + 1);
// 宽度增加
numWidthButton = numWidthButton + offsetWidth;
});
// 创建占据空间的元素
let eleCell = document.createElement('ui-cell');
eleButtons[0].insertAdjacentElement('beforebegin', eleCell);
this.style.setProperty('--ui-cell-width', numWidthButton + 'px');
// 暴露在外
this.space = this.cell = eleCell;
this.addEventListener('scroll', () => {
this.style.setProperty('--ui-offset-percent', (this.scrollLeft / numWidthButton).toFixed(2));
});
}
}
connectedCallback () {
// 获取按钮元素
this.element.buttons = this.querySelectorAll(':scope > button');
this.create();
}
}
if (!customElements.get('ui-scroll-snap-cell')) {
customElements.define('ui-scroll-snap-cell', uiScrollSnapCell);
}