JavaScript实现页面高亮操作提示和蒙板


Posted in Javascript onJanuary 04, 2021

本文实例为大家分享了JavaScript实现页面高亮操作提示和蒙板的具体代码,供大家参考,具体内容如下

在页面上,有时候会遇到操作提示,如下图所示。
可以很直观的告诉用户,关键的操作在哪里,有什么做作用。

JavaScript实现页面高亮操作提示和蒙板

需要说明的是,被高亮的部分,并不是目标的真实标签,而是用的其他标签模拟的。
真实的标签被 mask 层盖住了,在下方呢。

标签高亮的部分和操作提示框,都是用 js 动态生成的。

这里关键的知识点:

1、要用 JS 获取目标标签的位置。

el.getBoundingClientRect() 可以获得标签距离窗口的位置。
window.pageXOffset
window.pageYOffset
则是获取页面左,上边滚动出去部分的长度。
利用它们相加,可以得到目标标签在页面中的绝对位置。再把【高亮】标签放在相同位置就可以。

2、要能动态生成提示标签和遮罩层(一般是半透明的黑色)

3、还要用到 CSS 中的定位。

为了更直接的模拟真实情况,我采用了一些标签来模拟页面的结构。

HTML 代码如下:

<!-- 模拟头部 -->
<header class="header">
 模拟头部
</header>
<!-- 模拟头部 end -->
<!-- 模拟导航 -->
<nav class="mainNav">
 模拟导航
</nav>
<!-- 模拟导航 end -->

<!-- 主体部分 -->
<main class="pageMain">
 <ul class="sidebar">
  <li id="step1"><a href="#" >操作第一步</a></li>
  <li><a href="#" >操作第二步</a></li>
  <li><a href="#">操作第三步</a></li>
 </ul>
 <div class="other">
  模拟其他部分
 </div>
</main>
<!-- 主体部分 end -->

基本样式如下:

.posa{
 position: absolute;
}
.header{
 height: 200px;
 width: 1200px;
 margin-left: auto;
 margin-right: auto;
 background: #eee;
}
.mainNav{
 height: 80px;
 width: 1200px;
 margin-left: auto;
 margin-right: auto;
 background: #5f5fd7;
}
.pageMain{
 width: 1200px;
 margin-left: auto;
 margin-right: auto;
 background: #eee;
}
.sidebar{
 width: 200px;
 line-height: 50px;
 text-align: center;
 background: #fff;
 border:1px #666 solid;
 border-bottom:none;
}
.sidebar a{
 display: block;
 border-bottom:1px #666 solid;
 color: #333;
}

.other{
 height: 700px;
 background: #708af5;
 font-size: 30px;
 color: #fff;
}

.mask{
 position: fixed;
 top:0;
 right:0;
 bottom: 0;
 left:0;
 background: rgba(0, 0, 0, 0.48);
}

.tips{
 background: #fff;
 position: absolute;
 line-height: 50px;
 color: #333;
 display: block;
 text-align: center;
}

.tipsc_content{
 margin-left: 200px;
 padding-top: 100px;
 margin-right: 80px;
}
.tipsc_btn{
 padding-top: 30px;
}

.tipsc_btn button{
 outline:none;
 width: 100px;
 height: 40px;
 background: #09a366;
 color: #fff;
 border:none;
 cursor: pointer;
}

JavaScript 代码如下:

// 获取目标标签
let step1 = document.getElementById("step1");
let body = document.getElementsByTagName("body")[0];

let tips = null,
 mask = null,
 tipsContent= null;
// 创建标签。默认生成 mask 标签
let makeElement = function({id="mask",classN="mask",content = ""}={}){
 let eId = document.getElementById(id);
 if( !eId ){ // 判断 mask 是否存在
  eId = document.createElement("div");
  eId.id = id;
  eId.className =classN;
  eId.innerHTML = content;
  body.appendChild( eId );
  return eId ;
 }else{
  return eId; // mask 已经存在,不需要再创建。
 }
};
// 去掉遮罩层
let removeTag = function(tag){
 tag.parentNode.removeChild( tag );
};

// 获取要提示的内容的位置。这里是 li#step1
let getPostion = function(tag){
 let x = tag.getBoundingClientRect().x ;
 let y = tag.getBoundingClientRect().y ;
 return {x:x,y:y};
};
// 设置tips的位置
let setPosition = function(tips, {x="0",y="0",w="0",h="0"}={}){
 tips.style.left = x + "px" ;
 tips.style.top = y+ "px" ;
 tips.style.width = w+ "px"
 tips.style.height = h + "px"
 console.info(tagP.x , tagP.y );
};
// 获取要提示的内容的标签位置
let tagP = getPostion(step1);
// 生成 mask
mask = makeElement();
// 生成目标标签的高亮框
tips = makeElement({
 id:"tips",
 classN:"tips",
 content :"操作第一步" // 伪装原标签的内容
});
setPosition(tips, {
 x:tagP.x + window.pageXOffset,
 y:tagP.y + window.pageYOffset,
 w:step1.offsetWidth ,
 h:step1.offsetHeight
});


// 生成提示内容框
tipsContent = makeElement({
 id:"tipsContent",
 classN:"tipsContent posa",
 content :`<div style="width: 490px; height: 300px;background:url('images/op_tips.png') no-repeat;">
    <div class="tipsc_content">
     根据项目内容调整样式
     <div class="tipsc_btn">
       <button type="button" id="okBtn">确定</button>
     </div>
    </div>
  </div>`
});
setPosition(tipsContent, {
 x:tagP.x + window.pageXOffset+200,
 y:tagP.y + window.pageYOffset-100,
 w:490,
 h:300
});

// 点击“确定”按钮
let okBtn = document.getElementById("okBtn");
okBtn.addEventListener("click",function(){
 removeTag(mask);
 removeTag(tips);
 removeTag(tipsContent);
});

// 当窗口调整大小时候,调整 tips 位置。
window.addEventListener("resize",function(){
 tagP = getPostion(step1);
 setPosition(tips,tagP);
});

简单进行了下函数封装,但是还是觉得代码写的不够完美。比如用JS生成了样式,其实可以把一些样式封装在CSS 中。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS中图片缓冲loading技术的实例代码
Aug 29 Javascript
LABjs、RequireJS、SeaJS的区别
Mar 04 Javascript
jquery实现textarea 高度自适应
Mar 11 Javascript
jquery中object对象循环遍历的方法
Dec 18 Javascript
jQuery toggle 代替方法
Mar 22 Javascript
JavaScript实现图片懒加载(Lazyload)
Nov 28 Javascript
Angular 表单控件示例代码
Jun 26 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
Nov 28 Javascript
vue+swiper实现侧滑菜单效果
Dec 28 Javascript
[原创]jquery判断元素内容是否为空的方法
May 04 jQuery
javascript合并两个数组最简单的实现方法
Sep 14 Javascript
highcharts.js数据绑定方式代码实例
Nov 13 Javascript
js正则表达式简单校验方法
Jan 03 #Javascript
vue+vant 上传图片需要注意的地方
Jan 03 #Vue.js
vue调用微信JSDK 扫一扫,相册等需要注意的事项
Jan 03 #Vue.js
vue中使用echarts的示例
Jan 03 #Vue.js
vue 动态生成拓扑图的示例
Jan 03 #Vue.js
Vue中强制组件重新渲染的正确方法
Jan 03 #Vue.js
vue中activated的用法
Jan 03 #Vue.js
You might like
用PHP查询域名状态whois的类
2006/11/25 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
php提取微信账单的有效信息
2018/10/01 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
jQuery MD5加密实现代码
2010/03/15 Javascript
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
Python编程之微信推送模板消息功能示例
2017/08/21 Python
python+matplotlib绘制饼图散点图实例代码
2018/01/20 Python
python字符串和常用数据结构知识总结
2019/05/21 Python
python画环形图的方法
2020/03/25 Python
构建高效的python requests长连接池详解
2020/05/02 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
GWT都有什么特性
2016/12/02 面试题
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
MySQL 数据库范式化设计理论
2022/04/22 MySQL
python中filter,map,reduce的作用
2022/06/10 Python