Open SunXinFei opened 3 years ago
首先我们讨论高亮区域的定位问题,目前所有的开源项目里面,无一例外使用的是元素选择器,且只支持唯一值,而不是直接使用{ top:200px, left:100px}
,原因很简单,写死数值在不同分辨率下会出现区域位置错误的情况。
后面我们还会讨论高亮区域包含若干元素,如下图:
关于如何实现在阴影遮罩中高亮透出一块区域的问题,这里有三种主要的实现方式,依次讨论
高亮的DOM元素(示例:)
高亮的白底区域(示例:)
通过polyfill的方式:修改intro.js的helper的宽高以及position的来实现异形高亮
相关的开源项目: https://github.com/usablica/intro.js https://github.com/kamranahmedse/driver.js
box-shadow: h-shadow v-shadow blur spread color inset;//x偏移量 | y偏移量 | 阴影模糊半径 | 阴影扩散半径 | 阴影颜色
border-radius: 20px;
可以实现高亮区域圆角
{
top: y,
left: x,
height: h,
width: w,
}
//上
{
top: 0,
left: 0,
height: x,
width: 100vw,
}
//下
{
top: y+h,
left: x,
height: w,
width: 100vh-y-h,
}
//左
{
top: y,
left: 0,
height: x,
width: 100vh-y,
}
//右
{
top: y,
left: w+x,
height: 100vw-x-w,
width: 100vh-y,
}
如头条的巨量引擎页面,示例
SVG的path属性如下,其中大写表示绝对位置,小写表示相对位置。 示例:https://jsfiddle.net/sunxinfei/rcboav85/3/
- M = moveto
- L = lineto
- H = horizontal lineto
- V = vertical lineto
- C = curveto
- S = smooth curveto
- Q = quadratic Belzier curve
- T = smooth quadratic Belzier curveto
- A = elliptical Arc
- Z = closepath
path计算核心代码为:
/**
* Generates the svg path data for a rounded rectangle overlay
* @param {Object} dimension - Dimensions of rectangle.
* @param {number} width - Width.
* @param {number} height - Height.
* @param {number} [x=0] - Offset from top left corner in x axis. default 0.
* @param {number} [y=0] - Offset from top left corner in y axis. default 0.
* @param {number} [r=0] - Corner Radius. Keep this smaller than half of width or height.
* @returns {string} - Rounded rectangle overlay path data.
*/
export function makeOverlayPath({ width, height, x = 0, y = 0, r = 0 }) {
const { innerWidth: w, innerHeight: h } = window;
return `M${w},${h}\
H0\
V0\
H${w}\
V${h}\
Z\
M${x + r},${y}\
a${r},${r},0,0,0-${r},${r}\
V${height + y - r}\
a${r},${r},0,0,0,${r},${r}\
H${width + x - r}\
a${r},${r},0,0,0,${r}-${r}\
V${y + r}\
a${r},${r},0,0,0-${r}-${r}\
Z`;
}
在线示例: https://jsfiddle.net/sunxinfei/b8gvjm0f/19/
相关的开源项目: https://github.com/shipshapecode/shepherd
和上一个方法看起来很像,使用的svg,但是这个方法利用的是mask以及clipPath
rect
上下左右四块拼接,并且四角的圆角使用的是四个circle
,思路比较新奇
mix-blend-mode: hard-light;
background-color: gray;
色值与遮罩层保持一致;在线示例: https://jsfiddle.net/sunxinfei/3kh1jezy/4/
相关的开源项目: https://github.com/gilbarbara/react-joyride
关于未来的属性-webkit-mask不做过多讨论,
http://jsfiddle.net/sunxinfei/hf4zmecq/3/ http://jsfiddle.net/break/8vrU7/
pointer-events
关于pointer-events
我们着重讨论下pointer-events: none
元素永远不会成为鼠标事件的target。但是,当其后代元素的pointer-events属性指定其他值时,鼠标事件可以指向后代元素,在这种情况下,鼠标事件将在捕获或冒泡阶段触发父元素的事件侦听器。
作用:
pointer-events: none
,高亮的局部区域添加pointer-events: auto
即可恢复点击,不添加则屏蔽点击。vue-tour使用的就是这个原理。pointer-events: none
即可
pointer-events: none
示例:https://jsfiddle.net/sunxinfei/7eg30rqf/6/pointer-events: none
,从而控制,只有切换tab才触发事件,重复当前tab点击则进行屏蔽。css兼容性,由于是一个比较老的属性,几乎可以忽略兼容性。
大佬在哪家大厂呀
很赞,之前也研究过 intro.js 这个库,高亮和局部可点击这两个功能的实现令人惊喜。这里讲局部可点击漏了一个点,除了 pointer-event 之外,还行要动态给高亮元素设置 z-index,将其置于最前。
引导在项目中属于增加用户体验类,通过下一步、下一步的方式来使用户能够很快的对产品上手,或对产品的一些交互逻辑进行了解。前端增加用户体验类的东西比如有:骨架屏、动画、引导。网上实现的引导方式有很多,现在将实现的方式进行总结。
整体流程
引导组成部分
如图所示,引导一般分为如下几部分构成: