driverGuide.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { driver, type DriveStep, type Config } from 'driver.js'
  2. import 'driver.js/dist/driver.css'
  3. import nextBtnImg from '@/assets/image/next-btn.png'
  4. import previousBtnImg from '@/assets/image/pervious-btn.png'
  5. import doneBtnImg from '@/assets/image/done-btn.png'
  6. /**
  7. * useDriver composable
  8. * @param steps 引导步骤数组
  9. * @param globalConfig 可选的 driver 配置
  10. */
  11. export function useDriver(steps: DriveStep[], globalConfig?: Config) {
  12. const driverInstance = driver({
  13. ...globalConfig,
  14. animate: false,
  15. showProgress: true,
  16. overlayOpacity: 0.7,
  17. overlayColor: '#2b2f36',
  18. showButtons: ['previous', 'next', 'close'],
  19. onPopoverRender: (popoverDOM, { config, state, driver }) => {
  20. globalConfig?.onPopoverRender?.(popoverDOM, { config, state, driver })
  21. const stepsLength = steps.length
  22. const nextBtn = popoverDOM.nextButton
  23. if (nextBtn) {
  24. nextBtn.innerHTML = '' // 清空原内容
  25. const img = document.createElement('img')
  26. img.src = stepsLength - 1 === state.activeIndex ? doneBtnImg : nextBtnImg // 替换成你的图片路径
  27. img.alt = 'next'
  28. img.style.width = '96px'
  29. img.style.height = '36px'
  30. nextBtn.appendChild(img)
  31. }
  32. const previousBtn = popoverDOM.previousButton
  33. if (previousBtn) {
  34. previousBtn.innerHTML = '' // 清空原内容
  35. const img = document.createElement('img')
  36. img.src = previousBtnImg // 替换成你的图片路径
  37. img.alt = 'previous'
  38. img.style.width = '96px'
  39. img.style.height = '36px'
  40. previousBtn.appendChild(img)
  41. img.style.display = state.activeIndex > 0 ? 'block' : 'none' // 如果是第一个步骤,则隐藏上一页按钮
  42. }
  43. }
  44. })
  45. driverInstance.setSteps(steps)
  46. return {
  47. start: (stepIndex = 0) => driverInstance.drive(stepIndex),
  48. moveNext: () => driverInstance.moveNext(),
  49. movePrevious: () => driverInstance.movePrevious(),
  50. highlight: (step: DriveStep) => driverInstance.highlight(step),
  51. destroy: () => driverInstance.destroy(),
  52. isActive: () => driverInstance.isActive(),
  53. hasNextStep: () => driverInstance.hasNextStep(),
  54. moveTo: (stepIndex: number) => driverInstance.moveTo(stepIndex),
  55. driverInstance
  56. }
  57. }