当前位置: 首页 > Web前端 > HTML5

前端日常实战:153#视频演示如何使用CSS和原生JS制作一套tooltip提示框

时间:2023-04-04 22:50:18 HTML5

效果预览在当前页面点击右侧的“点击预览”按钮进行预览,点击全屏预览链接。https://codepen.io/comehop??e/pen/rqyoYY互动视频本视频为互动视频,您可以随时暂停视频,编辑视频中的代码。请使用chrome、safari、edge打开观看。https://scrimba.com/p/pEgDAM/c6p2Es2源码下载日常前端实战系列完整源码请到github下载:https://github.com/comehop??e/front-end-daily-挑战代码解释定义dom,容器中包含一个名为.emoji的子容器,代表一个头像,其子元素eyeleft、eyeright、mouth分别代表左眼、右眼和嘴巴:

居中显示:body{margin:0;高度:100vh;显示:弹性;对齐项目:居中;证明内容:居中;background-color:lightyellow;}定义容器大小和子元素对齐方式:.container{position:relative;宽度:20em;高度:20em;字体大小:10px;显示:弹性;对齐项目:居中;证明内容:居中;-盒子;宽度:10em;高度:10em;背景色:粉色;border-radius:50%50%75%50%;}定义头像眼睛的轮廓:.emoji.eye{p位置:绝对;框大小:边框框;宽度:3em;高度:3em;边框:0.1em纯灰色;边界半径:50%;上:3em;}.emoji.eye.left{左:1em;}.emoji.eye.right{right:1em;}画眼睛:.emoji.eye.left::before,.emoji.eye.right::before{content:'';位置:绝对;宽度:1em;高度:1em;背景色:#222;边界半径:50%;顶部:1em;左:calc((100%-1em)/2);}画一张微笑的嘴:.emoji.mouth{position:absolute;宽度:2em;高度:2em;边框:0.1em实心;底部:1em;左:40%;边界半径:50%;border-color:transparentgrey灰色透明;接下来制作眼球4个方向转动的效果使用2个变量来表示眼球的位置:.emoji.eye{--top:1em;--left:calc((100%-1em)/2);}.emoji.eye.left::before,.表情符号.eye.right::before{top:var(--top);left:var(--left);}设置眼睛在4个方向的定位位置:.emoji.top.eye{--top:0;}.emoji.bottom.eye{--top:1.8em;}.emoji.left.eye{--left:0;}.emoji.right.eye{--left:1.8em;}此时,如果在dom元素.emoji,眼睛会转向特定的方向。在dom中添加4个元素,每个元素的内容是一个@字符:
@@@@span>在头像周围排列4个元素:.tip{position:absolute;游标:指针;字体大小:4.5em;颜色:银色;字体系列:无衬线;font-weight:100;}.tip.top{top:-15%;}.tip.bottom{bottom:-15%;}.tip.left{left:-15%;}.tip.right{right:-15%;}写个脚本,加一点交互效果。当鼠标在4个方向上悬停在@上时,使眼睛转向相应的方向。这里的DIRECTION常量存储了4个方向,EVENTS常量存储了2个鼠标事件,$常量根据类名包装了获取dom元素的操作:constDIRECTIONS=['top','bottom','left','right']constEVENTS=['mouseover','mouseout']const$=(className)=>document.getElementsByClassName(className)[0]DIRECTIONS.forEach(direction=>EVENTS.forEach((e)=>$(`tip${direction}`).addEventListener(e,()=>$('emoji').classList.toggle(direction))))设置眼球缓动时间,使动画流畅:.emoji.eye.left::before,.emoji.eye.right::before{transition:0.3s;}接下来做一个tooltip提示框。在dom中添加data-tip属性,带有4个@符号,其内容为tooltip信息:
@@@@显示为::before伪元素提示信息,样式为黑白两色:.tip::before{content:attr(data-tip);位置:绝对;字体大小:0.3em;字体系列:无衬线;宽度:10em;文本对齐:居中;背景色:#222;白颜色;填充:0.5em;边界半径:0.2em;box-shadow:00.1em0.3emrgba(0,0,0,0.3);}把top提示框定位在顶部@符号的顶部中心:.tip.top::before{top:0;左:50%;transform:translate(-50%,calc(-100%-0.6em));}类似,将其他3个工具提示放在@符号旁边:.tip.bottom::before{bottom:0;左:50%;转换:翻译(-50%,计算(100%+0.6em));}.tip.left::before{left:0;顶部:50%;transform:translate(calc(-100%-0.6em),-50%);}.tip.right::before{right:0;顶部:50%;transform:translate(calc(100%+0.6em),-50%);}with::after伪元素在顶部工具提示下方绘制一个倒三角形:.tip::after{content:'';位置:绝对;字体大小:0.3em;宽度:0;高度:0;颜色:#222;border:0.6emsolidtransparent;}.tip.top::after{border-bottom-width:0;边框顶部颜色:currentColor;顶部:-0.6em;左:50%;transform:translate(-50%,0);}类似地,在其他3个提示旁边绘制三角形:.tip.bottom::after{border-top-width:0;边框底色:currentColor;底部:-0.6em;左:50%;transform:translate(-50%,0);}.tip.left::after{border-right-width:0;左边框颜色:currentColor;左:-0.6em;顶部:50%;transform:translate(0,-50%);}.tip.right::after{border-left-width:0;边界里正确颜色:currentColor;右:-0.6em;顶部:50%;transform:translate(0,-50%);}最后,隐藏工具提示,使其仅在鼠标悬停时出现:.tip::before,.tip::after{visibility:hidden;过滤器:不透明度(0);过渡:0.3s;}.tip:hover::before,.tip:hover::after{可见性:可见;filter:opacity(1);}大功告成!