iframe分栏拖拽伸缩例子
这个标题有些绕口,鄙人愚笨,实在找不到一个比较准确的说法,总之就是:
一个页面内显示多个iframe,一个变宽,另一个就变窄,一个变高,另一个就变矮的这种可自由伸缩的效果。它们之间有一个可多拽的分隔条。
我们公司的电算化考试平台需要这样的效果。最开始用的frameset,框架集,但有些问题,比如分隔条的样式不好自己设计,frameset页面不支持执行javascript。
后来我对其进行了改进,将frameset改为使用iframe,通过自己实现分隔条和拖拽效果来满足功能。
效果图:
可以点击分隔条折叠,也可以拖动分隔条调整各区域大小。
上图中,main.html页面按左右分隔嵌入了一个left.html和一个right.html
right.html里又按上下分隔嵌入了right_top.html和right_bottom.html
由于left.html、right_top.html、right_bottom.html是具体内容页面,此处不贴出代码,只贴出main.html和right.html的代码。
main.html代码:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge" > 6 <meta name="renderer" content="webkit"> 7 <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.7.2/jquery.min.js"></script> 8 <style type="text/css"> 9 *{padding:0px;margin:0px;} 10 html,body{width:100%;height:100%;} 11 </style> 12 <title>会计电算化专业技能考试系统</title> 13 <script type="text/javascript"> 14 /*** 15 * 16 * iframe横向分隔条拖拽伸缩实例 陈建宇 2016-6-14 17 * 18 ***/ 19 function init(){ 20 21 var li = $("#li");//left iframe 22 var ri = $("#ri");//right iframe 23 var s = $("#s");//中间分割条 24 var img = s.children("img").eq(0); 25 var drag = $("#drag");//分隔条中的拖拽层. 26 27 var clientWidth = $(window).width(); 28 var li_init_width=270;//上边iframe要显示的宽度,若需要调整默认宽度,请改此值即可. 29 var s_init_width=10;//分隔条宽度默认值 30 var ri_width=clientWidth-li_init_width-s_init_width;//底部iframe要显示的宽度 31 32 //初始化 33 li.css("width",li_init_width+"px"); 34 ri.css("width",ri_width+"px"); 35 s.css("left",li_init_width+"px").css("width",s_init_width+"px"); 36 img.css("width",s_init_width+"px").css("box-shadow","0 0 6px #666"); 37 38 var is_drag = false;//是否点住并进行了拖拽 39 40 41 /*** 42 * 分隔条事件处理,如果用户执行了mousedown,mousemove,mouseup说明是拖拽, 43 * 如果只执行了mousedown,mouseup说明是点击. 44 */ 45 46 47 drag.unbind("mousedown").mousedown(function () { 48 //获得分隔条内拖拽层离顶边的距离 49 var li_width = parseInt(li.css("width")); 50 var ri_width = parseInt(ri.css("width")); 51 52 //分隔条div宽度设为100%,撑满屏,只有这样才能在拖拽分隔条时,有效的控制mouseup事件. 53 s.css("width","100%").css("left","0px"); 54 img.css("left",li_width); 55 56 var start_x = event.clientX; 57 58 drag.unbind("mousemove").mousemove(function (event) { 59 is_drag = true; 60 var current_x = event.clientX; 61 var cha = current_x - start_x;//算偏移差量 62 63 li.css("width",(li_width+cha)+"px"); 64 ri.css("width",(ri_width-cha)+"px"); 65 img.css("left",(li_width+cha)+"px"); 66 67 68 69 }); 70 71 drag.unbind("mouseup").mouseup(function (event) { 72 var left = parseInt(img.css("left")); 73 s.css("width",s_init_width+"px").css("left",left+"px"); 74 img.css("left","0px"); 75 76 //处理非拖拽的click情况 77 if(!is_drag){ 78 79 //直接设定固定值 80 var src=img.attr("src"); 81 if(src.indexOf("toleft")!=-1){ 82 li.css("width","0px"); 83 s.css("left","0px"); 84 clientWidth = $(window).width(); 85 ri.css("width",(clientWidth-s_init_width)+"px"); 86 img.attr("src",src.replace("toleft","toright")); 87 }else{ 88 li.css("width",li_init_width+"px"); 89 s.css("left",li_init_width+"px"); 90 clientWidth = $(window).width(); 91 ri.css("width",(clientWidth-li_init_width-s_init_width)+"px"); 92 img.attr("src",src.replace("toright","toleft")); 93 } 94 95 } 96 97 drag.unbind("mousemove"); 98 is_drag = false; 99 100 101 102 }); 103 104 105 106 }); 107 108 109 //当窗口大小发生改变时,重新渲染页面,以使各组件自适应高宽度. 110 $(window).resize(function() { 111 //顶部iframe保持高度不变,改变底部iframe高度 112 var clientWidth = $(window).width(); 113 var li_width = parseInt(li.css("width")); 114 var new_ri_width = clientWidth - li_width - s_init_width; 115 ri.css("width",new_ri_width+"px"); 116 117 }); 118 119 } 120 121 122 123 /*** 124 * 加载左边页面方法 陈建宇 2016-6-21 125 * 当右边页面先加载完后再加载左边页面,因为左边页面需要控制右边页面里的iframe 126 * 如果右边页面还没加载完,则会出错,左边页面也会加载失败. 127 */ 128 function loadLeft(){ 129 $("#li").attr("src","exam/left.html"); 130 } 131 132 133 $(document).ready(function(){ 134 135 init(); 136 137 }); 138 139 </script> 140 141 142 </head> 143 <body scroll="no"> 144 <iframe id="li" name="left" src="left.html" frameborder="0" style="height:100%;border:none;position:absolute;left:0px;top:0px;z-index:1;"></iframe> 145 <div id="s" style="height:100%;position:absolute;z-index:3;cursor:move;"> 146 <img style="height:100%;position:absolute;z-index:1;" src="images/toleft.png"/> 147 <div style="height:100%;width:100%;position:absolute;z-index:2;margin-left:0px;margin-top:0px;padding:0px;filter:alpha(opacity=0);opacity:0;background-color:#fee;" id="drag"></div> 148 </div> 149 <iframe id="ri" name="right" src="right.html" frameborder="0" style="height:100%;border:none;position:absolute;top:0px;right:0px;z-index:2;"></iframe> 150 151 152 </body> 153 154 </html>
right.html代码:
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 2 "http://www.w3.org/TR/html4/loose.dtd"> 3 <html> 4 <head> 5 <title>iframe纵向分隔条拖拽伸缩</title> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <style type="text/css"> 8 *{padding:0px;margin:0px;} 9 html,body{width:100%;height:100%;} 10 </style> 11 <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.7.2/jquery.min.js"></script> 12 <script type="text/javascript"> 13 14 /*** 15 * 16 * iframe纵向分隔条拖拽伸缩 陈建宇 2016-6-14 17 * 18 ***/ 19 20 function init(){ 21 22 var ti = $("#ti");//top iframe 23 var bi = $("#bi");//bottom iframe 24 var s = $("#s");//中间分割条 25 var img = s.children("img").eq(0); 26 var drag = $("#drag");//分隔条中的拖拽层. 27 28 var clientHeight = $(window).height(); 29 var ti_init_height=160;//上边iframe要显示的高度,若需要调整默认高度,请改此值即可. 30 var s_init_height=10;//分隔条高度默认值 31 var bi_height=clientHeight-ti_init_height-s_init_height;//底部iframe要显示的高度 32 33 //初始化 34 ti.css("height",ti_init_height+"px"); 35 bi.css("height",bi_height+"px"); 36 s.css("top",ti_init_height+"px").css("height",s_init_height+"px"); 37 img.css("height",s_init_height+"px").css("box-shadow","0 0 6px #666"); 38 39 var is_drag = false;//是否点住并进行了拖拽 40 41 42 /*** 43 * 分隔条事件处理,如果用户执行了mousedown,mousemove,mouseup说明是拖拽, 44 * 如果只执行了mousedown,mouseup说明是点击. 45 */ 46 47 48 drag.unbind("mousedown").mousedown(function () { 49 //获得分隔条内拖拽层离顶边的距离 50 var ti_height = parseInt(ti.css("height")); 51 var bi_height = parseInt(bi.css("height")); 52 53 //分隔条div高度设为100%,撑满屏,只有这样才能在拖拽分隔条时,有效的控制mouseup事件. 54 s.css("height","100%").css("top","0px"); 55 img.css("top",ti_height); 56 57 var start_y = event.clientY; 58 59 drag.unbind("mousemove").mousemove(function (event) { 60 is_drag = true; 61 62 var current_y = event.clientY; 63 var cha = current_y - start_y;//算偏移差量 64 65 ti.css("height",(ti_height+cha)+"px"); 66 bi.css("height",(bi_height-cha)+"px"); 67 img.css("top",(ti_height+cha)+"px"); 68 69 70 71 }); 72 73 drag.unbind("mouseup").mouseup(function (event) { 74 var top = parseInt(img.css("top")); 75 s.css("height",s_init_height+"px").css("top",top+"px"); 76 img.css("top","0px"); 77 78 //处理非拖拽的click情况 79 if(!is_drag){ 80 81 //直接设定固定值 82 var src=img.attr("src"); 83 if(src.indexOf("totop")!=-1){ 84 ti.css("height","0px"); 85 s.css("top","0px"); 86 clientHeight = $(window).height(); 87 bi.css("height",(clientHeight-s_init_height)+"px"); 88 img.attr("src",src.replace("totop","tobottom")); 89 }else{ 90 ti.css("height",ti_init_height+"px"); 91 s.css("top",ti_init_height+"px"); 92 clientHeight = $(window).height(); 93 bi.css("height",(clientHeight-ti_init_height-s_init_height)+"px"); 94 img.attr("src",src.replace("tobottom","totop")); 95 } 96 97 } 98 99 drag.unbind("mousemove"); 100 is_drag = false; 101 102 103 104 }); 105 106 107 108 }); 109 110 //当窗口大小发生改变时,重新渲染页面,以使各组件自适应高宽度. 111 $(window).resize(function() { 112 //顶部iframe保持高度不变,改变底部iframe高度 113 var clientHeight = $(window).height(); 114 var ti_height = parseInt(ti.css("height")); 115 var new_bi_height = clientHeight - ti_height - s_init_height; 116 bi.css("height",new_bi_height+"px"); 117 118 }); 119 120 121 } 122 123 124 125 126 127 $(document).ready(function(){ 128 init(); 129 parent.loadLeft(); 130 }); 131 </script> 132 </head> 133 <body scroll="no"> 134 <iframe id="ti" name="top" src="right_top.html" frameborder="0" style="width:100%;border:none;position:absolute;top:0px;left:0px;z-index:1;"></iframe> 135 <div id="s" style="width:100%;position:absolute;z-index:3;cursor:move;"> 136 <img style="width:100%;position:absolute;z-index:1;" src="images/totop.png"/> 137 <div style="width:100%;height:100%;position:absolute;z-index:2;margin-top:0px;margin-left:0px;padding:0px;filter:alpha(opacity=0);opacity:0;background-color:#fee;" id="drag"></div> 138 </div> 139 <iframe id="bi" name="bottom" src="right_bottom.html" frameborder="0" style="width:100%;border:none;position:absolute;bottom:0px;left:0px;z-index:2;"></iframe> 140 141 </body> 142 </html>
分隔条图片: