魔兽世界尖角码头的阴影任务我怎么找不到(尖角码头的阴影任务线在哪接)
细品用SVG实现一个优雅的提示框
作者:驭剑 淘系前端团队
转发链接:/d/file/gt/2023-09/m05p4hl51y2.2 背景
上图是从平时工作场景碰到的UI效果截图过来的。上图中展示的Tooltips框基本上覆盖了常见的UI风格。简单的来归纳一下:
带边框的提示框纯色(或带透明度纯色)的提示框带内阴影(或外阴影)的提示框带边框+渐变的提示框带边框+透明度背景的提示框提示框三角带圆角和阴影的提示框可能还有我未碰到的提示框UI风格。面对这么多的UI风格,对于前端实现上来说是具有一定的挑战性,特别是多种效果组合在一起的。比如说,带有边框+内外阴影+渐变(或透明度)+圆角三角等。基本上组合了上图所提到的各种UI风格。
NO.3 clip-path方案通常上图的实现是使用CSS画个尖角来拼接上去,比较优秀的方案如下图:
我们简单介绍下clip-path方案:
把提示框分成两个部分,一个是四方形,一个是三角形,然后两个拼接在一起组合成一个提示框。这样整个坐标示意图如下:
假设提示框的尺寸是w x h,边框厚度是h1,那么绘制带有缺口的时需要以下几个坐标点:
d1坐标(0, 0)d2坐标((50% - b), 0)或((w / 2 - b), 0) 其中b是三角形对角边长度的一半,后面会介绍到d3坐标((50% - b - h1), h1) 或 ((w / 2 - b - h1), h1)d4坐标((50% + b + h1), h1) 或 ((w / 2 + b + h1), h1)d5坐标((50% + b), 0)或 ((w / 2 + b), 0)d6坐标(100%, 0) 或 (w, 0)d7坐标(100%, 100%) 或 (w, h)d8坐标(0, 100%) 或 (0, h)坐标点放置到clip-path的polygon()函数中,最终剪切之后的图形看上去像下图
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);
另外就是三角形的部分,如果我们的三角形是一个 10px x 10px 旋转 45deg 得到。根据一些三角函数的公式和已知的正方形边长就可以计算出正方形斜对角的长度:
NO.4 clip-path方案碰到问题这个效果整体看起来还是不错的,但是细看就会发现在接缝处或许会存在有空隙、有重叠的问题,如下图:
采用vw方案后这类像素对不齐的问题也算是司空见惯了,同时第一个Tooltips由于是背景需要从左到右渐变的,此时尖角的渐变过度要和下方的渐变匹配上就更需要费力气了。
由于先前就遇到过此类ToolTip样式问题,告知视觉同学后,体贴的视觉同学修改了一版不带透明度的纯色提示框,然而视觉效果大打折扣。
其实我们对于原先采用CSS clip-path的方案其实也存在很多的缺陷,它在面对带有阴影、背景透明或者渐变、带边框同时出现时就显出了实现成本高和效果一般的缺点。
NO.5 SVG 方案在讨论中我们想到 SVG的path 和这个提示框的样式天然的匹配(建议先了解下path的相关文档),查阅了相关的文档和资料后我们大致得到了使用SVG来实现的如下几个优点:
能轻松满足阴影、背景透明或者渐变、带边框的效果,甚至更为复杂多变的场景SVG的path实现简单,并且代码量极小可扩展性,可维护性参考相关文章后,我们完善Demo工具如下:
使用Demo工具,我们会得到path的数据大致如下:
M 0,0 L -15,-15 H -79 Q -84,-15 -84,-20 V -85 Q -84,-90-79,-90 H 61 Q 66,-90 66,-85 V -20 Q 66,-15 61,-15 H 15 z
通常使用SVG画path时用到命令如下表:
贝塞尔曲线在SVG path 命令中我个人认为最精髓的部分是贝塞尔曲线,贝塞尔能画出各种令人愉悦的曲线。
贝塞尔曲线完全由其控制点决定其形状, n个控制点对应着n-1阶的贝塞尔曲线,并且可以通过递归的方式来绘制。我们先看下一次和二次贝塞尔曲线如何来绘制的:
一次曲线:一条直线上,随着时间t的变化,红色线段的那个点的坐标公式应该如下:
二次贝塞尔曲线:p0、p1、p2是3个不同线的点,依次用线段连接,此时随意取线段p0p1上的一个点p0' , 如上图: 我们的p0'点在p0p1线段的0.26处(t=0.26),此刻p1p2线段相同比列取p1'点,此时p0'和p1'连接后形成线段p0'p1', 在按照如上比列进行取值 p0'', 这时候就确定了二次贝塞尔曲线的一个点。
通过一番巴拉巴拉牛逼的推导后,二次贝塞尔曲线公式为:
N次贝塞尔可以认为是如上取值方式的迭代过程,可以通过下图直观的感受到1~4次曲线随着时间t的变化过程,具体N次贝塞尔曲线的公式可以参考下方关于曲线的文章
SVG中的Q命令回到我们的ToolTips 话题, 其中的圆角是可以通过二次贝塞尔曲线来实现,SVG中 Q 命令就是来实现二次贝塞尔曲线的,SVG中 Q 命令的示例图如下:
对应的指令,其中x1,y1就是我们上面提到的p1点:
Q x1 y1, x y
二次贝塞尔曲线 Q 示例如下:
<svg width="190px" height="160px" version="1.1" xmlns="http://www.w3/2000/svg"> <path d="M10 80 Q 95 10 180 80" stroke="black" fill="transparent"/></svg>
通过设置起始点和调整控制点p1 我们能得到我们想要的圆角,如下图所示,小圆点为我们的p1控制点
NO.6 样式设置实现了上方的SVG后接下来的透明、背景渐变、阴影、边框的设置就都不成问题了。
背景透明path { fill: rgba(0,0,0, .3); storke: #ffffff; storke-width: 1px}
阴影svg { filter:drop-shadow(2px 4px 6px black)}
关于为何使用drop-shadow来实现阴影,可以看下图使用了box-shadow和drop-shadow效果区别,
使用box-shadow的时候我们的尖角部分没有阴影,气泡框部分是有阴影的,就会出现下图所示的情况,而使用drop-shadow 就能符合我们尖角和气泡框都有阴影的要求。
背景渐变SVG不仅支持简单的填充,还支持线性渐变和径向渐变以及图形纹理等。为了让渐变能被重复使用,渐变内容需要定义在标签内部。
如下图是径向渐变的演示:
<svg width="120" height="240" version="1.1" xmlns="http://www.w3/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, 我们使用的单个参数arrowHeight传入来生成尖角。在应付上方两个样式是不可能的,尖角样式多变,如何来扩展性和易用性成为了一个问题,不可能多变的尖角样式都开发一个SDK。
NO.8 方案改进要应付多变的气泡尖角一定要想办法把尖角抽离出原先的气泡外层路径,生成尖角路径后再整合到气泡上形成一个完整的闭合路径。
为了简单处理数值,我将原先的尖角 (0,0) 坐标定义更换到下方图示点:
所以接下来尖角可以自由设计了,只要保证从(0,0)出发最后回到(-arrowWidth,0)就行了,如下是一个尖角的路径:(M 0 0 C -10 0 -8 5 -12 5 S -14 0 -24 0)
通过设计不同的尖角路径我们就能组合成不同的气泡样式:
上方右侧的尖角气泡最终给出的路径字符串如下,其中Q -2 7 -9 10 Q -6 5 -7 0 这一段即为我们的尖角路径:
M 0 0 Q -2 7 -9 10 Q -6 5 -7 0H -110Q -116,0 -116,-6V -56Q -116,-62 -110,-62H 101Q 107,-62 107,-56V -6Q 107,0 101,0H 0 z
从上方简短的路径能看出,我们的尖角路径是完整的整合在整个SVG气泡路径中的,所以就不会担心会出现CSS的 clip-path 方案的问题。NO.9 可视化工具
方案看起来好像已经搞定了需求中的尖角样式,然而你可能会说这尖角路径是如何产生,难道需要通过强大的数学能力推导出来?如下三次贝塞尔曲线就已经不敢直视了,更何况四次、五次...
所以想配合的我们一定要产出可视化工具来实现这路径生成过程,得益于D3.js工具库操作SVG方面的强大功能,我们开发完的 生成工具地址 (https://market.m.taobao/app/fdilab/svg-tool-demo/pages/index/index.html) 如下:
对于熟悉SVG的 path命令的同学来说这个操作不难,如果不熟悉的推荐看下下方的参考文章,了解了曲线命令后就能画出圆滑的曲线。
10 总结至此在ToolTips这块基本已经满足了设计的需求,同时也沉淀了SVG路径生成工具。使用SVG来实现ToolTips能覆盖 CSS clip-path不能完美解决的几个场景。在此特别感谢大漠老师的指导。
推荐CSS学习相关文章手把手整理CSS3知识汇总【思维导图】
手把手教你55 个提高CSS 开发效率的必备片段
手把手教你常见的CSS布局方式【实践】
让CSS flex布局最后一行左对齐的N种方法
妙用CSS变量,让你的CSS变得更心动
纯CSS实现简单骨骼动画【实践】
CSS揭秘实用技巧总结
你未必知道的49个CSS知识点
深入浅出超好用的 CSS 阴影技巧
关于前端CSS写法104个知识点汇总(一)
关于前端CSS写法104个知识点汇总(二)
前端开发规范:命名规范、html规范、css规范、js规范
CSS变量实现暗黑模式,我的小铺页面已经支持
深入浅出CSS中彻底搞懂word-break、word-wrap、white-space
深入浅出详细讲解CSS 渲染原理以及优化策略
手把手教你深入CSS实现一个粒子动效的按钮
手把手教你css 中多种边框的实现小窍门【实践】
手把手详细教你优化CSS提高网站加载速度的21种方法汇总【实践】
作者:驭剑 淘系前端团队
转发链接:/d/file/gt/2023-09/rx2vnzingwx 着人们。
1855年,在英格兰伊克斯河广阔的入海口,谁或什么东西在白茫茫的雪地上留下了160公里长的踪迹?
令人不安的脚印
在1855年2月7日的夜里,英格兰德文郡下了一场特大的降雪。2月8日清晨,托普斯汉姆镇上一位名叫亨利•彼尔克的 面包师从他的面包作坊走出来,欣赏着满地平整的皑皑白雪。随后,他看到一串样子奇怪的脚印,脚印是从离面包作坊6英 尺的木栅栏旁留下来的,一直到了作坊的门口,然后又折了回去。
亨利以为这个踪迹是驴或小马驹踩的,可是过了一会儿他又注意到,这种奇怪的驴蹄状的脚印是沿着一条直线一个跟 着一个的。这个面包师从来没见过有什么驴是这样行走的,而且也没看见有什么动物是这样行走的。只有一些诸如人类的 二足动物才会踩出一条线的脚印,即使这样,脚印也不是在一条线上,除非那人在试图走钢丝。
一小时以后,托普斯汉姆镇镇长艾伯特•布雷福德率领一小队兴奋的村民赶到了。他们跟随着这个踪迹来到了亨利的 院子。他们说那足迹遍及整个村子、在道路上、花园中、小路上、庭院里和田野间,他们都看到了那种足迹。它跨过了高 达三米多的栅栏,然后又继续向前,仿佛那栅栏不存在一样。
随着搜寻的队伍继续前进,寻找脚印的人们也在增加。家庭主妇们、孩子们、木匠、商人、店主和顾客们,几乎所有 人都加入到这个搜寻的行列中。他们跟随这奇怪的踪迹走得越远,这踪迹就变得越让人感到不安。
这个家伙似乎能飞檐走壁,甚至能越过宽大的河面、泥泞的沼泽,还能飞上人类根本无法达到的高度。至于它前进的 速度,也是人类望尘莫及的,追寻的人们感到精疲力竭了,不得不拖着沉重的双腿往回走。
从托普斯汉姆镇到160公里以外南部托特纳斯地区的海边,在这南北之间的每个村庄都有这种足迹到访。并且这个怪 物在许多孤零零的农场和单独的村舍也都逗留过。关于奇怪足迹的报告接连不断,农场工人发现这些足迹穿过了田野,登 上了草垛;牧师们注意到在教堂、墓地和教区长住所周围出现过这种足迹;富裕的地主和乡绅们沿着他们大片的草地、花 园的小道和车道发现过这踪迹;在树林和矮树丛中,林务员们发现了这些足迹;在荒滩和大卵石铺成的码头区渔民注意到了 这些足迹。这神秘的踪迹几乎遍及了每一个地方。
无法自拔的恐惧
令人战栗、恐惧的脚印之谜,很快就传遍了整个英国,引起了全英格兰人的注意。首先是1855年1月16日的《时报》上出现了这样一条新闻
“一桩值得注目的怪事袭击了托普斯汉姆!这儿突然出现了数不尽的奇怪的马蹄形脚印,所有见过这种脚印的人都认 为,那是恶魔的脚印。于是整日整夜,托普斯汉姆镇的居民们陷入了巨大的恐惧之中,他们生怕恶魔突然闯入家门。”
接着,各种有关脚印的传说纷纷出现。有的说这些不吉祥的脚印在雪地里就好像一块燃烧的煤炭,吐出深红的火焰;有 的说这马蹄似的脚印只有当人们背向它的时候才会出现;还有的说自己曾目睹了一个长着两只尖角的巨大的黑影,出现在 博拉罕姆的古城堡之中。
于是有关马蹄形脚印的猜测,在英国掀起了一场大骚动。最后市民们把所有的注意力集中在一个问题上,这就是:恶魔 出现的那个夜晚,是否发生了其他异常事件?
人们开始仔细地搜索自己的记忆,有人说那天晚上曾听见过马群的嘶叫;有人说曾听见猎狗的狂吠;还有人说那是狼的 哭嚎!但是无论猜测如何多,却没有一个人最终发现马蹄状脚印的主人,而且愈是猜测,愈是人心惶惶,恶魔的阴影已涌上了 人们的心头,托普斯汉姆镇的居民陷入了一种无法自拔的恐惧之中。
众说纷纭
终于,科学家们站出来了,他们认为这种奇怪的脚印是动物留下来的。其中英国著名的动物学家理查•欧思博士指出: “这些耸人听闻的脚印是熊留下来的。”也有人说:“那是袋鼠的一场闹剧。”除了被判断为是马、驴、熊的脚印之外, 还有人提出:“这是狐狸的脚印。”
各种学派众说纷纭,互不退让,举例、论证……一时在英国掀起了一场有关脚印的轩然大波。但是无论是什么样的动 物,无论是两只脚还是四只脚的走兽,怎么可能永远是跳跃地前进呢?而且跳得那么轻松自如,留下一行行直线形的足迹呢? 难道这是鸟类留下的足迹?假使这是一只大鸟,它当然有能力飞越3公里宽的河面,问题在于一只长着双翅的鸟儿,为什么要 小步跳着走遍160公里的广阔天地?似乎任何一只鸟都没有理由这样干,也没有能力这样干。
再说无论是走兽还是飞禽,半夜三更出来多半是为了寻找食物,但从托普斯汉姆镇出现的那些脚印上看,它们的目的并 不是为了猎食,只是不停地、不知疲倦地向前走,直挺挺地向前走。
如果这不是一些已知鸟类和动物的踪迹,那它会是什么呢?从骗局到超自然现象,人们有着各种推测,但是没有一个和 事实相符。要想一夜之间使这些踪迹遍及如此大的区域,这需要20多个欺骗者。参与的人越多,策划就越精细,而保住秘密 的机会就越少,但没有一点点这方面的传闻。
难道是某个外星生物降临? “恶魔的脚印”无声无息地出现和消失,引起了一场惊慌,但它并没有来侵犯人类的利益, 似乎只是在德文郡地区视察了一番,于是有人便肯定,这就是天外来客。但是,这样的话就使我们进入了一个纯粹遐想的王 国,就像一部幻想小说一样漫无边际。那么,如果不能追溯朦胧的超自然王国的答案,更加广泛的物理学领域会提供线索 吗?传动理论、遥动理论、多维空间理论……这些新颖奇特的理论能提供解释吗?迄今仍无答案。
并不是惟一
宇宙之大,茫茫无限自然之谜,层出不穷。1855年2月出现在德文郡的踪迹在其他地方也出现过。1840年,南极探险家 杰姆斯•鲁克率领了一支探险队,向南极方向进军。正当他们的探险船准备在南极圈边缘停泊的时候,杰姆斯首先发现一 种类似马蹄形的足迹,成一条直线向前延伸并渐渐消失。杰姆斯立刻上岸,测量了这些脚印。每只脚印宽6.3厘米,长7.6厘 米,两侧很深地陷入雪地里,因为这个脚印太像马蹄印了,杰姆斯便命令探险队员们紧跟着足迹去寻找那匹“南极马”,结 果什么也没有找到。幸好他们当时很快就放弃了追踪“南极马”的计划,不然的话他们只能是白白地浪费人力和物力。
另外,也是在1840年,位于苏格兰地区被称为沙丘的某山上,也发现了类似马蹄形的脚印。当时虽没有引起全社会的注 意,但一些青年猎手们也组织了追踪,结果同样是一无所获,没有找到脚印的主人。
这谜一般的脚印事件已经过去了一个半世纪,但它仍然在困扰着今天的人们。
声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送至邮件举报,一经查实,本站将立刻删除。转载务必注明出处:http://www.hixs.net/article/20240228/169624863553559.html