亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 擴展 > SVG > 正文

使用SVG實現(xiàn)提示框功能的示例代碼

2024-09-06 19:57:13
字體:
供稿:網(wǎng)友

NO.1

前言

Tooltips常被稱為提示框(或信息提示框),提示框能夠以較強的交互性、自由度為用戶提供相應的提示信息。今天我們要聊的不是如何實現(xiàn)強大的交互行為,而是來看看如何以最好的方式來還原他們的視覺效果,并且能適用于不同的場景。

NO.2

背景

上圖是從平時工作場景碰到的UI效果截圖過來的。上圖中展示的Tooltips框基本上覆蓋了常見的UI風格。簡單的來歸納一下:

  • 帶邊框的提示框
  • 純色(或帶透明度純色)的提示框
  • 帶內(nèi)陰影(或外陰影)的提示框
  • 帶邊框+漸變的提示框
  • 帶邊框+透明度背景的提示框
  • 提示框三角帶圓角和陰影的提示框

可能還有我未碰到的提示框UI風格。面對這么多的UI風格,對于前端實現(xiàn)上來說是具有一定的挑戰(zhàn)性,特別是多種效果組合在一起的。比如說,帶有邊框+內(nèi)外陰影+漸變(或透明度)+圓角三角等。基本上組合了上圖所提到的各種UI風格。

NO.3

clip-path方案

通常上圖的實現(xiàn)是使用CSS畫個尖角來拼接上去,比較優(yōu)秀的方案如下圖:

我們簡單介紹下clip-path方案:

把提示框分成兩個部分,一個是四方形,一個是三角形,然后兩個拼接在一起組合成一個提示框。這樣整個坐標示意圖如下:

假設(shè)提示框的尺寸是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-pathpolygon()函數(shù)中,最終剪切之后的圖形看上去像下圖

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旋轉(zhuǎn)45deg得到。根據(jù)一些三角函數(shù)的公式和已知的正方形邊長就可以計算出正方形斜對角的長度:

NO.4

clip-path方案碰到問題

這個效果整體看起來還是不錯的,但是細看就會發(fā)現(xiàn)在接縫處或許會存在有空隙、有重疊的問題,如下圖:

采用vw方案后這類像素對不齊的問題也算是司空見慣了,同時第一個Tooltips由于是背景需要從左到右漸變的,此時尖角的漸變過度要和下方的漸變匹配上就更需要費力氣了。

由于先前就遇到過此類ToolTip樣式問題,告知視覺同學后,體貼的視覺同學修改了一版不帶透明度的純色提示框,然而視覺效果大打折扣。

其實我們對于原先采用CSSclip-path的方案其實也存在很多的缺陷,它在面對帶有陰影、背景透明或者漸變、帶邊框同時出現(xiàn)時就顯出了實現(xiàn)成本高和效果一般的缺點。

NO.5

SVG 方案

在討論中我們想到 SVG的path和這個提示框的樣式天然的匹配(建議先了解下path的相關(guān)文檔),查閱了相關(guān)的文檔和資料后我們大致得到了使用SVG來實現(xiàn)的如下幾個優(yōu)點:

  • 能輕松滿足陰影、背景透明或者漸變、帶邊框的效果,甚至更為復雜多變的場景
  • SVG的path實現(xiàn)簡單,并且代碼量極小
  • 可擴展性,可維護性

參考相關(guān)文章后,我們完善Demo工具如下:

使用Demo工具,我們會得到path的數(shù)據(jù)大致如下:

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時用到命令如下表:

命令 名稱 參數(shù)
M moveto(移動到) (x y)+
Z closepath(關(guān)閉路徑) (none)
L lineto(畫線到) (x y)+
H horizontal lineto(水平線到) x+
V vertical lineto (垂直線到) y+
C curveto(三次貝塞爾曲線到) (x1 y1 x2 y2 x y)+
S smooth curveto(光滑三次貝塞爾曲線到) (x2 y2 x y)+
Q quadratic Bézier curveto(二次貝塞爾曲線到) (x1 y1 x y)+
T smooth quadratic Bézier curveto(光滑二次貝塞爾曲線到) (x y)+
A elliptical arc (橢圓弧) (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
R Catmull-Rom curveto* (Catmull-Rom曲線) x1 y1 (x y)+

貝塞爾曲線

在SVGpath命令中我個人認為最精髓的部分是貝塞爾曲線,貝塞爾能畫出各種令人愉悅的曲線。

貝塞爾曲線完全由其控制點決定其形狀,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次貝塞爾曲線的公式可以參考下方關(guān)于曲線的文章

SVG中的Q命令

回到我們的ToolTips話題, 其中的圓角是可以通過二次貝塞爾曲線來實現(xiàn),SVG中Q命令就是來實現(xiàn)二次貝塞爾曲線的,SVG中Q命令的示例圖如下:

對應的指令,其中x1,y1就是我們上面提到的p1點:

Q x1 y1, x y

二次貝塞爾曲線Q示例如下:

<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>

通過設(shè)置起始點和調(diào)整控制點p1我們能得到我們想要的圓角,如下圖所示,小圓點為我們的p1控制點

NO.6

樣式設(shè)置

實現(xiàn)了上方的SVG后接下來的透明、背景漸變、陰影、邊框的設(shè)置就都不成問題了。

背景透明

path {  fill: rgba(0,0,0, .3);  storke: #ffffff;  storke-width: 1px}

陰影

svg {  filter:drop-shadow(2px 4px 6px black)}

關(guān)于為何使用drop-shadow來實現(xiàn)陰影,可以看下圖使用了box-shadowdrop-shadow效果區(qū)別,

使用box-shadow的時候我們的尖角部分沒有陰影,氣泡框部分是有陰影的,就會出現(xiàn)下圖所示的情況,而使用drop-shadow就能符合我們尖角和氣泡框都有陰影的要求。

背景漸變

SVG不僅支持簡單的填充,還支持線性漸變和徑向漸變以及圖形紋理等。為了讓漸變能被重復使用,漸變內(nèi)容需要定義在標簽內(nèi)部。

如下圖是徑向漸變的演示:

<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

需求還沒完

上面方案落地到項目中后,可能是我們不經(jīng)意感動了設(shè)計師,最近的需求視覺稿中我們發(fā)現(xiàn)其中涉及到的Tooltips樣式已經(jīng)越發(fā)令人驚艷。簡單列舉如下兩個樣式:

第一版方案我們基于Demo工具演示我們已經(jīng)產(chǎn)出了ToolTips的SDK, 我們使用的單個參數(shù)arrowHeight傳入來生成尖角。在應付上方兩個樣式是不可能的,尖角樣式多變,如何來擴展性和易用性成為了一個問題,不可能多變的尖角樣式都開發(fā)一個SDK。

NO.8

方案改進

要應付多變的氣泡尖角一定要想辦法把尖角抽離出原先的氣泡外層路徑,生成尖角路徑后在整合到氣泡上形成一個完整的閉合路徑。

為了簡單處理數(shù)值,我將原先的尖角(0,0)坐標定義更換到下方圖示點:

所以接下來尖角可以自由設(shè)計了,只要保證從(0,0)出發(fā)最后回到(-arrowWidth,0)就行了,如下是一個尖角的路徑:(M 0 0 C -10 0 -8 5 -12 5 S -14 0 -24 0

通過設(shè)計不同的尖角路徑我們就能組合成不同的氣泡樣式:

上方右側(cè)的尖角氣泡最終給出的路徑字符串如下,其中Q -2 7 -9 10 Q -6 5 -7 0這一段即為我們的尖角路徑:

M 0 0
Q -2 7 -9 10 Q -6 5 -7 0
H -110
Q -116,0 -116,-6
V -56
Q -116,-62 -110,-62
H 101
Q 107,-62 107,-56
V -6
Q 107,0 101,0
H 0 z
 

從上方簡短的路徑能看出,我們的尖角路徑是完整的整合在整個SVG氣泡路徑中的,所以就不會擔心會出現(xiàn)CSS的 clip-path 方案的問題。

NO.9

可視化工具

方案看起來好像已經(jīng)搞定了需求中的尖角樣式,然而你可能會說這尖角路徑是如何產(chǎn)生,難道需要通過強大的數(shù)學能力推導出來?如下三次貝塞爾曲線就已經(jīng)不敢直視了,更何況四次、五次...

所以想配合的我們一定要產(chǎn)出可視化工具來實現(xiàn)這路徑生成過程,得益于D3.js工具庫操作SVG方面的強大功能,我們開發(fā)完的 生成工具地址 (https://market.m.taobao.com/app/fdilab/svg-tool-demo/pages/index/index.html) 如下:

對于熟悉SVG的path命令的同學來說這個操作不難,如果不熟悉的推薦看下下方的參考文章,了解了曲線命令后就能畫出圓滑的曲線。

10

總結(jié)

至此在ToolTips這塊基本已經(jīng)滿足了設(shè)計的需求,同時也沉淀了SVG路徑生成工具。使用SVG來實現(xiàn)ToolTips能覆蓋 CSSclip-path不能完美解決的幾個場景。在此特別感謝大漠老師的指導。

11

參考文章

D3官網(wǎng)(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/ )

到此這篇關(guān)于使用SVG實現(xiàn)提示框功能的示例代碼的文章就介紹到這了,更多相關(guān)svg 提示框內(nèi)容請搜索武林網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持武林網(wǎng)!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
中文字幕在线免费观看| 无吗不卡中文字幕| 欧美性受xxxx黑人xyx性爽| 国产精品情侣呻吟对白视频| 在线电影一区二区三区| 国产精品乱码久久久久久| 免费在线观看成年人视频| 国产卡一卡2卡三卡免费视频| 亚洲xxxx2d动漫1| 99国产精品99| 久青草视频在线观看| 免费观看在线午夜影视| 欧美va视频| 国内激情视频在线观看| 国产日产欧产精品推荐色| 亚洲欧洲日韩精品| 18+激情视频在线| 亚洲精品国产综合区久久久久久久| 精品亚洲一区二区三区在线观看| 亚洲电影在线免费观看| 在线麻豆国产传媒1国产免费| 成人一区二区电影| 国产精品视频第一页| 精品国产露脸精彩对白| 久久精品视频网站| 交换国产精品视频一区| av网站观看| 欧美日韩免费观看一区三区| 777精品伊人久久久久大香线蕉| 亚洲国产精品ⅴa在线观看| www.av网站| 欧美成年网站| 欧美亚洲一区二区三区四区| 日本高清久久一区二区三区| 国产一二区视频| 亚洲欧美日韩视频二区| 国产成人福利av| 九九夜夜操妹子| 最近2019年日本中文免费字幕| 亚洲国产中文字幕在线观看| 永久久久久久| 免费不卡亚洲欧美| 国产精品jizz在线观看麻豆| 国产精品一区二区免费福利视频| 都市激情亚洲一区| 97欧美成人| 日韩美女爱爱视频| 国产精品专区免费| 久久久久久9999| 天天插天天干天天操| 艳妇乳肉亭妇荡乳av| 国产又爽又黄免费视频| 久久99国产精品久久99小说| 亚洲视频电影图片偷拍一区| 91精彩刺激对白露脸偷拍| 欧美精品在线免费观看| 国产 欧美 在线| 久久婷婷中文字幕| 亚洲成av人在线观看| 草草视频在线免费观看| 99亚偷拍自图区亚洲| 欧美国产综合视频| 日本欧美黄色片| 国产精品网友自拍| 人妻互换一区二区激情偷拍| 久久在线播放| 欧美日韩成人免费观看| 欧美日韩一区二区三区四区五区六区| 国产真实乱人偷精品视频| 欧美精品久久久久久久久| 国产午夜精品一区二区三区四区| 久久免费视频这里只有精品| 一本色道久久综合亚洲二区三区| 日韩精品 欧美| 成人免费毛片嘿嘿连载视频| 国产成人精品福利| 亚洲精品一区二区三区av| 黄色小网站在线观看| www国产精品com| 久久中文字幕国产| 黄网址在线观看| 亚洲熟女综合色一区二区三区| 日韩一级在线观看| 亚洲欧美日韩一区二区在线| 五月天av在线播放| 800av免费在线观看| 国产主播精品| 污视频网站在线免费| 久久影院一区| 91精品啪aⅴ在线观看国产| 国产九九九九| 亚洲天堂视频在线| 欧美综合色免费| 国产三级自拍视频| 97在线国产视频| 亚洲自拍偷拍在线| 黄色三级视频在线观看| 在线观看视频色| 91蜜桃视频在线| 老司机精品视频网站| 欧美18一14sex性处hd| 久久频这里精品99香蕉| 热99精品视频| 日本熟妇人妻中出| 在线电影中文日韩| 天海翼视频在线观看| 天天操天天爱天天爽| 亚洲一区中文日韩| 亚洲综合日韩在线| 色综合影院在线| 国产伦子伦对白在线播放观看| 久久久久久青草| 亚洲日产av中文字幕| 久久婷婷蜜乳一本欲蜜臀| 中国女人内谢69xxxx视频| 日本精品一区| 一本大道色婷婷在线| 亚洲第一精品夜夜躁人人爽| 亚洲视频在线不卡| 成人羞羞视频播放网站| 亚洲综合网中心| 99国产精品国产精品久久| 麻豆影视在线观看_| 人妻人人澡人人添人人爽| 国产精品天天av精麻传媒| 日韩一级黄色av| 神马久久桃色视频| 国产精品9999| 五月激情六月综合| 精品一区二区男人吃奶| 18毛片免费看| 国产天堂av在线| 国产日韩亚洲精品| 中文精品久久久久人妻不卡| 野花社区视频在线观看| 国产精品一色哟哟| 亚洲图色中文字幕| 日韩欧美国产一区二区| 亚洲一级黄色av| 欧美一区二区在线视频观看| 日本久久久久久久久久久久| 日韩av影片在线观看| 国产一区二区免费视频| 日韩国产欧美三级| 亚洲乱码一区二区三区| 美足av综合网| av影院在线| 潘金莲一级淫片aaaaaaa| 国产一区二区福利视频| 欧美精品一区在线发布| 男人精品网站一区二区三区| 韩国女主播成人在线观看| 欧美午夜电影在线观看| www污网站在线观看| 都市激情国产精品| 日韩欧美美女一区二区三区| 色天使在线视频| 亚洲综合av一区二区三区| 黄色免费一级视频| 欧美日韩小视频| 久草福利视频在线| 日韩精品成人一区| 国产女同在线观看| 一级做a爰片久久| 狠狠干夜夜操| 亚洲精品乱码久久久久久| 久草视频福利在线| 亚洲国产欧美一区二区三区同亚洲| 中文字幕日本人妻久久久免费| av在线免费观看网站| 手机在线一区二区三区| 黄色片网站在线免费观看| 日本免费观看网站| 成人免费黄色网址| 中文字幕av片| 一区二区视频免费在线观看| 一区二区91美女张开腿让人桶| 成人性生交大片免费看视频在线| 尤物九九久久国产精品的分类| 免费福利在线视频| 亚洲高清视频一区| 色就是色欧美| 香蕉视频在线网址| 91久久黄色| 午夜精品一区二区在线观看| 午夜精品在线免费观看| 日本男女交配视频| 1024手机在线观看你懂的| 亚洲精品国产品国语在线app| 能免费看av的网站| 日韩精选视频| 亚洲天堂一级片| 亚洲精品爱爱久久| 欧美三级精品| 欧美电影免费| 青青操在线视频| 欧洲精品一区二区三区| 亚洲欧美日本国产| 日本a一级在线免费播放| 91精品欧美久久久久久动漫| 久久久久亚洲av成人无码电影| 一级特黄录像免费播放全99| 久草视频在线免费看| 色偷偷免费视频| 欧美极品jizzhd欧美| 超碰超碰超碰超碰超碰| 国产精品99久久久久久宅男| 亚洲激情一区二区| 很黄很黄的网站免费的| 中文字幕成人在线视频| 国产黄色大片免费看| 精品一区二区视频| 亚洲三级电影全部在线观看高清| 在线看片中文字幕| 国产精品―色哟哟| 欧美日韩另类字幕中文| 非洲一级黄色片| 欧美精品 国产精品| 五月天精品视频| 99热在线看| 日本亚洲欧美在线| 亚洲成人福利| 国产精品国产亚洲精品看不卡15| www.日本不卡| 视频在线观看91| 国产精品入口日韩视频大尺度| 亚洲免费视频在线| 性高湖久久久久久久久| 欧美日韩国产精选| 2024国产精品| 日韩黄色一区二区| 亚洲专区区免费| 欧美视频精品在线| 嗯用力啊快一点好舒服小柔久久| 久久久亚洲欧洲日产国码aⅴ| 亚洲同性gay激情无套| 好吊操视频这里只有精品| 99在线精品一区二区三区| 免费成人三级| 在线观看免费观看在线| 成人爽a毛片一区二区免费| 中文字幕日本人妻久久久免费| 中文字幕亚洲一区二区三区| 久国内精品在线| 欧美毛片在线观看| 国产三级国产精品| 中文字幕一区二区三区精品| 国产一区在线电影| 国产精品久久久久久吹潮| 国产有色视频色综合| 国产精自产拍久久久久久| 久久在线免费| 在线日韩第一页| 亚洲国产综合久久| 日韩一区二区三区在线观看| 少妇荡乳情欲办公室456视频| 久久电影网电视剧免费观看| 91在线最新| 成人毛片高清视频观看| 久久久久久久久久久成人| 色欧美激情视频在线| 亚洲欧美综合另类| 国产91在线免费观看| 午夜精品视频网站| 成人福利视频导航| 国产清纯白嫩初高生在线观看91| 亚洲精品一级二级三级| 欧美成人国产精品高潮| 9999在线观看| 不卡一区2区| 成人手机在线免费视频| 欧美日韩精品一二三区| av资源网一区| 91色婷婷久久久久合中文| 天堂电影院在线| 手机亚洲手机国产手机日韩| 北条麻妃在线一区二区免费播放| 国产精品欧美一区二区| 亚洲高清不卡在线| 国产又爽又黄ai换脸| 亚洲一区二区三区色| 欧美成人精精品一区二区频| 日韩一卡二卡三卡国产欧美| 久热国产视频| 欧美成人高清电影在线| 欧美日本中文| 亚洲精品av在线播放| jizzjizzjizz欧美| 天天综合五月天| 成人在线视频观看| 9.1人成人免费视频网站| 国产传媒欧美日韩成人精品大片| 国产精品无码天天爽视频| 国产精品资源网| 久久影院一区二区| 9色porny自拍视频一区二区| 九一国产在线| 欲色天天网综合久久| 欧美经典三级视频一区二区三区| 国产激情片在线观看| 717影院理论午夜伦不卡久久| h视频免费在线| 久久精品国产美女| 欧美aⅴ在线观看| 日韩在线观看电影完整版高清免费悬疑悬疑| 亚洲深深色噜噜狠狠爱网站| 在线精品国产欧美| 免费人成网ww777kkk手机| 潮喷失禁大喷水aⅴ无码| 久久久久久久久久久久国产| 国产一在线精品一区在线观看| 亚洲欧美第一页| а√天堂资源地址在线下载| 欧美日韩一区二区三区视频播放| 91精品国产综合久久久久久久| 99久久久无码国产精品6| 一区二区三区在线视频111| 日韩免费高清在线观看| 久久精品magnetxturnbtih| 天天操夜夜操国产精品| 99在线精品视频在线观看| 久久99国产乱子伦精品免费| 亚洲欧美日韩一区成人| 国产喷白浆一区二区三区| 99re资源| 三级电影在线看| 精品无人区一区二区三区竹菊| 欧美日韩另类国产亚洲欧美一级|