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+XML 操作
Sep 20 Javascript
详解js闭包
Sep 02 Javascript
jquery用offset()方法获得元素的xy坐标
Sep 06 Javascript
实现无刷新联动例子汇总
May 20 Javascript
常用javascript表单验证汇总
Jul 20 Javascript
基于Bootstrap实现tab标签切换效果
Apr 15 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
Apr 22 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 jQuery
layui表格分页 记录勾选的实例
Sep 02 Javascript
vue中nextTick用法实例
Sep 11 Javascript
Ant Design的可编辑Tree的实现操作
Oct 31 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的ajax简单实例
2014/02/27 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
JS中使用media实现响应式布局
2017/08/04 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
vue.js todolist实现代码
2017/10/29 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
js实现百度淘宝搜索功能
2020/02/17 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
Python中格式化format()方法详解
2017/04/01 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
python多线程抽象编程模型详解
2019/03/20 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
Python如何读取、写入CSV数据
2020/07/28 Python
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
《雷雨》教学反思
2014/02/20 职场文书
学生会主席演讲稿
2014/04/25 职场文书
计算机软件专业求职信
2014/06/10 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
道士塔读书笔记
2015/06/30 职场文书
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android