|
@@ -0,0 +1,195 @@
|
|
|
+import { Button, Popup } from 'vant'
|
|
|
+import {} from 'vant'
|
|
|
+import { defineComponent, nextTick, onMounted, reactive, ref, watch } from 'vue'
|
|
|
+import styles from './index.module.less'
|
|
|
+import { getImage } from './images'
|
|
|
+
|
|
|
+export default defineComponent({
|
|
|
+ name: 'tips-tip1',
|
|
|
+ emits: ['hanldeStop'],
|
|
|
+ setup(props, { emit }) {
|
|
|
+ const steps = [
|
|
|
+ {
|
|
|
+ img: getImage('m1.png'),
|
|
|
+ btnsStyle: {
|
|
|
+ top: '2.6rem',
|
|
|
+ },
|
|
|
+ handStyle: {
|
|
|
+ top: '0.8rem',
|
|
|
+ left: '0.22rem',
|
|
|
+ },
|
|
|
+ imgStyle: {
|
|
|
+ top: '0.8rem',
|
|
|
+ left: '-0.1rem',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ img: getImage('m2.png'),
|
|
|
+ btnsStyle: {
|
|
|
+ top: '2.6rem',
|
|
|
+ },
|
|
|
+ handStyle: {
|
|
|
+ top: '0.8rem',
|
|
|
+ left: '0.22rem',
|
|
|
+ },
|
|
|
+ imgStyle: {
|
|
|
+ width: '2.66667rem',
|
|
|
+ top: '0.9rem',
|
|
|
+ left: '-0.1rem',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ img: getImage('m3.png'),
|
|
|
+ btnsStyle: {
|
|
|
+ top: '2.8rem',
|
|
|
+ },
|
|
|
+ handStyle: {
|
|
|
+ top: '0.8rem',
|
|
|
+ left: '0.22rem',
|
|
|
+ },
|
|
|
+ imgStyle: {
|
|
|
+ width: '2.45333rem',
|
|
|
+ top: '0.8rem',
|
|
|
+ left: '-0.1rem',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ img: getImage('m4.png'),
|
|
|
+ btnsStyle: {
|
|
|
+ top: '2.8rem',
|
|
|
+ left: '-1.3rem',
|
|
|
+ },
|
|
|
+ handStyle: {
|
|
|
+ top: '0.8rem',
|
|
|
+ left: '0.22rem',
|
|
|
+ },
|
|
|
+ imgStyle: {
|
|
|
+ width: '2.45333rem',
|
|
|
+ top: '0.8rem',
|
|
|
+ left: '-1.6rem',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ img: getImage('m5.png'),
|
|
|
+ btnsStyle: {
|
|
|
+ top: '2.6rem',
|
|
|
+ left: '-1.9rem',
|
|
|
+ width: '2.93333rem',
|
|
|
+ 'justify-content': 'space-evenly',
|
|
|
+ padding: 0,
|
|
|
+ },
|
|
|
+ handStyle: {
|
|
|
+ top: '0.8rem',
|
|
|
+ left: '0.22rem',
|
|
|
+ },
|
|
|
+ imgStyle: {
|
|
|
+ top: '0.7rem',
|
|
|
+ left: '-1.9rem',
|
|
|
+ width: '2.93333rem',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ const contentRef = ref<HTMLElement>()
|
|
|
+ const data = reactive({
|
|
|
+ show: false,
|
|
|
+ step: 0,
|
|
|
+ rect: {} as any,
|
|
|
+ })
|
|
|
+ // 开始引导
|
|
|
+ const handleStart = () => {
|
|
|
+ getEle()
|
|
|
+ }
|
|
|
+ onMounted(() => {
|
|
|
+ handleStart()
|
|
|
+ })
|
|
|
+ // 移除之前的
|
|
|
+ const hanldeRemove = () => {
|
|
|
+ const nodes = document.querySelectorAll(`.${styles.parent}`)
|
|
|
+ for (let n of nodes) {
|
|
|
+ n.remove()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 获取需要引导的元素的位置大小
|
|
|
+ */
|
|
|
+ const getEle = () => {
|
|
|
+ hanldeRemove()
|
|
|
+ const ele = document.querySelector(`[data-step='m${data.step + 1}']`)
|
|
|
+ const eleRect = ele?.getBoundingClientRect()
|
|
|
+ const eleNode: any = ele?.cloneNode(true)
|
|
|
+ if (ele && eleRect && contentRef.value) {
|
|
|
+ const parentElement = document.createElement('div')
|
|
|
+ parentElement.classList.add(styles.parent)
|
|
|
+ parentElement.style.left = (eleRect.left - eleRect.width / 2) + 'px'
|
|
|
+ parentElement.style.top = eleRect.top + 'px'
|
|
|
+ // parentElement.style.width = eleRect?.width + 'px'
|
|
|
+ // parentElement.style.height = eleRect?.height + 'px'
|
|
|
+ parentElement.style.borderRadius = '0.1rem'
|
|
|
+ data.rect = {
|
|
|
+ ...eleRect,
|
|
|
+ left : eleRect.left - eleRect.width / 2,
|
|
|
+ top: eleRect.top + 2
|
|
|
+ } || {}
|
|
|
+ parentElement.appendChild(eleNode)
|
|
|
+ contentRef.value?.append(parentElement)
|
|
|
+ console.log('🚀 ~ eleRect', contentRef.value, eleRect, `[data-step='step${data.step}']`)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleNext = (step?: number) => {
|
|
|
+ if (step !== undefined) {
|
|
|
+ data.step = step
|
|
|
+ } else {
|
|
|
+ data.step += 1
|
|
|
+ }
|
|
|
+ getEle()
|
|
|
+ }
|
|
|
+ const handleStop = () => {
|
|
|
+ emit('hanldeStop')
|
|
|
+ }
|
|
|
+ return () => {
|
|
|
+ const item = steps[data.step]
|
|
|
+ return (
|
|
|
+ <div class={styles.content} ref={contentRef}>
|
|
|
+ <div class={styles.backBtn} onClick={() => handleStop()}>
|
|
|
+ 跳过引导
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class={styles.item}
|
|
|
+ style={{
|
|
|
+ width: '2.18667rem',
|
|
|
+ left: `${data.rect?.left}px`,
|
|
|
+ top: `${data.rect?.top}px`,
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <img class={styles.img} style={item.imgStyle} src={item.img} />
|
|
|
+ <img class={styles.iconHead} style={item.handStyle} src={getImage('icon-hand2.png')} />
|
|
|
+ <div class={styles.btns} style={item.btnsStyle}>
|
|
|
+ {data.step + 1 == steps.length ? (
|
|
|
+ <>
|
|
|
+ <Button
|
|
|
+ class={styles.btn}
|
|
|
+ round
|
|
|
+ color="transparent"
|
|
|
+ style={{ 'border-color': '#fff' }}
|
|
|
+ type="primary"
|
|
|
+ onClick={() => handleNext(0)}
|
|
|
+ >
|
|
|
+ 再看一遍
|
|
|
+ </Button>
|
|
|
+ <Button class={styles.btn} round type="primary" onClick={() => handleStop()}>
|
|
|
+ 完成
|
|
|
+ </Button>
|
|
|
+ </>
|
|
|
+ ) : (
|
|
|
+ <Button class={styles.btn} round type="primary" onClick={() => handleNext()}>
|
|
|
+ 下一步 ({data.step + 1}/{steps.length})
|
|
|
+ </Button>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ },
|
|
|
+})
|