diff --git a/src/components/clock/clock-style.ts b/src/components/clock/clock-style.ts index e6403a3..0fe00b5 100644 --- a/src/components/clock/clock-style.ts +++ b/src/components/clock/clock-style.ts @@ -1,5 +1,56 @@ import {css, CSSResult} from 'lit' export const sharedStyles: CSSResult = css` + @media (prefers-color-scheme: light) { + :host{ + /* 商务/组件浅/ 表盘渐变-毛玻璃 */ + --back-clock-border: radial-gradient( + rgba(230, 225, 225, 0.85), + rgba(232, 246, 255, 1), + rgba(204, 211, 219, 0.85) + ); + --back-clock-case: linear-gradient( + 145.7deg, + rgba(179, 193, 242, 0.8) 16.24%, + rgba(122, 130, 161, 0.8) 94.91% + ); + --back-clock-box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.15); + --back-clock-backdrop-filter:blur(20px); + } + .star-clock-hour-hand { + background: url('./src/components/clock/svg/light_hour.svg') no-repeat; + } + .star-clock-minute-hand { + background: url('./src/components/clock/svg/light_minute.svg') no-repeat; + } + .star-clock-second-hand { + background: url('./src/components/clock/svg/second.svg') no-repeat; + } + } + @media (prefers-color-scheme: dark) { + :host{ + /* 商务/组件深/ 表盘渐变-毛玻璃 */ + --back-clock-border: linear-gradient( + rgba(217, 195, 147, 1), + rgba(217, 201, 165, 0.45) + ); + --back-clock-case: radial-gradient( + 46.11% 46.11% at 29.45% 23.09%, + rgba(64, 70, 89, 0.8) 0%, + rgba(36, 40, 56, 0.8) 100% + ); + --back-clock-box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.08); + --back-clock-backdrop-filter:blur(20.3871px); + } + .star-clock-hour-hand { + background: url('./src/components/clock/svg/dark_hour.svg') no-repeat; + } + .star-clock-minute-hand { + background: url('./src/components/clock/svg/dark_minute.svg') no-repeat; + } + .star-clock-second-hand { + background: url('./src/components/clock/svg/second.svg') no-repeat; + } + } * { margin: 0; padding: 0; @@ -24,10 +75,7 @@ export const sharedStyles: CSSResult = css` align-items: center; border-radius: 50%; flex-direction: column; - background: linear-gradient( - rgba(217, 195, 147, 1), - rgba(217, 201, 165, 0.45) - ); + background: var(--back-clock-border); } .star-clock-case { position: relative; @@ -38,13 +86,9 @@ export const sharedStyles: CSSResult = css` display: flex; justify-content: center; align-items: center; - box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.08); - backdrop-filter: blur(20.3871px); - background: radial-gradient( - 46.11% 46.11% at 29.45% 23.09%, - rgba(64, 70, 89, 0.8) 0%, - rgba(36, 40, 56, 0.8) 100% - ); + box-shadow: var(--back-clock-box-shadow); + backdrop-filter: var(--back-clock-backdrop-filter); + background: var(--back-clock-case); } .star-clock-shaft { position: absolute; @@ -87,7 +131,8 @@ export const sharedStyles: CSSResult = css` position: absolute; bottom: 50%; left: 50%; - height: 25%; + width: 12px; + height: 90px; transform-origin: 0 100%; display: inline-block; transform: rotate(var(--rotateHour)) translate(-50%, 0); @@ -96,7 +141,8 @@ export const sharedStyles: CSSResult = css` position: absolute; bottom: 50%; left: 50%; - height: 35%; + width: 12px; + height: 132px; transform-origin: 0 100%; display: inline-block; transform: rotate(var(--rotateMinute)) translate(-50%, 0); @@ -106,39 +152,14 @@ export const sharedStyles: CSSResult = css` bottom: calc(50% - 17px); left: 50%; display: inline-block; - height: 43%; + width: 4px; + height: 160px; transform-origin: 0 calc(100% - 17px); transform: rotate(var(--rotateSecond)) translate(-50%, 0); } - /*有表盘浅色模式*/ - .star-clock-main.light { - background: radial-gradient( - rgba(230, 225, 225, 0.85), - rgba(232, 246, 255, 1), - rgba(204, 211, 219, 0.85) - ); - } - .light .star-clock-case { - box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.15); - backdrop-filter: blur(20px); - background: linear-gradient( - 145.7deg, - rgba(179, 193, 242, 0.8) 16.24%, - rgba(122, 130, 161, 0.8) 94.91% - ); - } - .light .star-clock-case .star-clock-point { - background: linear-gradient( - 90deg, - rgba(245, 245, 245, 0.95) 0%, - rgba(245, 245, 245, 0.01) 100% - ); - } /*无表盘深色模式*/ .star-clock-case-transparent { display: inline-block; - /* width: var(--autoHeight); - height: var(--autoHeight); */ width: var(--autoWidth); min-width: var(--autoWidth); height: var(--autoWidth); @@ -210,7 +231,4 @@ export const sharedStyles: CSSResult = css` .star-clock-case-transparent.light .star-clock-minute-hand-transparent { background: #ffffff; } - .star-clock-case-transparent.light .star-clock-second-hand-transparent { - background: #f43737; - } ` diff --git a/src/components/clock/clock.ts b/src/components/clock/clock.ts index bda9edb..007ce9d 100644 --- a/src/components/clock/clock.ts +++ b/src/components/clock/clock.ts @@ -1,11 +1,6 @@ import {html, LitElement, CSSResultArray, nothing} from 'lit' import {customElement, property, query, state} from 'lit/decorators.js' import {sharedStyles} from './clock-style' -import darkHour from './svg/dark_hour.svg' -import darkMinute from './svg/dark_minute.svg' -import lightHour from './svg/light_hour.svg' -import lightMinute from './svg/light_minute.svg' -import second from './svg/second.svg' export enum ClockType { Transparent = 'transparent', @@ -17,7 +12,7 @@ export class StarClock extends LitElement { return [sharedStyles] } @property({type: String}) type = '' //时钟样式类型 - @property({type: String}) mode = 'dark' //支持深色模式和浅色模式,默认背景是深色模式 + @property({type: String}) mode = '' //支持深色模式和浅色模式,默认背景是深色模式 @state() rotateHour = 0 @state() rotateMinute = 0 @state() rotateSecond = 0 @@ -57,7 +52,7 @@ export class StarClock extends LitElement { getDialeClock() { return html`
-
+
${[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map( @@ -74,15 +69,9 @@ export class StarClock extends LitElement { ` )} - - - + + +
@@ -100,19 +89,6 @@ export class StarClock extends LitElement { return nothing } } - modeChange(mode: any) { - if (mode === 'light') { - return { - hour: lightHour, - minute: lightMinute, - } - } else { - return { - hour: darkHour, - minute: darkMinute, - } - } - } dateUpdated(date: any) { let timeMy = new Date(date) let hour = timeMy.getHours() @@ -122,14 +98,15 @@ export class StarClock extends LitElement { let minuteTime = Number(minute || 0) + secondTime / 60 //获取分针时间 let hourTime = Number(hour || 0) + minuteTime / 60 //获取时针时间 hourTime >= 12 ? (hourTime -= 12) : '' //24小时转换为12小时 - this.rotateSecond = (secondTime / 60) * 360 - this.rotateMinute = (minuteTime / 60) * 360 - this.rotateHour = (hourTime / 12) * 360 - this.style.setProperty('--rotateSecond', this.rotateSecond + 'deg') - this.style.setProperty('--rotateMinute', this.rotateMinute + 'deg') - this.style.setProperty('--rotateHour', this.rotateHour + 'deg') + let rotateSecond = ((secondTime / 60) * 360).toFixed(1) + let rotateMinute = ((minuteTime / 60) * 360).toFixed(1) + let rotateHour = ((hourTime / 12) * 360).toFixed(1) + this.style.setProperty('--rotateSecond', rotateSecond + 'deg') + this.style.setProperty('--rotateMinute', rotateMinute + 'deg') + this.style.setProperty('--rotateHour', rotateHour + 'deg') } protected firstUpdated() { + this.resize() this.dateUpdated('00:00:00') setInterval(() => { this.dateUpdated(new Date()) diff --git a/src/components/dock/dock.ts b/src/components/dock/dock.ts index 632003a..b0b1ef0 100644 --- a/src/components/dock/dock.ts +++ b/src/components/dock/dock.ts @@ -149,9 +149,6 @@ export default class StarDock extends StarBaseElement { target.master.remove() return target } - realRemoveChild = (element: HTMLElement) => { - element - } realInsertBefore = (element: HTMLElement, reference: HTMLElement) => { element.style.order = reference.style.order @@ -187,7 +184,7 @@ export default class StarDock extends StarBaseElement { this.recorderChild() if (this._children.length) { - this._gridSize = this._children[0].master.offsetWidth + this._gridSize = this._children[0].master.offsetWidth || this._gridSize } } @@ -220,6 +217,8 @@ export default class StarDock extends StarBaseElement { for (const child of children) { if ( child.master === element || + child.container === element || + child.element === element || child.master.compareDocumentPosition(element) & 16 ) { return child @@ -280,9 +279,7 @@ export default class StarDock extends StarBaseElement { break case 'holdstart': - if (this._dnd.delay > 0) { - this.startDrag() - } + this.startDrag() break case 'holdmove': @@ -388,17 +385,21 @@ export default class StarDock extends StarBaseElement { set sortMode(value) { if (value) { - this._dnd.delay = 0 this.gestureDetector.setOption('holdThreshold', 100) this.setAttribute('sort-mode', '') } else { - this._dnd.delay = DEFAULT_DND_TIMEOUT this.gestureDetector.setOption('holdThreshold', DEFAULT_DND_TIMEOUT) this.removeAttribute('sort-mode') } this._sortMode = value } + get elements() { + return this._children.map((child) => { + return child.element + }) + } + /** * 处理拖拽节点进入 dock 或者在 dock 上悬浮移动时的方法 * @param info 拖拽节点和其中心点坐标 diff --git a/src/components/grid-container/container.ts b/src/components/grid-container/container.ts index a44ef47..49c6fc6 100644 --- a/src/components/grid-container/container.ts +++ b/src/components/grid-container/container.ts @@ -570,6 +570,7 @@ export class GaiaContainer extends StarBaseElement { column: child.column, anchorCoordinate: child.anchorCoordinate, folderName: child.folderName, + createTime: child.createTime, } } else { return null diff --git a/src/components/grid-container/gaia-container-child.ts b/src/components/grid-container/gaia-container-child.ts index c5f97c3..8837faf 100644 --- a/src/components/grid-container/gaia-container-child.ts +++ b/src/components/grid-container/gaia-container-child.ts @@ -55,6 +55,8 @@ export default class GaiaContainerChild { center: {x: number; y: number} = {x: 0, y: 0} // 影子容器,用于判断旋转屏幕后能否容纳该组件 _shadowContainer!: HTMLElement + // 建立时间, 用于区分不同小组件 + createTime: number = new Date().getTime() constructor( element: HTMLElement | undefined, diff --git a/src/components/grid-container/gaia-container-folder.ts b/src/components/grid-container/gaia-container-folder.ts index d232c45..a51ca9a 100644 --- a/src/components/grid-container/gaia-container-folder.ts +++ b/src/components/grid-container/gaia-container-folder.ts @@ -34,7 +34,7 @@ export default class GaiaContainerFolder extends GaiaContainerChild { constructor(manager: GaiaContainer, name?: string) { super(undefined, 1, 1, undefined, manager) this.name = this.checkAndGetFolderName(name) - this._id = `folder-${new Date().getTime()}` + this._id = `folder-${this.createTime}` this.init() } diff --git a/src/components/picker/datepicker.css.ts b/src/components/picker/datepicker.css.ts index f043fe9..61b62c7 100644 --- a/src/components/picker/datepicker.css.ts +++ b/src/components/picker/datepicker.css.ts @@ -113,7 +113,7 @@ export default css` } .p-select-title { -webkit-flex: 1; - font-size: 18px; + font-size: 28px; color: #333; text-align: center; } @@ -168,7 +168,6 @@ export default css` } .p-select-body { position: relative; - margin: 20px auto; width: 100%; display: -webkit-flex; -webkit-align-items: center; @@ -463,6 +462,13 @@ export default css` line-height: 30px; letter-spacing: 1px; color: #262626; + /* 字符间距 */ + letter-spacing: 1px; + } + + /* 选项栏flex布局 */ + .p-select-btn { + -webkit-flex: 1; } /**图标样式 */ @@ -476,7 +482,13 @@ export default css` border-radius: 0px; position: absolute; top: 29px; - left: 532px; + right: 40px; + } + .p-select-back-btn { + border-radius: 0px; + position: absolute; + top: 29px; + left: 40px; } /* 滚轮不选项透明化 */ .hasSelected { @@ -484,4 +496,14 @@ export default css` font-size: 36px !important; color: #1d98f0 !important; } + + /* 日期选择器相关 */ + .p-select-date { + display: none; + -webkit-flex: 1; + } + .p-select-time { + display: flex; + -webkit-flex: 1; + } ` diff --git a/src/components/picker/datepicker.ts b/src/components/picker/datepicker.ts index 3e2e9d6..27a3339 100644 --- a/src/components/picker/datepicker.ts +++ b/src/components/picker/datepicker.ts @@ -10,6 +10,9 @@ import datepickerCss from './datepicker.css.js' import check from './svg/check.svg' import close_lm from './svg/close_lm.svg' +/** + * 属性复制函数,将除参数一外的参数值赋值给参数一对应的项 + */ function extend(..._args: any[]) { let name, options, /* src, */ copy let length = arguments.length @@ -29,27 +32,33 @@ function extend(..._args: any[]) { return target } -function isPC() { - let userAgentInfo = navigator.userAgent - let Agents = [ - 'Android', - 'iPhone', - 'SymbianOS', - 'Windows Phone', - 'iPad', - 'iPod', - ] - let flag = true - for (let i = 0; i < Agents.length; i++) { - if (userAgentInfo.indexOf(Agents[i]) > 0) { - flag = false - break - } - } - return flag -} +/** + * 判断设备类型:PC为true,移动设备为false + * 用于后续响应事件类型选择:click或touch + */ +// function isPC() { +// let userAgentInfo = navigator.userAgent +// let Agents = [ +// 'Android', +// 'iPhone', +// 'SymbianOS', +// 'Windows Phone', +// 'iPad', +// 'iPod', +// ] +// let flag = true +// for (let i = 0; i < Agents.length; i++) { +// if (userAgentInfo.indexOf(Agents[i]) > 0) { +// flag = false +// break +// } +// } +// return flag +// } -// picker初始选项 +/** + * 定义Picker参数类型 + */ export interface options { wheels: pickerwheel[] container: string @@ -71,7 +80,10 @@ export interface options { startDate?: '' } -// 时间选择器选项——此处为后续优化部分 +/** + * TimerPicker参数类型 + * 后续与Picker选项结合优化为基础参数类型 + */ export interface opt { container: string scrollType: string @@ -89,28 +101,47 @@ export interface opt { cancel: Function } +/** + * 定义选择项类型 + * json数据对,其中value为数据值,display为显示内容 + */ export type itemdate = { value: number display: string } -// 定义滚轮内容类型 +/** + * 定义滚轮内容类型 + * infinite:是否为无限滚动 + * selected:初始选项 + * data:选择器选项数组 + * label:滚轮之间间隔标志,如‘-’ + */ export type pickerwheel = { - // 无限滚动 infinite: boolean - // 被选项 selected: number - // 滚轮数据 data: Array label?: string } +/** + * 定义返回值类型 + * value:返回值 + * display:显示内容 + * dataIndex:数据索引 + */ export type Result = { value: number display: string dataIndex?: number } +/** + * 定义返回内容类型 + * result:返回值数组 + * scrollIdx:滚轮索引 + * scrollEvt:滚轮事件 + */ export type rs = { result: Result[] scrollIdx?: number @@ -123,17 +154,22 @@ export class PickerBase extends LitElement { return [datepickerCss] } - // 主题样式、小时制、滚动显示模式 + // 主题样式、小时制、滚动显示模式——后续优化 // @property({type: String}) thememodel = '' // @property({type: String}) timepickertype = '' // @property({type: String}) scolltype = '' + + // 选择器类型 @property({type: String}) type = 'base' + // 目标class类名,用于初始化时锚定dom显示位置 public target: any - public self = this + + // item选项栏 public clickTarget!: NodeListOf + + // 初始化参数 public option: options = { - // 滚轮数组 wheels: [], container: 'body', scrollType: '3d', @@ -145,31 +181,31 @@ export class PickerBase extends LitElement { save: function () {}, cancel: function () {}, } - // 行数、选项栏高度、选项大小? + // 行数、选项栏高度、预加载选项数目、3d样式下选项的倾斜角度、返回结果 public rows = 5 public itemHeight: number = 124 public itemSize2d: number = 9 public itemSize3d: number = 9 - public scrolltest: any - // 3d样式下滚动时的倾斜角度 public scroll3dAngle = 360 / (this.itemSize3d * 2) public rs: rs = { result: [], scrollEvt: [], } - getselectedIdx!: Function - generateItems!: Function - createEL!: Function - snap!: Function - getVal!: Function - destroy!: Function - init!: Function + public getselectedIdx!: Function + public generateItems!: Function + public createEL!: Function + public snap!: Function + public getVal!: Function + public destroy!: Function + public init!: Function + + public weekArrayList = ['周日','周一','周二','周三','周四','周五','周六'] constructor() { super() const _this = this - // 遍历获取滚轮上被选项的index值 + // 遍历获取滚轮上初始被选项的index值 this.getselectedIdx = function getselectedIdx(wheel: pickerwheel) { let index = 0 for (let i = 0; i < wheel.data.length; i++) { @@ -182,7 +218,7 @@ export class PickerBase extends LitElement { } return index } - // 选项生成 + // 生成选择项 function generateItems( wheel: pickerwheel, start: number, @@ -199,7 +235,6 @@ export class PickerBase extends LitElement { //选中的位置 start += selectedIdx end += selectedIdx - for (let i = start; i <= end; i++) { let idx = (i < 0 ? len + (i % len) : i) % len value = data[idx].value @@ -208,7 +243,6 @@ export class PickerBase extends LitElement { let deg = 0 let show = 'list-item' deg = (-(i - selectedIdx) * _this.scroll3dAngle) % 360 - if (!infinite) { if (i < 0 || i > len - 1) { show = 'none' @@ -218,37 +252,21 @@ export class PickerBase extends LitElement { } // 通过translateZ控制显示层级 // 对被选中项添加类名hasSelected用于控制透明度 - if (i == selectedIdx) { - html += - '
  • ' + - display + - '
  • ' - } else { - html += - '
  • ' + - display + - '
  • ' - } + html += + '
  • ' + + display + + '
  • ' } else { let opacity = 1 if (!infinite) { @@ -272,6 +290,86 @@ export class PickerBase extends LitElement { } return html } + // 更新Item对应星期数——调试阶段 + /* function updateItems( + wheel: pickerwheel, + start: number, + end: number, + is3d: boolean + ) { + let data = wheel.data + let html = '', + value, + display, + len = data.length, + infinite = wheel.infinite, + selectedIdx = _this.getselectedIdx(wheel) + //选中的位置 + start += selectedIdx + end += selectedIdx + let weekNumber = new Date(_this.year,_this.month-1,selectedIdx).getDay() + for (let i = start; i <= end; i++) { + let idx = (i < 0 ? len + (i % len) : i) % len + value = data[idx].value + display = data[idx].display + if (is3d) { + let deg = 0 + let show = 'list-item' + deg = (-(i - selectedIdx) * _this.scroll3dAngle) % 360 + if (!infinite) { + if (i < 0 || i > len - 1) { + show = 'none' + } else { + show = 'list-item' + } + } + // 通过translateZ控制显示层级 + // 对被选中项添加类名hasSelected用于控制透明度 + html += + '
  • ' + + display + + _this.weekArrayList[weekNumber] + + '
  • ' + weekNumber = (weekNumber+1)%6 + console.log(weekNumber) + } else { + let opacity = 1 + if (!infinite) { + if (i < 0 || i > len - 1) { + opacity = 0 + } else { + opacity = 1 + } + } + html += + '
  • ' + + display + + '
  • ' + } + } + return html + } */ + + /** + * 创建picker + */ function createEL(wheels: pickerwheel[]) { let html = '' html += @@ -282,67 +380,173 @@ export class PickerBase extends LitElement { '">' html += '
    ' html += '
    ' + html += '
    ' html += '' + html += '' + html += '
    ' + if (_this.option.headTitle != '') { html += '
    ' + _this.option.headTitle + '
    ' } + html += '
    ' html += '' + html += '
    ' + html += '
    ' html += '
    ' - html += - '
    ' - for (let i = 0; i < wheels.length; i++) { - let label = wheels[i].label - html += '
    ' - html += '
    ' - html += - '
    ' - html += '
      ' - html += generateItems( - wheels[i], - -_this.itemSize2d, - _this.itemSize2d, - false - ) - html += '
    ' - html += '
    ' - if (_this.option.scrollType == '3d') { - html += '
      ' - html += generateItems( - wheels[i], - -_this.itemSize3d, - _this.itemSize3d, - true - ) - html += '
    ' - } - html += '
    ' - if (label) { + // html += + // '
    ' + if(wheels.length == 5){ + html += '
    ' + for (let i = 0; i < 2; i++) { + let label = wheels[i].label + html += '
    ' + html += '
    ' html += - '
    ' + - label + - '
    ' + '>' + html += '
      ' + html += generateItems( + wheels[i], + -_this.itemSize2d, + _this.itemSize2d, + false + ) + html += '
    ' + html += '
    ' + if (_this.option.scrollType == '3d') { + html += '
      ' + html += generateItems( + wheels[i], + -_this.itemSize3d, + _this.itemSize3d, + true + ) + html += '
    ' + } + html += '
    ' + if (label) { + html += + '
    ' + + label + + '
    ' + } + html += '
    ' } html += '
    ' + html += '
    ' + for (let i = 2; i < 5; i++) { + let label = wheels[i].label + html += '
    ' + html += '
    ' + html += + '
    ' + html += '
      ' + html += generateItems( + wheels[i], + -_this.itemSize2d, + _this.itemSize2d, + false + ) + html += '
    ' + html += '
    ' + if (_this.option.scrollType == '3d') { + html += '
      ' + html += generateItems( + wheels[i], + -_this.itemSize3d, + _this.itemSize3d, + true + ) + html += '
    ' + } + html += '
    ' + if (label) { + html += + '
    ' + + label + + '
    ' + } + html += '
    ' + } + html += '
    ' + }else{ + for (let i = 0; i < wheels.length; i++) { + let label = wheels[i].label + html += '
    ' + html += '
    ' + html += + '
    ' + html += '
      ' + html += generateItems( + wheels[i], + -_this.itemSize2d, + _this.itemSize2d, + false + ) + html += '
    ' + html += '
    ' + if (_this.option.scrollType == '3d') { + html += '
      ' + html += generateItems( + wheels[i], + -_this.itemSize3d, + _this.itemSize3d, + true + ) + html += '
    ' + } + html += '
    ' + if (label) { + html += + '
    ' + + label + + '
    ' + } + html += '
    ' + } } html += '
    ' html += '
    ' @@ -354,6 +558,10 @@ export class PickerBase extends LitElement { node.innerHTML = html _this.shadowRoot!.querySelector(_this.option.container)!.appendChild(node) } + + /** + * 选项边界判断,用于判断是否滑动一个选项的高度 + */ function snap(pos: number) { let pos1 = Math.round(pos), n1 = Math.round(pos1 % _this.itemHeight), @@ -365,6 +573,10 @@ export class PickerBase extends LitElement { return pos - n1 + (pos1 > 0 ? _this.itemHeight : -_this.itemHeight) } } + + /** + * 获取处在显示位置的选项值 + */ function getVal( pos: number, data: itemdate[], @@ -387,7 +599,10 @@ export class PickerBase extends LitElement { } return result } - // item定位 + + /** + * 定位选项位置 + */ function getPosition(el: any) { let style = getComputedStyle(el), matrix = style.transform, @@ -396,6 +611,10 @@ export class PickerBase extends LitElement { px = Number(matrixlist[13] || matrixlist[5]) return px } + + /** + * 移除滚轮 + */ function destroy() { _this.rs = { result: [], @@ -408,6 +627,10 @@ export class PickerBase extends LitElement { box!.remove() }, 300) } + + /** + * 滚轮类 + */ class Scroll { el: any wheel: any @@ -449,19 +672,19 @@ export class PickerBase extends LitElement { init() { this.Run(0, this.opt.scrollY) - if (isPC()) { - this.el.addEventListener( - 'mousedown', - this.touchStart.bind(this), - false - ) - this.el.addEventListener( - 'mousemove', - this.touchMove.bind(this), - false - ) - this.el.addEventListener('mouseup', this.touchEnd.bind(this), false) - } else { + // if (isPC()) { + // this.el.addEventListener( + // 'mousedown', + // this.touchStart.bind(this), + // false + // ) + // this.el.addEventListener( + // 'mousemove', + // this.touchMove.bind(this), + // false + // ) + // this.el.addEventListener('mouseup', this.touchEnd.bind(this), false) + // } else { this.el.addEventListener( 'touchstart', this.touchStart.bind(this), @@ -478,9 +701,8 @@ export class PickerBase extends LitElement { this.touchEnd.bind(this), false ) - } + // } - // let self = this if (_this.option.scrollType == '3d') { //3d点击事件 this.itemClick(this.opt.item3d) @@ -791,15 +1013,18 @@ export class PickerBase extends LitElement { this.scrollTo(_this.rs.result[this.index].value, 0) } } + + /** + * 初始化函数 + */ this.init = function init(wheels: any, target: any, _isInput: any) { //创建DOM createEL(wheels) let el = _this.shadowRoot!.querySelectorAll('.p-select-item') for (let i = 0; i < el.length; i++) { - //滚动栏 + // 创建滚动栏 let scroll = new Scroll(el[i], wheels[i], i) - - //初始结果 + // 初始结果 let res = getVal( scroll.opt.scrollY, scroll.opt.data, @@ -813,10 +1038,52 @@ export class PickerBase extends LitElement { //传出初始结果 _this.option.init(_this.rs) - let submitBtn = _this.shadowRoot!.querySelector('.p-select-submit-btn'), - cancelBtn = _this.shadowRoot!.querySelector('.p-select-cancel-btn') + let submitBtn = _this.shadowRoot!.querySelector('.p-select-submit-btn') as HTMLElement + let cancelBtn = _this.shadowRoot!.querySelector('.p-select-cancel-btn') as HTMLElement + // 日期选择器点击标题事件 + if(this.opt.headResult) { + let title = this.shadowRoot!.querySelector( + '.p-select-title' + ) as HTMLElement + let datepart = _this.shadowRoot!.querySelector('.p-select-date') as HTMLElement + let timepart = _this.shadowRoot!.querySelector('.p-select-time') as HTMLElement + let backbtn = _this.shadowRoot!.querySelector('.p-select-back-btn') as HTMLElement + // let dayitem = _this.shadowRoot!.querySelector('.p-dayitem') as HTMLElement + // let dayitemwheel = _this.shadowRoot!.querySelector('.p-dayitem-wheel') as HTMLElement + title.addEventListener( + 'click', + function () { + datepart.style.display = 'flex' + backbtn.style.display = 'flex' + timepart.style.display = 'none' + cancelBtn.style.display = 'none' + submitBtn.style.display = 'none' + }, + false + ) + backbtn.addEventListener('click',function(){ + datepart.style.display = 'none' + backbtn.style.display = 'none' + timepart.style.display = 'flex' + cancelBtn.style.display = 'flex' + submitBtn.style.display = 'flex' + // dayitem.innerHTML = updateItems( + // wheels[2], + // -_this.itemSize2d, + // _this.itemSize2d, + // false + // ) + // dayitemwheel.innerHTML = updateItems( + // wheels[2], + // -_this.itemSize3d, + // _this.itemSize3d, + // true + // ) + }) + } + // mask = _this.shadowRoot!.querySelector('.p-select-mask') - submitBtn!.addEventListener( + submitBtn.addEventListener( 'click', function () { let attr_rs = [], @@ -840,7 +1107,7 @@ export class PickerBase extends LitElement { }, false ) - cancelBtn!.addEventListener( + cancelBtn.addEventListener( 'click', function () { _this.option.cancel() @@ -866,6 +1133,9 @@ export class PickerBase extends LitElement { } } + /** + * Picker初始化函数 + */ public initPicker(el: string, opt: any) { const _this = this this.clickTarget = _this.shadowRoot!.querySelectorAll( @@ -929,10 +1199,10 @@ export class PickerBase extends LitElement { scrollType: '3d', background: 'light', showLabel: true, //是否显示label - labelType: 'symbol', //label样式:symbol符号 text文字 split分割(需date和time同时存在) + labelType: 'text', //label样式:symbol符号 text文字 split分割(需date和time同时存在) display: 'center', //显示位置 headResult: false, //头部显示结果信息 - date: false, + date: true, time: true, beginYear: new Date().getFullYear() - 100, endYear: new Date().getFullYear() + 100, @@ -990,34 +1260,21 @@ export class PickerBase extends LitElement { ] // 年、月、日、时、分,数据初始化初始化 public initDateInfo() { - // 年 for (let i = this.beginYear; i <= this.endYear; i++) { this.yearData.push({value: i, display: this.addZero(i)}) } - // 月 for (let i = 1; i <= 12; i++) { this.monthData.push({value: i, display: this.addZero(i)}) } - // 日 for (let i = 1; i <= 31; i++) { this.dayData.push({value: i, display: this.addZero(i)}) } - // 时 for (let i = 0; i <= 23; i++) { this.hourData.push({value: i, display: this.addZero(i)}) } - // 分 for (let i = 0; i <= 59; i++) { this.minuteData.push({value: i, display: this.addZero(i)}) } - // 判断显示日期/时间 - if (!this.opt.date) { - this.wheels.splice(0, 3) - } - if (!this.opt.time) { - this.wheels.splice(3, 5) - this.wheels[2].label = ' ' - } // Label控制 if (!this.opt.showLabel) { for (let i = 0; i < this.wheels!.length; i++) { @@ -1025,21 +1282,9 @@ export class PickerBase extends LitElement { } } else { if (this.opt.labelType == 'text') { - if (this.wheels.length == 5) { - var text = ['年', '月', '日', '时', '分', '秒'] - for (var i = 0; i < this.wheels.length; i++) { - this.wheels[i].label = text[i] - } - } else if (this.wheels.length == 3) { - var text = ['年', '月', '日'] - for (var i = 0; i < this.wheels.length; i++) { - this.wheels[i].label = text[i] - } - } else { - var text = ['时', '分'] - for (var i = 0; i < this.wheels.length; i++) { - this.wheels[i].label = text[i] - } + var text = ['年', '月', '日', '时', '分', '秒'] + for (var i = 0; i < this.wheels.length; i++) { + this.wheels[i].label = text[i] } } if (this.opt.labelType == 'split' && this.opt.date && this.opt.time) { @@ -1049,6 +1294,14 @@ export class PickerBase extends LitElement { this.wheels[2].label = '
    ' } } + // 判断是否显示日期/时间 + if (!this.opt.date) { + this.wheels.splice(0, 3) + } + if (!this.opt.time) { + this.wheels.splice(3, 5) + // this.wheels[2].label = ' ' + } } // 判断闰年 @@ -1084,11 +1337,11 @@ export class PickerBase extends LitElement { if (result.length == 5) { this.lastValue = result[0].display + - '-' + + '年' + result[1].display + - '-' + + '月' + result[2].display + - ' ' + + '日' + result[3].display + ':' + result[4].display @@ -1102,10 +1355,18 @@ export class PickerBase extends LitElement { let title = this.shadowRoot!.querySelector( '.p-select-title' ) as HTMLElement - title.innerText = this.lastValue + if(this.opt.date){ + title.innerText = result[0].display +'年' + result[1].display + '月' + }else { + title.innerText = this.lastValue + } + } } + /** + * TimePicker初始化函数 + */ public initTimePicker(el: string, opt: any) { this.initDateInfo() const _this = this @@ -1159,9 +1420,66 @@ export class PickerBase extends LitElement { false ) } - console.log(this.wheels) + } + /** + * TimePicker初始化函数 + */ + public initDatePicker(el: string, opt: any) { + this.initDateInfo() + const _this = this + this.clickTarget = _this.shadowRoot!.querySelectorAll( + el + ) as NodeListOf + this.option = extend(this.option, opt) + for (let i = 0; i < this.clickTarget.length; i++) { + let item = this.clickTarget[i], + wheels = this.option.wheels, + isInput = item.localName == 'input' || item.localName == 'textarea', + attr_rs = item.getAttribute('data-value') + if (attr_rs) { + attr_rs = attr_rs.split(',') + let display = [] + for (let j = 0; j < attr_rs.length; j++) { + wheels[j].selected = attr_rs[j] + let idx = this.getselectedIdx(wheels[j]) + display.push(wheels[j].data[idx].display) + } + if (isInput) { + item.value = display + } else { + item.innerText = display + } + } + if (isInput) { + item.setAttribute('readonly', 'readonly') + item.setAttribute('unselectable', 'on') + } + item.addEventListener( + 'click', + () => { + let target = item, + wheelsCopy = JSON.parse(JSON.stringify(wheels)), + attr_rs = target.getAttribute('data-value') + target.isInput = isInput + if (isInput) { + target.blur() + } + if (attr_rs) { + let attr_rs1 = attr_rs.split(',') + for (let j = 0; j < attr_rs1.length; j++) { + wheelsCopy[j].selected = attr_rs1[j] + } + this.init(wheelsCopy, target, isInput) + } else { + this.init(wheels, target, isInput) + } + }, + false + ) + } } + // 获取对应位置 @query('.inp') _input: any firstUpdated() { @@ -1186,16 +1504,17 @@ export class PickerBase extends LitElement { }, ], }) - case '.js-time': { + case '.js-time': + this.opt.date = false return this.initTimePicker(test, { wheels: this.wheels, scrollType: this.opt.scrollType, background: this.opt.background, display: this.opt.display, - // headTitle: this.opt.headResult ? 1 : '', headTitle: '新建闹钟', + date: false, container: '.screen', - init: (rs: any) => { + init: (rs:any) => { if (this.opt.date) { var year = rs.result[0].value var month = rs.result[1].value @@ -1203,7 +1522,7 @@ export class PickerBase extends LitElement { } this.getLastVal(rs.result) }, - getResult: (rs: any) => { + getResult: (rs:any) => { var n1 = this.opt.date && (rs.scrollIdx == 0 || rs.scrollIdx == 1) ;(this.year = rs.result[0].value), (this.month = rs.result[1].value) if (n1) { @@ -1224,7 +1543,45 @@ export class PickerBase extends LitElement { this.opt.cancel() }, }) - } + case '.js-date': + this.opt.headResult = true + return this.initDatePicker(test, { + wheels: this.wheels, + scrollType: this.opt.scrollType, + background: this.opt.background, + display: this.opt.display, + headTitle: this.opt.headResult ? 1 : '', + headResult: true, + container: '.screen', + init: (rs:any) => { + if (this.opt.date) { + var year = rs.result[0].value + var month = rs.result[1].value + this.bigSmallMonth(rs.scrollEvt[2], year, month) + } + this.getLastVal(rs.result) + }, + getResult: (rs:any) => { + var n1 = this.opt.date && (rs.scrollIdx == 0 || rs.scrollIdx == 1) + ;(this.year = rs.result[0].value), (this.month = rs.result[1].value) + if (n1) { + this.bigSmallMonth(rs.scrollEvt[2], this.year, this.month) + } + this.getLastVal(rs.result) + }, + save: (_rs:any, target:any) => { + if (target.isInput) { + target.value = this.lastValue + } else { + target.innerText = this.lastValue + } + + this.opt.save(this.lastValue, target) + }, + cancel: () => { + this.opt.cancel() + }, + }) } } @@ -1237,11 +1594,20 @@ export class PickerBase extends LitElement { ` } + public getTimePicker(): HTMLTemplateResult { + return html` +
    +
    TimePicker
    + +
    + ` + } + public getDatePicker(): HTMLTemplateResult { return html`
    DatePicker
    - +
    ` } @@ -1250,6 +1616,8 @@ export class PickerBase extends LitElement { switch (this.type) { case 'base': return this.getBase() + case 'timepicker': + return this.getTimePicker() case 'datepicker': return this.getDatePicker() default: diff --git a/src/components/slider/README.md b/src/components/slider/README.md index e5d8d17..77cce3c 100644 --- a/src/components/slider/README.md +++ b/src/components/slider/README.md @@ -4,6 +4,7 @@ - 滑块空间 - 滑块拖动后返回 value 值 +- `showZero()` 方法可以实现点击图标,进程条动效归零以及动效恢复点击前的状态 ## 类型包括: @@ -24,7 +25,7 @@ ``` -1. `disabled` --- 禁用滑块 +3. `disabled` --- 禁用滑块 ``` @@ -81,7 +82,7 @@ ``` -1. 列滑块 - 下侧图标 +9. 列滑块 - 下侧图标 - `slot="icon"` 表示图标在 slider 下部 ``` @@ -89,7 +90,3 @@
    ``` - -## 后续需解决的问题: - -- 后续用 flex 布局重新调整图标位置 diff --git a/src/components/slider/slider-styles.ts b/src/components/slider/slider-styles.ts index e4041fd..fc2f19a 100644 --- a/src/components/slider/slider-styles.ts +++ b/src/components/slider/slider-styles.ts @@ -75,6 +75,11 @@ export const sharedStyles: CSSResult = css` border-radius: 50%; z-index: 1; } + /*动效:进度条变为0 */ + .showZero { + height: 0px; + transition: height 0.2s; + } p { position: absolute; right: 5px; diff --git a/src/components/slider/slider.ts b/src/components/slider/slider.ts index 3797bb5..ecf8e5f 100644 --- a/src/components/slider/slider.ts +++ b/src/components/slider/slider.ts @@ -30,6 +30,7 @@ export class StarSlider extends LitElement { @property({type: Boolean}) disabled = false @property({type: Boolean}) tick = false @property({type: Boolean}) vertical = false + @property({type: Boolean}) mute = false @property({type: Number}) startX = 0 @property({type: Number}) startY = 0 @property({type: Number}) touchX = 0 @@ -107,11 +108,6 @@ export class StarSlider extends LitElement { protected firstUpdated( _changedProperties: PropertyValueMap | Map ): void { - // if (this.vertical) { - // this.touchStart = this.touchStartVertical - // this.touchEnd = this.touchEndVertical - // this.touchMove = this.touchMoveVertical - // } if (this.tick) { var tickStep = 100 / parseInt(this.step) for (let i = 0; i <= tickStep; i++) { @@ -124,9 +120,12 @@ export class StarSlider extends LitElement { } private touchStart(evt: TouchEvent) { - if (!this.disabled) { + if ( + !this.disabled && + (evt.target as Element).slot !== 'l-icon' && + (evt.target as Element).slot !== 'r-icon' + ) { this.touchX = evt.touches[0].clientX //手指触摸的 x 坐标 - // 黑色覆盖部分 this.barX = this.touchX - @@ -170,7 +169,11 @@ export class StarSlider extends LitElement { } } private touchMove(evt: TouchEvent) { - if (!this.disabled) { + if ( + !this.disabled && + (evt.target as Element).slot !== 'l-icon' && + (evt.target as Element).slot !== 'r-icon' + ) { //阻止默认行为 evt.preventDefault() this.touchX = evt.touches[0].clientX //整个屏幕实时触摸的 X 坐标 @@ -242,9 +245,13 @@ export class StarSlider extends LitElement { } private touchStartVertical(evt: TouchEvent) { - if (!this.disabled) { + // if ((evt.target as Element).slot === 'icon') { + // this.showZero() + // } + if (!this.disabled && (evt.target as Element).slot !== 'icon') { + //去除点击静音键而添加的 .showZero + this.vProgress.classList.remove('showZero') this.startY = evt.touches[0].clientY //手指点下的初始 Y 坐标 - this.barWidth = this.vSliderBar.offsetHeight //总长度 this.dotL = this.vSliderBar.getBoundingClientRect().bottom - this.startY //点击后的黑条长度 @@ -261,7 +268,8 @@ export class StarSlider extends LitElement { } } private touchMoveVertical(evt: TouchEvent) { - if (!this.disabled) { + if (!this.disabled && (evt.target as Element).slot !== 'icon') { + this.vProgress.removeAttribute('style') //阻止默认行为 evt.preventDefault() this.touchY = evt.touches[0].clientY //整个屏幕实时触摸的 Y 坐标 @@ -283,8 +291,8 @@ export class StarSlider extends LitElement { this.style.setProperty('--cover-width', this.newY + 'px') } } - private touchEndVertical(_: TouchEvent): string | void { - if (!this.disabled) { + private touchEndVertical(evt: TouchEvent): string | void { + if (!this.disabled && (evt.target as Element).slot !== 'icon') { this.vProgress.style.setProperty('--vWidth', '8px') this.vSliderBar.style.setProperty('--vWidth', '8px') this.dispatchEvent( @@ -298,6 +306,10 @@ export class StarSlider extends LitElement { ) } } + showZero() { + this.vProgress.classList.toggle('showZero') + this.vProgress.style.setProperty('transition', 'height .2s') + } } declare global { interface HTMLElementTagNameMap { diff --git a/src/components/swiper/README.md b/src/components/swiper/README.md new file mode 100644 index 0000000..a7c258c --- /dev/null +++ b/src/components/swiper/README.md @@ -0,0 +1,6 @@ +## star-switch + +星光 Web 组件 --- Swiper 组件(10 月 17 日) + + + diff --git a/src/components/swiper/index.ts b/src/components/swiper/index.ts new file mode 100644 index 0000000..327f403 --- /dev/null +++ b/src/components/swiper/index.ts @@ -0,0 +1 @@ +export * from './swiper.js' diff --git a/src/components/swiper/package.json b/src/components/swiper/package.json new file mode 100644 index 0000000..ac0760b --- /dev/null +++ b/src/components/swiper/package.json @@ -0,0 +1,22 @@ +{ + "name": "@star-web-components/swiper", + "version": "0.0.1", + "description": "", + "type": "module", + "main": "./index.js", + "module": "./index.js", + "exports": { + ".": { + "default": "./index.js" + }, + "./index": { + "default": "./index.js" + }, + "./switch.js": { + "default": "./switch.js" + }, + "./package.json": "./package.json" + }, + "author": "", + "license": "ISC" +} \ No newline at end of file diff --git a/src/components/swiper/swiper-styles.ts b/src/components/swiper/swiper-styles.ts new file mode 100644 index 0000000..1d83b28 --- /dev/null +++ b/src/components/swiper/swiper-styles.ts @@ -0,0 +1,128 @@ +import {css, CSSResult} from 'lit' +export const sharedStyles: CSSResult = css` + .swiperfigure { + position: relative; + width: 100vw; + height: 100vh; + margin: 0 auto; + /* background-color: gray; */ + overflow: hidden; + } + .swiperborder { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -60%); + width: calc(100% * 13 / 30); + height: calc(100% * 13 / 30); + border-radius: 12px; + border: 3px solid #fafafa; + z-index: 1; + pointer-events: none; + } + + ul { + position: absolute; + display: flex; + width: 100vw; + /* background-color: skyblue; */ + padding: 0; + left: 0; + top: -8.8%; + right: 0; + bottom: 0; + scale: 1; + margin: auto; + list-style: none; + cursor: pointer; + overflow-x: auto; + overflow: hidden; + transform-origin: center; + height: 43.333333vh; + /* scroll-snap-type: x mandatory; */ + scrollbar-width: none; + scroll-behavior: smooth; + // will-change: scale; + } + .previewTransition { + transition: scale 0.3s, transform 0.3s !important; + } + .previewEnlarge { + /* + height: 116vh; + transform: translateY(7%); + transition: height 0.3s; + */ + transform: translateY(4.5%); + scale: 2.31; + z-index: 2; + } + + /* 色块 */ + #testimg { + background-color: pink; + height: 43.333333vh; + width: 43.333333vw; + border-radius: 10px; + /* */ + font-size: 180px; + display: flex; + justify-content: center; + align-items: center; + } + li { + float: left; + width: 43.333333vw; + height: 100%; + margin-right: 10.3vw; + /* scroll-snap-align: center; */ + } + img { + border-radius: 10px; + height: 100%; + transition: border-radius 0.3s; + } + .imgBorder { + border-radius: 0px; + transition: border-radius 0.3s; + } + + .bottom { + width: 100%; + position: absolute; + bottom: 2.8%; + z-index: 100; + } + + #submit { + margin: 0; + padding: 0; + position: absolute; + width: 43.333333vw; + height: 97%; + left: 50%; + transform: translateX(-50%); + z-index: 2; + } + p { + position: relative; + font-family: 'OPPOSans'; + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 18px; + z-index: 3; + } + + #button { + letter-spacing: 6px; + color: #f0f0f0; + font-size: 17px; + line-height: 17px; + top: -2px; + } + .flex { + display: flex; + justify-content: space-around; + } +` diff --git a/src/components/swiper/swiper.ts b/src/components/swiper/swiper.ts new file mode 100644 index 0000000..e6e9c0f --- /dev/null +++ b/src/components/swiper/swiper.ts @@ -0,0 +1,270 @@ +import {html, LitElement, CSSResultArray, PropertyValueMap} from 'lit' +import {customElement, property, query, queryAll} from 'lit/decorators.js' +import {sharedStyles} from './swiper-styles.js' +@customElement('star-swiper') +export class StarLockNumber extends LitElement { + public static override get styles(): CSSResultArray { + return [sharedStyles] + } + @query('#cancel') cancelButton!: HTMLParagraphElement + @query('#preview') previewButton!: HTMLParagraphElement + @query('#button') button!: HTMLParagraphElement + @query('.swiperfigure') swiperfigure!: HTMLDivElement + @query('ul') + cur_ul!: HTMLUListElement + @queryAll('li') cur_lis!: NodeListOf + @query('li') cur_li!: HTMLLIElement + // @queryAll('img') imgs!: NodeListOf + @queryAll('#testimg') testimgs!: NodeListOf + @query('#testimg') img!: HTMLDivElement + @query('.swiperborder') swiperborder!: HTMLDivElement + @property({type: Boolean}) enlarge = false + @property({type: Array}) figure_arr: any[] = [] + @property({type: String}) cancelText = '取消' + @property({type: String}) previewText = '预览' + @property({type: String}) applicationText = '应用' + @property({type: Number}) index = 1 //初始化图片 + @property({type: Number}) carouselX = 0 //轮播图到左边框的距离 + @property({type: Number}) distanceX = 0 //轮播图移动的距离 + @property({type: Number}) touchX = 0 //手指第一次按下的位置 + @property({type: Number}) cur_li_margin_right = + 0.103 * document.documentElement.offsetWidth + @property({type: Number}) cur_li_width = + 0.43333333 * document.documentElement.offsetWidth + @property({type: Number}) initial_position = 28.4 - 53.6 * this.index //初始位置 + @property({type: Number}) cur_ul_width = 0 //初始 ul 宽度 + + constructor() { + super() + console.log('constructor') + } + + render() { + return html` +
    +
    +
    +
      +
      +
      + +
      +

      ${this.cancelText}

      +

      ${this.applicationText}

      +

      ${this.previewText}

      +
      +
      +
      + ` + } + protected firstUpdated( + _changedProperties: PropertyValueMap | Map + ): void { + //全面阻止移动端事件的默认行为 + document.addEventListener('touchstart', function (ev: TouchEvent) { + ev.preventDefault() + }) + console.log('firstUpdated') + //图片数组(模拟从后台获取到的图片路径) + var cur_img = [ + 'src/components/swiper/figure/1.png', + 'src/components/swiper/figure/2.png', + 'src/components/swiper/figure/3.png', + 'src/components/swiper/figure/4.png', + 'src/components/swiper/figure/5.png', + ] + //轮播图函数 + this.carousel(cur_img) + this.figure_arr = cur_img + this.cur_ul.addEventListener('transitionend', () => { + this.enlarge + ? this.swiperborder.style.setProperty('visibility', 'hidden') + : this.swiperborder.style.setProperty('visibility', 'visible') + }) + /* 确定刚开始的位置 */ + this.cur_ul.style.setProperty('left', 28.4 - 53.6 * this.index + 'vw') + this.ulWidth(this.enlarge) + } + carousel(arr: any) { + if (this.swiperfigure) { + for (var i = 0; i < arr.length; i++) { + this.cur_ul.innerHTML += '
    • ' + i + '
    • ' + } + } + } + ulWidth(enlarge: Boolean) { + if (enlarge) { + console.log('预览') + this.cur_ul_width = + (this.figure_arr.length + 1) * + (this.cur_li_width + this.cur_li_margin_right) * + 2.31 + this.cur_ul.style.setProperty('width', this.cur_ul_width + 'px') + this.cur_ul.style.setProperty('left', 487 - 124 * this.index + 'vw') + } else { + console.log('非预览') + this.cur_ul_width = + (this.figure_arr.length + 1) * + (this.cur_li_width + this.cur_li_margin_right) + this.cur_ul.style.setProperty('width', this.cur_ul_width + 'px') + this.cur_ul.style.setProperty('left', 28.4 - 53.6 * this.index + 'vw') + console.log('this.cur_li_width', this.cur_li_width) + console.log('this.cur_li_margin_right', this.cur_li_margin_right) + console.log('this.figure_arr.length + 1', this.figure_arr.length + 1) + console.log('this.cur_ul_width', this.cur_ul_width) + } + } + + touchStartImg(e: TouchEvent) { + //去除对于left的transition效果 + this.cur_ul.classList.remove('previewTransition') + this.cur_ul.style.removeProperty('transition') + this.touchX = e.changedTouches[0].clientX + this.carouselX = this.cur_ul.offsetLeft //ul到左边框的距离 + } + touchMoveImg(e: TouchEvent) { + let nowX = e.changedTouches[0].clientX + this.distanceX = nowX - this.touchX //移动的距离 + this.cur_ul.style.setProperty( + 'left', + this.carouselX + this.distanceX + 'px' + ) + } + touchEndImg(_e: TouchEvent) { + if (!this.enlarge) { + //滑动的阈值为Math.abs(25vw),小于阈值回到原位置 + let x = 0.25 * document.documentElement.clientWidth + if (Math.abs(this.distanceX) > x) { + //index 为 0 | this.figure_arr.length-1 时的特殊处理 + if (this.index == 0 && this.distanceX > x) { + this.index = 0 + } else if ( + this.index == this.figure_arr.length - 1 && + this.distanceX < -x + ) { + this.index = this.figure_arr.length - 1 + } else { + if (this.distanceX < -x) { + //往右滑一张图片 + ++this.index + } else if (this.distanceX > x) { + //往左滑一张图片 + --this.index + } + } + } + this.cur_ul.style.setProperty('left', 28.4 - 53.6 * this.index + 'vw') + this.cur_ul.style.setProperty( + 'transition', + 'left .3s cubic-bezier(.05,.62,.42,.9)' + ) + console.log('index', this.index) + //清零移动距离 + this.distanceX = 0 + } else { + //滑动的阈值为Math.abs(25*2.31vw),小于阈值回到原位置 + let x = 0.25 * 2.31 * document.documentElement.clientWidth + if (Math.abs(this.distanceX) > x) { + //index 为 0 | this.figure_arr.length-1 时的特殊处理 + if (this.index == 0 && this.distanceX > x) { + this.index = 0 + } else if ( + this.index == this.figure_arr.length - 1 && + this.distanceX < -x + ) { + this.index = this.figure_arr.length - 1 + } else { + if (this.distanceX < -x) { + //往右滑一张图片 + ++this.index + } else if (this.distanceX > x) { + //往左滑一张图片 + --this.index + } + } + } + this.cur_ul.style.setProperty('left', 487 - 124 * this.index + 'vw') + this.cur_ul.style.setProperty( + 'transition', + 'left .3s cubic-bezier(.05,.62,.42,.9)' + ) + console.log('index', this.index) + //清零移动距离 + this.distanceX = 0 + } + } + + touchStartBottom(e: TouchEvent) { + if ((e.target as Element).id === 'cancel') { + //点击取消 + console.log('cancel') + this.dispatchEvent( + new CustomEvent('star-swiper-cancel', { + detail: { + value: true, + }, + bubbles: true, + composed: true, + }) + ) + } else if ((e.target as Element).id === 'preview') { + //点击预览 + this.dispatchEvent( + new CustomEvent('star-swiper-preview', { + detail: { + value: this.index, + }, + bubbles: true, + composed: true, + }) + ) + this.preview() + } else if ( + (e.target as Element).id === 'button' || + (e.target as Element).tagName === 'STAR-BUTTON' + ) { + //点击应用 + console.log('submit') + this.dispatchEvent( + new CustomEvent('star-swiper-submit', { + detail: { + value: this.index, + }, + bubbles: true, + composed: true, + }) + ) + //预览时点击应用会保存预览变大的状态 + this.enlarge ? this.preview() : '' + } + } + preview() { + this.enlarge = !this.enlarge + //隐藏取消按钮,更换预览为退出 + if (this.enlarge) { + this.cancelButton.style.setProperty('visibility', 'hidden') + this.previewText = '退出' + } else { + this.cancelButton.style.setProperty('visibility', 'visible') + this.previewText = '预览' + } + this.ulWidth(this.enlarge) + for (let i = 0; i < this.cur_lis.length; i++) { + this.enlarge + ? this.testimgs[i].setAttribute('style', 'border-radius:0px') + : this.testimgs[i].setAttribute('style', 'border-radius:10px') + } + this.cur_ul.classList.add('previewTransition') + this.cur_ul.classList.toggle('previewEnlarge') + this.cur_ul.style.setProperty('transition', 'height .3s') + } +} diff --git a/src/components/swiper/tsconfig.json b/src/components/swiper/tsconfig.json new file mode 100644 index 0000000..977a913 --- /dev/null +++ b/src/components/swiper/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "composite": true, + "rootDir": "../../" + }, + "include": ["*.ts"] +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 5bfe78c..056eb19 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,8 +26,8 @@ import './components/pattern-view/pattern-view' import './components/overlay/active-overlay' import './components/battery/battery' import './components/battery-square/battery-square' -// import './components/picker/timepicker' -import './components/animation/animaiton' +import './components/picker/datepicker' +import './components/swiper/swiper' @customElement('settings-app') export class SettingsApp extends LitElement { @query('star-animate-section#root') private rootSection!: StarAnimateSection diff --git a/src/test/panels/clock/clock.ts b/src/test/panels/clock/clock.ts index 50fa820..fa1bc9d 100644 --- a/src/test/panels/clock/clock.ts +++ b/src/test/panels/clock/clock.ts @@ -25,7 +25,7 @@ export class PanelClock extends LitElement {
      - +

      + + + +
      ` } diff --git a/src/test/panels/root.ts b/src/test/panels/root.ts index 78baebe..4e7498c 100644 --- a/src/test/panels/root.ts +++ b/src/test/panels/root.ts @@ -37,6 +37,7 @@ import './slider/slider' import './switch/switch' import './toast/toast' import './weather/weather' +import './swiper/swiper' import './animation/animation' type SEID = string @@ -145,7 +146,7 @@ export class PanelRoot extends LitElement {
      +
      +
      + + + ` + } +} + +declare global { + interface HTMLElementTagNameMap { + 'panel-swiper': PanelSwiper + } +}