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 相关文章推荐
javascript中的delete使用详解
Apr 11 Javascript
动态加载js的方法汇总
Feb 13 Javascript
JavaScript中调用函数的4种方式代码实例
Jul 08 Javascript
js模仿php中strtotime()与date()函数实现方法
Aug 11 Javascript
标准的js无缝滚动效果
Aug 30 Javascript
关于js函数解释(包括内嵌,对象等)
Nov 20 Javascript
D3.js进阶系列之CSV表格文件的读取详解
Jun 06 Javascript
利用node.js爬取指定排名网站的JS引用库详解
Jul 25 Javascript
详解JS模块导入导出
Dec 20 Javascript
Vuex mutitons和actions初使用详解
Mar 04 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
Aug 26 Javascript
js 数组 fill() 填充方法
Nov 02 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连接MSSQL方法汇总
2016/02/05 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
Javascript this 的一些学习总结
2012/08/31 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
微信小程序仿今日头条导航栏滚动解析
2019/08/20 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
布同自制Python函数帮助查询小工具
2011/03/13 Python
基于Python实现一个简单的银行转账操作
2016/03/06 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
使用Python和Scribus创建一个RGB立方体的方法
2019/07/17 Python
Python requests模块session代码实例
2020/04/14 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
经典c++面试题二
2015/08/14 面试题
公司办公室岗位职责
2014/03/19 职场文书
个人求职自荐信范文
2014/06/20 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
公司保密管理制度
2015/08/04 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫
Python中request的基本使用解决乱码问题
2022/04/12 Python