博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react页面引导组件, 支持语音播报
阅读量:6799 次
发布时间:2019-06-26

本文共 3904 字,大约阅读时间需要 13 分钟。

页面引导在用户第一次访问网站能过提供很好的提示, 下面介绍基于react写的一个页面引导的组件.

效果图

Guide组件的实现

可以把<Guide/>设计成一个容器组件, 因为我们不知道要引导的内容是什么, 通过容器组件的this.props.children渲染内容

class Guide extends Component {    render () {        return (            
this.guide = e}> {this.props.children}
) }}复制代码

如何获取哪些是要引导的dom? 可以通过dom的自定义属性, 再通过querySelectorAll获取

// example
React Guide
// 获取要引导的domthis.guide.querySelectorAll('[data-step]')复制代码

<Guide/>组件还需要有: 遮罩层、提示框、内容区、语音功能, 4个部分.

遮罩层

遮罩层通过fixed布局,加个透明度就好了, 通过外面传来的visible控制显示

class Guide extends Component {    render () {        return (            
this.guide = e}> {this.props.children} {this.props.visible&&
this.shadow = e}s.onClickShadow.bind(this)} key='guide-shadow'>
}
) }}复制代码

提示框

提示框应该再遮罩层之上, 它的z-index大于遮罩层的.提示框还要考虑页面空余空间,确定摆放位置,如下图的4个位置, 1, 4 位置放不下, 所以可以放2, 3.

再添加上resize事件监听, 在页面缩放时,也能重新布局

window.addEventListener('resize', this.onRezieWindow.bind(this), false)复制代码

内容区

首先确定要显示内容区的位置, 通过目标domoffsertLeftoffsetTopheightwidth, 获取内容区的位置

const nodeList = getListFromLike(this.guide.querySelectorAll('[data-step]'))  // 获取所有要引导domnodeList.sort((a, b) => {  return Number(a.getAttribute('data-step'))- Number(b.getAttribute('data-step'))})  // 按照step的大小进行排序let dots = nodeList.map(node => {  let height = node.clientHeight || node.offsetHeight  let width = node.clientWidth || node.offsetWidth  return {    left: node.offsetLeft,     top: node.offsetTop,    height,    width,    tip: node.getAttribute('data-tip'),    step: node.getAttribute('data-step'),    fRight: node.offsetLeft + width,    fBottom: node.offsetTop + height  }})复制代码

内容区也在遮罩层之上.激活content时只要给原dom添加上z-index

node.style.setProperty('position', 'relative');node.style.setProperty('z-index', '999996', 'important');复制代码

当页面存在滚动条时, 还要页面的滚动到要引导区域, 通过scrollTo(x, y)实现

window.scrollTo(dLeft - 100, dTop - 100)复制代码

语音功能

语音功能可以用HTML5audio标签

}复制代码

再结合百度的ttsAPI

function text2Voice(tip, lan){  let obj = {    lan,    ie: 'UTF-8',    spd: '4',    per: 4,    text: tip  // tip就是dom上data-tip的属性值  }  return 'http://tts.baidu.com/text2audio' + axiosObj(obj)}复制代码

audio标签的src指向text2Voice(tip, lan)的结果

通过audioapi控制停止、播放

this.audio.autoplay = true // 自动播放this.audio.pause()  // 暂停this.audio.addEventListener('timeupdate', () => {    ...  // 监听什么时候结束}, false)复制代码

说明

源码及api➡️, 欢迎star,感谢.

安装

可以通过npm安装

$ npm install react-guide复制代码

API

下面是react-guideapi

Property Description Type Default
visible Whether the guide is visible or not boolean false
audio Whether a voice reads of tip of the guide or not boolean true
lan The voice of language, 'en' or 'zh' string en
bullet Whether bullets (.) button is visible on middle of the guide or not boolean false
num Whether num icon is visible on top left of the guide or not boolean false
onCancel Specify a function that will be called when a user clicks shadow, skip button on bottom left function(e) -
onOk Specify a function that will be called when all steps have done and click the done button function(e) -
data-step Number of steps for guides, only use in dom string -
data-tip Every step you want to show tip, only use in dom string -

例子

一个例子

import React, { Component } from 'react';import ReactDOM from 'react-dom';import Guide from 'react-guide'class App extends Component {  constructor () {    super()    this.state = {      visible: false    }  }  handleStart() {    this.setState({      visible: true    })  }  handleCancel() {    this.setState({      visible: false    })  }  render() {    return (      

Step1

Step3

Step2

Step4
); }}ReactDOM.render(
, document.getElementById('root'));复制代码

转载地址:http://xjfwl.baihongyu.com/

你可能感兴趣的文章
UIButton
查看>>
UITabBarController
查看>>
融合式架构Nutanix深入分析一
查看>>
独家爆料:创宇云与小鸟云的故事
查看>>
FireEye:K3chang行动***欧洲外交部门
查看>>
你会用Python写洗脑神曲吗?
查看>>
Win32 文件(3)
查看>>
一款基于css3鼠标经过圆形旋转特效
查看>>
【温故而知新-Javascript】使用 Window 对象
查看>>
成功站长应具备的良好心态
查看>>
Android App测试要点
查看>>
Laravel 中使用 puppeteer 采集异步加载的网页内容
查看>>
Spring中使用ActiveMQ
查看>>
【数据结构】Java语言描述-循环链表和双向链表操作
查看>>
什么是跨域以及几种简单解决方案
查看>>
微信小程序生成二维码工具
查看>>
Java NIO 之 ServerSocketChannel 与 SocketChannel
查看>>
Hyper-V增强会话模式
查看>>
mysql 对插入超过表字段限制时的处理
查看>>
系统现在无法让您登录,因为域不可用
查看>>