VUE + 分布式引导页Intro.js

目录

简介

安装

实现

方式一(html直接使用)

方式二(vue方式)

完整代码

简介

Intro.js是一个轻量级的JavaScript库,用于在网站或应用程序中创建交互式的引导页。可以向用户展示和解释界面的不同部分。

安装

npm方式

npm install intro.js --save

yarn方式

yarn add intro.js

实现

方式一(html直接使用)

如果用户指引内容比较简单并且固定,可以直接将属性写在html标签中,并调用introJs().start()。主要属性如下:

  • data-title:标题文字
  • data-intro:提示信息内容
  • data-step:步骤的编号(优先级)
  • data-tooltipClass:为提示定义CSS类
  • data-highlightClass:将CSS类附加到helperLayer
  • data-position:提示的位置,默认是bottom
  • data-scrollTo:滚动到的元素,element或tooltip。默认值为element。
  • data-disable-interaction:是否禁用与突出显示的框内的元素的交互
<template>
  <div data-title="test" data-intro="intro-test">
    data
  </div>
</template>

<script>
import introJs from "intro.js" // 引入intro.js
import "intro.js/introjs.css" // intro.js的样式

export default {

  data() {
    return {};
  },
	mounted() {
		this.$nextTick(() => {
			// Intro.js扫描页面并找到所有具有“data intro”属性的元素
			introJs().start();
		})
	},
  methods: {
		
	},
};
</script>

方式二(vue方式)

main.js 全局引入intro.js

import intro from 'intro.js' // introjs库
import 'intro.js/introjs.css' // introjs默认css样式
import 'intro.js/themes/introjs-modern.css' // introjs主题
 
// 全局挂载
Vue.prototype.$intro = intro

书写dom

<template>
  <div>
    <div id="dom1">
      <div>第一个div</div>
    </div>
    <div id="dom2">
      <div>第二个div</div>
    </div>
    <div id="dom3">
      <div>第三个div</div>
    </div>
  </div>
</template>

data内配置具体参数

data () {
    return {
      introOption: { // 参数对象
        prevLabel: '上一步',
        nextLabel: '下一步',
        skipLabel: '跳过',
        doneLabel: '完成',
        tooltipClass: 'intro-tooltip', /* 引导说明文本框的样式 */
        highlightClass: 'intro-highlight', /* 说明高亮区域的样式 */
        exitOnEsc: true, /* 是否使用键盘Esc退出 */
        exitOnOverlayClick: false, /* 是否允许点击空白处退出 */
        keyboardNavigation: true, /* 是否允许键盘来操作 */
        showBullets: false, /* 是否使用点显示进度 */
        showProgress: false, /* 是否显示进度条 */
        scrollToElement: true, /* 是否滑动到高亮的区域 */
        overlayOpacity: 0.5, // 遮罩层的透明度 0-1之间
        positionPrecedence: ['bottom', 'top', 'right', 'left'], /* 当位置选择自动的时候,位置排列的优先级 */
        disableInteraction: false, /* 是否禁止与元素的相互关联 */
        hidePrev: true, /* 是否在第一步隐藏上一步 */
        // hideNext: true, /* 是否在最后一步隐藏下一步 */
        steps: [], /* steps步骤,可以写个工具类保存起来 */
      },
      tipsImg1: require('./img/tips1.jpg'), // 新手引导的提示图片
      tipsImg2: require('./img/tips2.jpg') // 新手引导的提示图片
    }
  },

主要方法

定义一个initializeBoot方法绑定对应的元素以及事件

initializeBoot() {
  // 绑定dom元素的选择器数组
  this.introOption.steps = [
    // title 标题文字; element 需添加引导的元素选择器; intro 引导说明文字
    { title: "第一步", element: "#dom1", intro: `测试数据<img src="` + this.img1 + `" alt="" style="width: 100px;"/>` },
    { title: "第二步", element: "#dom2", intro: `测试数据<img src="` + this.img2 + `" alt="" style="width: 100px;"/>` },
    { title: "第三步", element: "#dom3", intro: "测试数据" },
        // ......
   ];
   // 绑定的事件
   this.$intro().setOptions(this.introOption)
     // 点击结束按钮执行
     .oncomplete(() => {
       console.log("点击结束按钮执行");
     })
     // 点击跳过按钮执行
     .onexit(() => {
       console.log("点击跳过按钮执行");
     })
     // 确认完毕按钮执行
     .onbeforeexit(() => {
       console.log("确认完毕按钮执行");
     })
     .start();
},

调用

在mounted生命周期内调用,为避免出现问题在nextTick内调用方法。一般引导都是在用户第一次访问时出现,这里使用本地存储实现。

mounted() {
  this.$nextTick(() => {
    if (!localStorage.getItem("First")) {
      this.initializeBoot();
      localStorage.setItem("First", true);
    }
  });
},

完整代码

<template>
  <div>
    <div id="dom1">
      <div>第一个div</div>
    </div>
    <div id="dom2">
      <div>第二个div</div>
    </div>
    <div id="dom3">
      <div>第三个div</div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      introOption: {
        prevLabel: "上一步",
        nextLabel: "下一步",
        skipLabel: "跳过",
        doneLabel: "完成",
        tooltipClass: "intro-tooltip" /* 引导说明文本框的样式 */,
        highlightClass: "intro-highlight" /* 说明高亮区域的样式 */,
        exitOnEsc: true /* 是否使用键盘Esc退出 */,
        exitOnOverlayClick: false /* 是否允许点击空白处退出 */,
        keyboardNavigation: true /* 是否允许键盘来操作 */,
        showBullets: false /* 是否使用点显示进度 */,
        showProgress: false /* 是否显示进度条 */,
        scrollToElement: true /* 是否滑动到高亮的区域 */,
        overlayOpacity: 0.5, // 遮罩层的透明度 0-1之间
        positionPrecedence: ["bottom", "top", "right", "left"] /* 当位置选择自动的时候,位置排列的优先级 */,
        disableInteraction: false /* 是否禁止与元素的相互关联 */,
        hidePrev: true /* 是否在第一步隐藏上一步 */,
        hideNext: true /* 是否在最后一步隐藏下一步 */,
        steps: [] /* steps步骤 */,
      },
      // 如有引导的图片可以存入变量内
      img1: require("./assets/logo.png"),
      img2: require("./assets/logo.png"),
    };
  },
  mounted() {
    this.$nextTick(() => {
      if (!localStorage.getItem("First")) {
        this.initializeBoot();
        localStorage.setItem("First", true);
      }
    });
  },
  methods: {
    initializeBoot() {
      // 绑定dom元素的选择器数组
      this.introOption.steps = [
        // title 标题文字; element 需添加引导的元素选择器; intro 引导说明文字
        { title: "第一步", element: "#dom1", intro: `测试数据<img src="` + this.img1 + `" alt="" style="width: 100px;"/>` },
        { title: "第二步", element: "#dom2", intro: `测试数据<img src="` + this.img2 + `" alt="" style="width: 100px;"/>` },
        { title: "第三步", element: "#dom3", intro: "测试数据" },
        // ......
      ];
      // 绑定的事件
      this.$intro()
        .setOptions(this.introOption)
        // 点击结束按钮后执行的事件
        .oncomplete(() => {
          console.log("点击结束按钮后执行的事件");
        })
        // 点击跳过按钮后执行的事件
        .onexit(() => {
          console.log("点击跳过按钮后执行的事件");
        })
        // 确认完毕之后执行的事件
        .onbeforeexit(() => {
          console.log("确认完毕之后执行的事件");
        })
        .start();
    },
  },
};
</script>

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值