Driver.js 是什么?

Driver.js 是一个轻量级(约 4kb gzip)、无依赖的原生 JavaScript 库,用于在网页中创建用户引导流程。它通过高亮特定元素、锁定用户交互并展示引导弹窗,帮助用户快速理解页面功能。其核心优势包括:

  • 无依赖:纯 JavaScript 实现,兼容所有主流浏览器。
  • 高度可定制:支持修改按钮文本、背景色、弹窗位置等。
  • 轻量灵活:适合集成到 Vue、React 等框架中,也可直接通过 CDN 引入。

安装

CDN 引入

<script src="https://cdn.jsdelivr.net/npm/driver.js@1.0.1/dist/driver.js.iife.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/driver.js@1.0.1/dist/driver.css"/>

NPM 安装

$ npm install driver.js

driver.js 使用是不区分框架的,在Vue和React中都可以以相同的方式引入

import Driver from 'driver.js';
import 'driver.js/dist/driver.min.css';

const driverObj = driver({
  // ...
})

driverObj.drive()

使用

driver.js 最核心的使用方法都来自于Driver实例,driver(options: Config): Driver
image.png
最常见的用法是通过Driver实例的highlightdrive方法来突出元素。

类型

driver.js 的核心接口类型如下,这些类型用于创建Driver实例。

interface Config {
  steps?: DriveStep[]; // 引导步骤
  animate?: boolean; // 过渡动画
  overlayColor?: string; // 遮罩颜色
  overlayOpacity?: number; // 遮罩透明度
  smoothScroll?: boolean; // 平滑滚动
  allowClose?: boolean; // 允许关闭
  overlayClickBehavior?: "close" | "nextStep"; // 遮罩点击动作
  stagePadding?: number; // 突出元素切口之间的距离
  stageRadius?: number; // 突出元素切口半径
  disableActiveInteraction?: boolean; // 禁用突出元素的交互
  allowKeyboardControl?: boolean; // 允许键盘控制

  // 弹窗配置
  popoverClass?: string; // 弹窗自定义类名
  popoverOffset?: number; // 弹窗偏移
  showButtons?: AllowedButtons[]; // 显示按钮
  disableButtons?: AllowedButtons[]; // 禁用按钮
  showProgress?: boolean; // 显示进度

  // 按钮文案
  progressText?: string; // 进度文案
  nextBtnText?: string; // 下一步按钮文案
  prevBtnText?: string; // 上一步按钮文案
  doneBtnText?: string; // 完成按钮文案

  // 弹窗渲染回调
  onPopoverRender?: (popover: PopoverDOM, opts: { config: Config; state: State, driver: Driver }) => void;

  // 状态变更回调
  onHighlightStarted?: DriverHook; // 突出元素开始显示
  onHighlighted?: DriverHook; // 突出元素显示完成
  onDeselected?: DriverHook; // 取消选择
  onDestroyStarted?: DriverHook; // 突出元素开始取消
  onDestroyed?: DriverHook; // 突出元素取消完成

  // 按钮事件
  onNextClick?: DriverHook; // 下一步点击
  onPrevClick?: DriverHook; // 上一步点击
  onCloseClick?: DriverHook; // 关闭点击
}

上面是driver对象的全局配置,我们还可以通过steps对每一个引导步骤进行配置

interface DriveStep {
  element: ELement | string; // 要突出显示的元素或者css选择器
  popover?: { // 弹窗配置
    title?: string;
    description?: string;
    side?: "top" | "right" | "bottom" | "left";
    align?: "start" | "center" | "end";
    showButtons?: AllowedButtons[]; // 显示按钮
    disableButtons?: AllowedButtons[]; // 禁用按钮
    nextBtnText?: string; // 下一步按钮文案
    prevBtnText?: string; // 上一步按钮文案
    doneBtnText?: string; // 完成按钮文案
    showProgress?: boolean; // 显示进度
    popoverClass?: string; // 弹窗自定义类名
    onPopoverRender?: (popover: PopoverDOM, opts: { config: Config; state: State,}) => void;
    onNextClick?: (popover: PopoverDOM, opts: { config: Config; state: State,}) => void;
    onPrevClick?: (popover: PopoverDOM, opts: { config: Config; state: State,}) => void;
    onCloseClick?: (popover: PopoverDOM, opts: { config: Config; state: State,}) => void;
  };
  onDeselected?: (element?: Element, step: DriveStep, options: { config: Config; state: State }) => void;
  onHighlightStarted?: (element?: Element, step: DriveStep, options: { config: Config; state: State }) => void;
  onHighlighted?: (element?: Element, step: DriveStep, options: { config: Config; state: State }) => void;
}

上面列举了一些生命周期的hook,各个hook的触发时机如下
image.png

API

下面的表格里面列出了driver实例上的一些方法,我们可以利用这些方法操作引导交互。

方法 描述
isActive() 返回驱动程序当前是否处于活动状态
refresh() 强制刷新当前状态
drive(stepIndex?) 从指定的步骤索引开始游览(默认为 0)
setConfig(config) 更新驱动程序的配置
setSteps(steps) 更新游览的步骤数组
getConfig() 返回当前配置
getState(key?) 返回当前状态或特定状态值
getActiveIndex() 返回当前步骤的索引
isFirstStep() 返回当前步骤是否是第一步
isLastStep() 返回当前步骤是否是最后一步
getActiveStep() 返回当前步骤的配置
getActiveElement() 返回当前步骤的 DOM 元素
getPreviousElement() 返回上一步的DOM元素
getPreviousStep() 返回上一步的配置
moveNext() 进入游览的下一步
movePrevious() 移至游览中的上一步
moveTo(index) 移动到游览中的特定步骤
hasNextStep() 返回是否有下一步可用
hasPreviousStep() 返回是否有上一步可用
highlight(step) 使用可选的弹出窗口突出显示单个元素
destroy() 清理驱动程序并删除所有覆盖和弹出窗口

自定义样式

driver.js 支持自定义引导的样式,只需要覆写下面的样式即可

/* popover包装器 */
.driver-popover {}

/* 指向突出显示的元素的箭头 */
.driver-popover-arrow {}

/* 标题和描述 */
.driver-popover-title {}
.driver-popover-description {}

/* 关闭按钮 */
.driver-popover-close-btn {}

/* 底部进度条和操作按钮 */
.driver-popover-footer {}
.driver-popover-progress-text {}
.driver-popover-prev-btn {}
.driver-popover-next-btn {}

demo

我预制了一段demo代码,可以点击下面的按钮来看一下driver引导效果

const driverObject = driver({
  showProgress: true,
  doneBtnText: '我会了',
  prevBtnText: '上一步',
  nextBtnText: '下一步',
  overlayColor: 'red',
  popoverClass: "custom-popover-class",
  onDestroyStarted: () => {
    if(!driverObject.hasNextStep() || confirm('确定要离开吗?')) {
        driverObject.destroy();
    }
  },
  steps: [
    {
      element: '#type',
      popover: {
        title: '配置类型',
        description: '这里列举了driver函数支持的配置类型',
        side: "right",
        align:'start'
      }
    },
    {
      element: '#methodDrive',
      popover: {
        title: 'drive',
        description: '我们可以通过这个方法来开启引导',
        side: "bottom",
        align: 'start'
      }
    }
  ]
})

前端小白