- 浏览: 12074 次
文章分类
最新评论
javascript:浮动div,可拖拽div,遮罩层(div和iframe实现)
在网页中,经常需要标题里提到的几种效果,实现比较简单,这里总结一下(IE测试通过),以备日后再用。
预备知识:网页中的高和宽
//获取浏览器的宽和高(多种浏览器) function getNavWidthandHeightInfo() { var s = ""; s += " 网页可见区域宽:"+ document.body.clientWidth; s += " 网页可见区域高:"+ document.body.clientHeight; s += " 网页可见区域宽:"+ document.body.offsetWidth + " (包括边线和滚动条的宽)"; s += " 网页可见区域高:"+ document.body.offsetHeight + " (包括边线的宽)"; s += " 网页正文全文宽:"+ document.body.scrollWidth; s += " 网页正文全文高:"+ document.body.scrollHeight; s += " 网页被卷去的高(ff):"+ document.body.scrollTop; s += " 网页被卷去的高(ie):"+ document.documentElement.scrollTop; s += " 网页被卷去的左:"+ document.body.scrollLeft; s += " 网页正文部分上:"+ window.screenTop; s += " 网页正文部分左:"+ window.screenLeft; s += " 屏幕分辨率的高:"+ window.screen.height; s += " 屏幕分辨率的宽:"+ window.screen.width; s += " 屏幕可用工作区高度:"+ window.screen.availHeight; s += " 屏幕可用工作区宽度:"+ window.screen.availWidth; s += " 你的屏幕设置是: "+ window.screen.colorDepth +" 位彩色"; s += " 你的屏幕设置: "+ window.screen.deviceXDPI +" 像素/英寸"; s += "当前窗口的内部宽度:"+ window.innerWidth; s += "当前窗口的内部高度:"+ window.innerHeight; //alert (s); } getNavWidthandHeightInfo();
另外,网页中的元素常见定位需要用到的概念一并总结一下:
HTML中的元素定位: scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离 scrollWidth:获取对象的滚动宽度 scrollHeight: 获取对象的滚动高度 offsetLeft:获取对象相对于版面或由 offsetParent属性指定的父坐标的计算左侧位置 offsetTop:获取对象相对于版面或由 offsetParent属性指定的父坐标的计算顶端位置 offsetHeight:获取对象相对于版面或由父坐标 offsetParent属性指定的父坐标的高度 event.clientX 相对文档的水平座标 event.clientY 相对文档的垂直座标 event.offsetX 相对容器的水平坐标 event.offsetY 相对容器的垂直坐标 document.documentElement.scrollTop 垂直方向滚动的值 event.clientX+document.documentElement.scrollTop 相对文档的水平座标+垂直方向滚动的量 (注意:CSS中的margin属性,与clientWidth、offsetWidth、clientHeight、offsetHeight均无关)
来看一下笔者写的关于定位和关于宽和高的js函数:来看一下笔者写的关于定位和关于宽和高的js函数:来看一下笔者写的关于定位和关于宽和高的js函数:
/* 关于位置 (前面两种常用) */ //1.取鼠标的位置(Coordinate 坐标x和y) 兼容IE,FF和其他主流浏览器 (onmouseover="getMouseCoordinate(event)") function getMouseCoordinate(ev) { var e = ev ? ev : (window.event ? window.event : null); if (e.pageX || e.pageY) { alert("x:" + e.pageX + "--y:" + e.pageY); } else { alert("x:" + event.x + "--y:" + event.y); } } //2.通过控件获取控件在页面的位置 (oControl是控件) function getControlCoordinateByControl(oControl) { var leftPos = oControl.offsetLeft; var topPos = oControl.offsetTop; var height = oControl.offsetHeight; while (oControl = oControl.offsetParent) { leftPos += oControl.offsetLeft; topPos += oControl.offsetTop; } alert("x:" + leftPos + "--y:" + topPos); } //3.通过控件自身取得控件的宽和高,返回width和height function getControlWidthAndHeightByControl(oControl) { //var width = oControl.style.width; //var height = oControl.style.height; var width = oControl.offsetWidth; var height = oControl.offsetHeight; alert("width:" + width + "--height:" + height); }
PS:关于dom的一些高和宽,下面这张图有助于我们理解的更清楚:PS:关于dom的一些高和宽,下面这张图有助于我们理解的更清楚:
一: 浮动div的实现
//floatDiv.js function MoveFloatLayer() { var x = document.documentElement.clientWidth / 2; var y = document.documentElement.clientHeight / 2; var docuTop = document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop; var y = docuTop + y; var divTopBar = document.getElementById("divFloat"); // divTopBar.style.left = x; // divTopBar.style.top = y; divTopBar.style.pixelLeft = x; divTopBar.style.pixelTop = y; //alert("now x:" + x + " & now y:" + y); } function initialFloatDiv() { window.setInterval(MoveFloatLayer, 20); } window.onload = initialFloatDiv;
Float.aspx文件:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FloatDiv.aspx.cs" Inherits="WebTest2008.FloatDiv" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head><title>浮动div</title> <script src="js/floatDiv.js" type="text/javascript"></script> </head> <form id="form1" runat="server"> <div id="divFloat" style="position: absolute; width: 215px; z-index: 1; background:#cef"> 测试! </div> <div> test test test<br /> test test test<br /> test test test<br /> </div> </form> </html>
//dragDiv.js // 实现可拖动的div var px = 0; var py = 0; var begin = false; //是否要开启透明效果 var enableOpacity = false; // 默认不允许 var myDragDiv; function down(oDiv) { myDragDiv = oDiv; begin = true; oDiv.style.cursor = "hand"; event.srcElement.setCapture(); px = oDiv.style.pixelLeft - event.x; py = oDiv.style.pixelTop - event.y; } function document.onmousemove() { if (myDragDiv != null && typeof (myDragDiv) != "undefined") { if (begin) { if (enableOpacity) { myDragDiv.style.filter = "Alpha(opacity=30)"; } // 滤镜 myDragDiv.style.pixelLeft = px + event.x; myDragDiv.style.pixelTop = py + event.y; } } } function document.onmouseup() { if (myDragDiv != null && typeof (myDragDiv) != "undefined") { begin = false; if (enableOpacity) { myDragDiv.style.filter = "Alpha(opacity=100)"; } // 滤镜 myDragDiv.style.cursor = "default"; event.srcElement.releaseCapture(); myDragDiv = null; } }
上面的js怎么用呢?看到down函数的方式你就会猜到一些端倪,好了,看html文件吧:
<html> <head> <title>Drag Div</title> <script src="js/dragDiv.js" type="text/javascript"></script> </head> <body> <div id="divDrag" style="position: absolute; width: 160px;height:100px;z-index: 1; background:#cef"> 按下鼠标拖动 </div> </body> </html>
对比浮动div的style,你看到相同点了吗?没错,就是position的那些事儿...
三、遮罩层(div和iframe实现)
下面两个js(myLightBoxDiv.js和myLightBoxFrame.js)介绍遮罩层的不同实现思路,本来可以整合在一起,为了条例清晰把它们分成两个js文件,它们的效果其实是一样的。
(1)div的实现方式
对比浮动div的style,你看到相同点了吗?没错,就是position的那些事儿...
三、遮罩层(div和iframe实现)
下面两个js(myLightBoxDiv.js和myLightBoxFrame.js)介绍遮罩层的不同实现思路,本来可以整合在一起,为了条例清晰把它们分成两个js文件,它们的效果其实是一样的。
(1)div的实现方式
var isIE = (document.all) ? true : false; //document.all 只有ie支持此属性 var ieVersion = 7; //IE版本,默认为7 if (isIE) { ieVersion = parseFloat(navigator.appVersion.split("MSIE")[1]); } var de = getBodyObj(); function getBodyObj() { return (document.documentElement) ? document.documentElement : document.body; } function resetCSS(elem, prop) { for (var i in prop) { elem.style[i] = prop[i]; } } //滚动条位置 function scrollX() { return self.pageXOffset || de && de.scrollLeft || document.body.scrollLeft; } function scrollY() { return self.pageYOffset || de && de.scrollTop || document.body.scrollTop; } //可视尺寸 function windowW() { return self.innerWidth || de && de.clientWidth || document.body.clientWidth; } function windowH() { return self.innerHeight || de && de.clientHeight || document.body.clientHeight; } //页面尺寸(最小不小于可视尺寸) function pageW() { var s = document.body.scrollWidth; var c = windowW(); return s > c ? s : c; } function pageH() { var s = document.body.scrollHeight; var c = windowH(); return s > c ? s : c; } //lightbox显示和隐藏 function createDivOverLayer(w, h) { //内容 var tempInnerHtml = "<div id=\"divOverProgress\" style='width:400px;height:250px;margin:0 auto;position:absolute;top:0px;padding-top:8px;text-align:right;background-color:#fff;border:8px solid #8F8F8F;' title='按住鼠标可以拖动' onmousedown = \"down(this)\">"; tempInnerHtml += "<span id=\"spanCloseLightBox\" onclick=\"closeLightBox()\" style=\"cursor: pointer; color: Blue\">关闭</span><br/>"; tempInnerHtml += "<div style=\"margin-top: 90px; text-align: center\"><a href=\"#\" onclick=\"alert('confirm')\">确定</a><a href=\"#\" onclick=\"closeLightBox()\">取消</a></div>"; tempInnerHtml += "</div>"; //建立lightbox var over = document.createElement("div"); over.id = "myLightBoxLayer"; var over2 = document.createElement("div"); over2.id = "myProcessLayer"; document.body.appendChild(over); document.body.appendChild(over2); //重设lightbox尺寸和位置 function resetOver() { //设定遮掩层尺寸 resetCSS(over, { position: "absolute", zIndex: "998", top: "0px", left: "0px", backgroundColor: "gray", opacity: "0.5", filter: "alpha(opacity=80)", width: pageW() + "px", height: pageH() + "px" }); //设定弹出层尺寸和位置 var eh = windowH() - h; var ew = windowW() - w; eh = eh < 0 ? 0 : eh; ew = ew < 0 ? 0 : ew; if (ieVersion != 7) resetCSS(over2, { position: "absolute", zIndex: "999", width: w + "px", height: h + "px", left: scrollX() + parseInt(ew / 2) + "px", top: scrollY() + parseInt(eh / 2) + "px", overFlow: "hidden", filter: "alpha(opacity=0)" }); else resetCSS(over2, { position: "absolute", zIndex: "999", width: w + "px", height: h + "px", left: scrollX() + parseInt(ew / 2) + "px", top: scrollY() + parseInt(eh / 2) + "px", overFlow: "hidden" }); }; resetOver(); window.onresize = resetOver; window.onscroll = resetOver; if (ieVersion != 7) { //将所有select置为不可用 var oSelects = document.getElementsByTagName("select"); for (var i = 0; i < oSelects.length; i++) { oSelects[i].disabled = true; oSelects[i].style.visibility = "hidden"; } } over2.innerHTML = tempInnerHtml; } //点击关闭lightbox function closeLightBox() { var over = document.getElementById("myLightBoxLayer"); var over2 = document.getElementById("myProcessLayer"); document.body.removeChild(over); document.body.removeChild(over2); if (ieVersion != 7) { //将所有select置为可用 var oSelects = document.getElementsByTagName("select"); for (var i = 0; i < oSelects.length; i++) { oSelects[i].disabled = false; oSelects[i].style.visibility = "visible"; } } }
上面的js里让遮罩层over2设置为浮动,下面的html可以让你测试滚动情况下的可以拖动的遮罩效果。
<html> <head> <title>Cover Layer</title> <script src="js/myLightBoxDiv.js" type="text/javascript"></script> <script src="js/dragDiv.js" type="text/javascript"></script> </head> <body> <select id="Select1"> <option>test test test test test</option> </select> <br /> <select id="Select2" multiple="multiple"> <option>test test test test test</option> </select> <span style="cursor:pointer; color:Blue" id="testtest" onclick="createDivOverLayer(400, 400)">测试</span> <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <span style="cursor:pointer; color:Blue" id="Span1" onclick="createDivOverLayer(400, 400)">测试</span> </body> </html>
(2)IFrame实现方式
同上,复制下面代码试试看效果吧
//myLightBoxFrame.js var isIE = (document.all) ? true : false; //document.all 只有ie支持此属性 var ieVersion = 7; //IE版本,默认为7 if (isIE) { ieVersion = parseFloat(navigator.appVersion.split("MSIE")[1]); } var de = getBodyObj(); function getBodyObj() { return (document.documentElement) ? document.documentElement : document.body; } function resetCSS(elem, prop) { for (var i in prop) { elem.style[i] = prop[i]; } } //滚动条位置 function scrollX() { return self.pageXOffset || de && de.scrollLeft || document.body.scrollLeft; } function scrollY() { return self.pageYOffset || de && de.scrollTop || document.body.scrollTop; } //可视尺寸 function windowW() { return self.innerWidth || de && de.clientWidth || document.body.clientWidth; } function windowH() { return self.innerHeight || de && de.clientHeight || document.body.clientHeight; } //页面尺寸(最小不小于可视尺寸) function pageW() { var s = document.body.scrollWidth; var c = windowW(); return s > c ? s : c; } function pageH() { var s = document.body.scrollHeight; var c = windowH(); return s > c ? s : c; } //lightbox显示和隐藏 function createFrameOverLayer(w, h, href) { //内容 var tempInnerHtml = "<div id=\"divProcessHead\" style='width:100%;margin:0 auto;position:absolute;top:0px;padding-top:8px;text-align:right;background-color:#fff' id='overprogress'>"; tempInnerHtml += " <span id=\"spanCloseLightBox\" onclick=\"closeLightBox()\" style=\"cursor: pointer; color: Blue\">关闭</span></div>"; tempInnerHtml += " <iframe scrolling='no' frameborder='0' src='" + href + "' width='100%' height='100%'></iframe>"; //建立lightbox var over = document.createElement("div"); over.id = "myLightBoxLayer"; var over2 = document.createElement("div"); over2.id = "myProcessLayer"; document.body.appendChild(over); document.body.appendChild(over2); //重设lightbox尺寸和位置 function resetOver() { //设定遮掩层尺寸 resetCSS(over, { position: "absolute", zIndex: "998", top: "0px", left: "0px", backgroundColor: "gray", opacity: "0.5", filter: "alpha(opacity=80)", width: pageW() + "px", height: pageH() + "px" }); //设定弹出层尺寸和位置 var eh = windowH() - h; var ew = windowW() - w; eh = eh < 0 ? 0 : eh; ew = ew < 0 ? 0 : ew; resetCSS(over2, { position: "absolute", zIndex: "999", width: w + "px", height: h + "px", left: scrollX() + parseInt(ew / 2) + "px", top: scrollY() + parseInt(eh / 2) + "px", overFlow: "hidden" }); // over2.onmousedown = "down(this)"; }; resetOver(); window.onresize = resetOver; window.onscroll = resetOver; if (ieVersion != 7) { //将所有select置为不可用 var oSelects = document.getElementsByTagName("select"); for (var i = 0; i < oSelects.length; i++) { oSelects[i].disabled = true; } } over2.innerHTML = tempInnerHtml; } //点击关闭lightbox function closeLightBox() { var over = document.getElementById("myLightBoxLayer"); var over2 = document.getElementById("myProcessLayer"); document.body.removeChild(over); document.body.removeChild(over2); if (ieVersion != 7) { //将所有select置为可用 var oSelects = document.getElementsByTagName("select"); for (var i = 0; i < oSelects.length; i++) { oSelects[i].disabled = false; } } }
html代码:
//JsTest.html <html> <head> <title>Cover Layer</title> <script src="js/myLightBoxFrame.js" type="text/javascript"></script> <script src="js/dragDiv.js" type="text/javascript"></script> </head> <body> <select id="Select1"> <option>test test test test test</option> </select> <br /> <select id="Select2" multiple="multiple"> <option>test test test test test</option> </select> <span style="cursor:pointer; color:Blue" id="testtest" onclick="createFrameOverLayer(400, 400,'myJsTest.htm')">测试</span> <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test<br />test <span style="cursor:pointer; color:Blue" id="Span1" onclick="createFrameOverLayer(400, 400,'myJsTest.htm')">测试</span> </body> </html> //第二个html文件,myJsTest.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title></title> </head> <body> <div style="margin-top: 80px; text-align: center"> <a href="#" onclick="alert('confirm')">确定</a><a href="#" onclick="alert('cancel')">取消</a> </div> </body> </html>
注意上面的html代码里包含两个html文件,主文件是jsTest.html,iframe的src引用的是myJsTest.html文件.总结介绍结束了。^_^
PS:欢迎志同道合的园友共同总结和讨论常见js特效,有好资源一定共享啊,前几天发现一个,http://www.scriptlover.com/controls/,真好资源也。
相关推荐
javascript浮动div,可拖拽div,遮罩层(div和iframe实现)
JS可拖动窗口控件,可实现各种DIV窗口自定义及各种DIV弹出提示框 带遮罩层的DIV窗口(对话框)控件 js javascript 对话框
纯Javascript编写的div拖拽以及用鼠标绘制div之间连接线,外部资源仅需要jquery。有以下功能: 1、创建节点 2、节点随鼠标任意拖动 3、切换拖动和画线模式 4、用鼠标绘制两个节点之间带有箭头的连线 5、连接线随节点...
vue 实现页面div盒子拖拽排序功能前言:目前市面上有很多实现拖拽排序功能的插件和方法,本节不过多累述,只讲一种:css3的transition-group方法 效果图: 1. DOM中使用: ...
javaScript实现DIV简单拖拽
很棒的用Javascript实现DIV的拖拽和添加
一个很好用的javaScript写的小程序,可实现div的拖动、变形。解压后直接拷到程序中就可运行
Asp.net+JavaScript 实现的可拖动、可调节大小的 div层,div层中添加 sql2000 数据 开发工具:Visual2005,兼容Visual2008 数据库名:2010Expo 数据库附加失败可以直接建表manage 表属性manageid,managename,phone,...
JQ JS javascript layui UI组件 元素 div 拖动插件JQ JS javascript layui UI组件 元素 div 拖动插件
javascript实现div的拖拽 html 文件,兼容火狐 IE
附件中有5个不同的网页,使用JavaScript实现div窗口拖动
包含开始拖动,停止拖动,释放的功能 <div id="title" onMouseDown="startDrag(this,event)" onMouseMove="drag(this,event)" onMouseUp="stopDrag(this)" style="width: 200px; height: 20px; background-color: #...
javascript实现鼠标拖动div的效果。。。
JAVASCRIPT弹出DIV层窗口实例
如果乱码的话,,那就改一下编码,,,GB2312或者utf-8,,还乱码,那就编辑js文件在保存下保存,GB2312或者utf-8,,页面上也一致
Javascript实现div对话框效果
Js无刷新添加新层,拖动DIV层可互换位置的JavaScript实现 Js无刷新添加新层,拖动DIV层可互换位置的JavaScript实现
用CSS和Javascript实现的DIV遮照飘浮层 通过点击按钮显示半透明遮盖层以及信息层 用CSS实现的固定飘浮,以及用Javascript实现的定位飘浮 用VS2008打开后直接运行UserShowPanelTest.aspx的效果是CSS实现的效果,要实现...
主要介绍了JavaScript实现DIV层拖动及动态增加新层的方法,设计javascript操作div层的拖动与增加的相关技巧,需要的朋友可以参考下
主要介绍了JavaScript实现可拖拽的拖动层Div的方法,拖拽页面中的div块可实现div块按照拖动轨迹移动的效果,涉及javascript鼠标事件、页面元素样式结合事件函数动态操作的相关技巧,需要的朋友可以参考下