在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
NO.1 前言 Tooltips常被称为提示框(或信息提示框),提示框能够以较强的交互性、自由度为用户提供相应的提示信息。今天我们要聊的不是如何实现强大的交互行为,而是来看看如何以最好的方式来还原他们的视觉效果,并且能适用于不同的场景。 NO.2 背景 上图是从平时工作场景碰到的UI效果截图过来的。上图中展示的Tooltips框基本上覆盖了常见的UI风格。简单的来归纳一下:
可能还有我未碰到的提示框UI风格。面对这么多的UI风格,对于前端实现上来说是具有一定的挑战性,特别是多种效果组合在一起的。比如说,带有边框+内外阴影+渐变(或透明度)+圆角三角等。基本上组合了上图所提到的各种UI风格。 NO.3 clip-path方案 通常上图的实现是使用CSS画个尖角来拼接上去,比较优秀的方案如下图: 我们简单介绍下 把提示框分成两个部分,一个是四方形,一个是三角形,然后两个拼接在一起组合成一个提示框。这样整个坐标示意图如下: 假设提示框的尺寸是
坐标点放置到 clip-path: polygon( 0 0, calc(50% - 4px) 0, calc(50% - 7px) 2px, calc(50% + 7px) 2px, calc(50% + 4px) 0, 100% 0, 100% 100%, 0 100%, 0 0); 另外就是三角形的部分,如果我们的三角形是一个 NO.4 clip-path方案碰到问题 这个效果整体看起来还是不错的,但是细看就会发现在接缝处或许会存在有空隙、有重叠的问题,如下图: 采用 由于先前就遇到过此类ToolTip样式问题,告知视觉同学后,体贴的视觉同学修改了一版不带透明度的纯色提示框,然而视觉效果大打折扣。 其实我们对于原先采用CSS NO.5 SVG 方案 在讨论中我们想到 SVG的
参考相关文章后,我们完善Demo工具如下: 使用Demo工具,我们会得到
通常使用SVG画
贝塞尔曲线 在SVG 贝塞尔曲线完全由其控制点决定其形状,n个控制点对应着n-1阶的贝塞尔曲线,并且可以通过递归的方式来绘制。我们先看下一次和二次贝塞尔曲线如何来绘制的: 一次曲线: 一条直线上,随着时间t的变化,红色线段的那个点的坐标公式应该如下: 二次贝塞尔曲线:
通过一番巴拉巴拉牛逼的推导后,二次贝塞尔曲线公式为: N次贝塞尔可以认为是如上取值方式的迭代过程,可以通过下图直观的感受到1~4次曲线随着时间t的变化过程,具体N次贝塞尔曲线的公式可以参考下方关于曲线的文章 SVG中的Q命令 回到我们的 对应的指令,其中x1,y1就是我们上面提到的
二次贝塞尔曲线 <svg width="190px" height="160px" version="1.1" xmlns="http://www.w3.org/2000/svg"> <path d="M10 80 Q 95 10 180 80" stroke="black" fill="transparent"/> </svg> 通过设置起始点和调整控制点 NO.6 样式设置 实现了上方的SVG后接下来的透明、背景渐变、阴影、边框的设置就都不成问题了。 背景透明 path { fill: rgba(0,0,0, .3); storke: #ffffff; storke-width: 1px } 阴影 svg { filter:drop-shadow(2px 4px 6px black) } 关于为何使用 使用 背景渐变 SVG不仅支持简单的填充,还支持线性渐变和径向渐变以及图形纹理等。为了让渐变能被重复使用,渐变内容需要定义在标签内部。 如下图是径向渐变的演示: <svg width="120" height="240" version="1.1" xmlns="http://www.w3.org/2000/svg"> <defs> <linearGradient id="Gradient2" x1="0" x2="0" y1="0" y2="1"> <stop offset="0%" stop-color="red"/> <stop offset="50%" stop-color="black" stop-opacity="0"/> <stop offset="100%" stop-color="blue"/> </linearGradient> </defs> <rect x="10" y="120" rx="15" ry="15" width="100" height="100" fill="url(#Gradient2)"/> </svg> 将这个渐变作用到我们提示框后可以看到如下图的效果,终于不用辛辛苦苦的处理尖角的渐变衔接问题了。 更多 SVG同时也支持纹理叠加效果,具体感兴趣的可以自行去研究下。 NO.7 需求还没完 上面方案落地到项目中后,可能是我们不经意感动了设计师,最近的需求视觉稿中我们发现其中涉及到的Tooltips样式已经越发令人惊艳。简单列举如下两个样式: 第一版方案我们基于Demo工具演示我们已经产出了ToolTips的SDK, 我们使用的单个参数 NO.8 方案改进 要应付多变的气泡尖角一定要想办法把尖角抽离出原先的气泡外层路径,生成尖角路径后在整合到气泡上形成一个完整的闭合路径。 为了简单处理数值,我将原先的尖角 所以接下来尖角可以自由设计了,只要保证从 通过设计不同的尖角路径我们就能组合成不同的气泡样式: 上方右侧的尖角气泡最终给出的路径字符串如下,其中
从上方简短的路径能看出,我们的尖角路径是完整的整合在整个SVG气泡路径中的,所以就不会担心会出现CSS的 clip-path 方案的问题。 NO.9 可视化工具 方案看起来好像已经搞定了需求中的尖角样式,然而你可能会说这尖角路径是如何产生,难道需要通过强大的数学能力推导出来?如下三次贝塞尔曲线就已经不敢直视了,更何况四次、五次... 所以想配合的我们一定要产出可视化工具来实现这路径生成过程,得益于D3.js工具库操作SVG方面的强大功能,我们开发完的 生成工具地址 (https://market.m.taobao.com/app/fdilab/svg-tool-demo/pages/index/index.html) 如下: 对于熟悉SVG的 10 总结 至此在 11 参考文章 D3官网(https://d3js.org.cn/) 曲线篇: 贝塞尔曲线(https://zhuanlan.zhihu.com/p/136647181 ) Tooltips using SVG Path(https://medium.com/welldone-software/tooltips-using-svg-path-1bd69cc7becd ) SVG渐变(https://developer.mozilla.org/zh-CN/docs/Web/SVG/Tutorial/Gradients ) 深度掌握SVG路径path的贝塞尔曲线指令(https://www.zhangxinxu.com/wordpress/2014/06/deep-understand-svg-path-bezier-curves-command/ ) css drop-shadow(https://www.zhangxinxu.com/wordpress/2016/05/css3-filter-drop-shadow-vs-box-shadow/ ) 到此这篇关于使用SVG实现提示框功能的示例代码的文章就介绍到这了,更多相关svg 提示框内容请搜索极客世界以前的文章或继续浏览下面的相关文章,希望大家以后多多支持极客世界! |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论