js 分栏效果实现代码


Posted in Javascript onAugust 29, 2009

网上我也见到一些分栏效果,也有一个jquery的插件jquery.splitter.js, 但是他们基本都没有解决一个问题:如果页面上有iframe, 当拖动分割线经过iframe的时候,鼠标不听使唤了,我曾经开过帖子讨论过这个问题。本例采用一个小技巧解决了这个问题,使拖动流畅。

<html> 
<head> 
<title>Splitter demo</title> 
<style> 
            #splitter_container{ 
             width: 100%; 
             height: 100%; 
             border: solid #eee 1px; 
             margin: 0px; 
             padding: 0px; 
             overflow: hidden; 
            } 
            #splitter_left_panel{ 
             width: 300px; 
             height: 100%; 
             float: left; 
             border: solid blue 0px; 
            } 
            #splitter_bar{ 
             width: 8px; 
             height: 100%; 
             float: left; 
             background-color: #ccc; 
             cursor: col-resize; 
            } 
            #splitter_right_panel{ 
             height: 100%; 
             padding-top: 10px; 
            } 
</style> 
<script> 
/* 
* splitter.js 
* author: sunxing007 
* http://blog.csdn.net/sunxing007 
* date: 08/26/2009 ************************************************************************************** 
The css script below is needed for the html page when using splitter.js, please save 
it as splitter.css, and modify it carefully. 
************************************************************************************** 
#splitter_container{ 
width: 100%; 
height: 100%; 
border: solid #eee 1px; 
margin: 0px; 
padding: 0px; 
overflow: hidden; 
} 
#splitter_left_panel{ 
width: 300px; 
height: 100%; 
float: left; 
border: solid blue 0px; 
} 
#splitter_bar{ 
width: 8px; 
height: 100%; 
float: left; 
background-color: #ccc; 
cursor: col-resize; 
} 
#splitter_right_panel{ 
height: 100%; 
padding-top: 10px; 
} 
************************************************************************************** 
How to use this splitter? 
************************************************************************************** 
<!-- 
     <html> 
<head> 
<title>Splitter demo</title> 
<link href="splitter.css" type="text/css" rel="stylesheet" /> 
<script src="splitter.js"></script> 
</head> 
<body onload="Splitter.init({id: 'splitter_Container'});"> 
<div id="splitter_container"> 
<div id="splitter_left_panel"> 
left panel 
<!--you can put any html code here--> 
</div> 
<div id="splitter_bar"></div> 
<div id="splitter_right_panel"> 
right panel 
<!--you can put any html code here--> 
</div> 
</div> 
</body> 
</html> 
--> 
************************************************************************************** 
*/ 
/** this is a helper function used to get the dom element specified by id **/ 
function $(id){return document.getElementById(id);} 
/** the main functionality of splitter **/ 
var Splitter = { 
    container: null, 
    lPanel: null, 
    rPanel: null, 
    bar: null, 
movingBar: null, 
//左面板初始,最大,最小宽度 
    lPanelInitWidth: '250px', 
    lPanelMaxWidth: '500px', 
    lPanelMinWidth: '200px', 
    rPanelInitWidth: '800px', 
    rPanelMaxWidth: '999px', 
    rPanelMinWidth: '500px', 
    //分隔线被拖动的时候的颜色 
    barActiveColor: '#0080ff', 
    //左面的面板是否设置最大/最小宽度 
    isWidthLimit: true, 
    init: function(config){ 
if(!config.id){ 
alert('Can not initialize splitter.'); 
return; 
} 
if($(config.id)){ 
this.container = $(config.id); 
if(!($('splitter_left_panel')&&$('splitter_right_panel')&&$('splitter_bar'))){ 
alert('Can not initialize splitter.'); 
return; 
} 
else{ 
this.lPanel = $('splitter_left_panel'); 
this.rPanel = $('splitter_right_panel'); 
this.bar = $('splitter_bar'); 
} 
} 
if(config.lPanelMaxWidth){ 
this.lPanelMaxWidth = config.lPanelMaxWidth; 
} 
if(config.lPanelMinWidth){ 
this.lPanelMinWidth = config.lPanelMinWidth; 
} 
if(config.rPanelMaxWidth){ 
this.rPanelMaxWidth = config.rPanelMaxWidth; 
} 
if(config.rPanelMinWidth){ 
this.rPanelMinWidth = config.rPanelMinWidth; 
} 
if(config.lPanelInitWidth){ 
this.lPanelInitWidth = config.lPanelInitWidth; 
} 
if(config.rPanelInitWidth){ 
this.rPanelInitWidth = config.rPanelInitWidth; 
} 
if(config.barActiveColor){ 
this.barActiveColor = config.barActiveColor; 
} 
//alert(typeof(config.isWidthLimit)); 
if(config.isWidthLimit!=undefined){ 
this.isWidthLimit = config.isWidthLimit; 
} 
var mask = document.createElement('div'); 
document.body.appendChild(mask); 
with(mask.style){ 
position = 'absolute'; 
left = '0px'; 
top = '0px'; 
zIndex = 900; 
width = '100%'; 
height = '100%'; 
display = 'none'; 
backgroundColor = '#ccc'; 
filter = 'alpha(opacity=10)'; 
} 
//background-color:red;filter:alpha(opacity=60) 
Splitter.mask = mask; 
this.bar.onmousedown = Splitter.start; 
    }, 
    start: function(){ 
var o = Splitter.container; 
o.lastMouseX = event.x; 
Splitter.mask.style.display = ''; 
var movingBar = document.createElement('div'); 
Splitter.container.appendChild(movingBar); 
with(movingBar.style){ 
position = 'absolute'; 
left = Splitter.bar.offsetLeft + 'px'; 
top = '0px'; 
width = Splitter.bar.currentStyle.width; 
height = '100%'; 
backgroundColor = Splitter.barActiveColor; 
zIndex = 999; 
cursor = 'col-resize'; 
} 
movingBar.dx = 0; 
Splitter.movingBar = movingBar; 
document.onmousemove = Splitter.move; 
document.onmouseup = Splitter.end; 
    }, 
    move: function(){ 
var o = Splitter.container; 
var dx = event.x - o.lastMouseX; 
Splitter.movingBar.dx = Splitter.movingBar.dx + dx; 
var left = parseInt(Splitter.movingBar.style.left) + dx; 
Splitter.movingBar.style.left = left; 
o.lastMouseX = event.x; 
    }, 
    end: function(){ 
document.onmousemove = null; 
document.onmouseup = null; 
Splitter.mask.style.display = 'none'; 
var dx = Splitter.movingBar.dx; 
Splitter.container.removeChild(Splitter.movingBar); 
var w = parseInt(Splitter.lPanel.currentStyle.width) + dx; 
if(Splitter.isWidthLimit){ 
        var _width = (w > parseInt(Splitter.lPanelMaxWidth) ? Splitter.lPanelMaxWidth : (w < parseInt(Splitter.lPanelMinWidth) ? 
Splitter.lPanelMinWidth : w)); 
        w = _width; 
} 
Splitter.lPanel.style.width = w; 
    } 
}; 
</script> 
</head> 
<body onload="Splitter.init({id: 'splitter_Container', isWidthLimit: true});"> 
    <div id="splitter_container"> 
            <div id="splitter_left_panel"> 
                <iframe frameborder="0" height="100%" id="" width="100%" src="https://3water.com"></iframe> 
            </div> 
            <div id="splitter_bar"></div> 
            <div id="splitter_right_panel"> 
                    在此处右键察看源代码并把其中的js保存为splitter.js<br> 
                    splitter.js使用方法:<br> 
                    页面上需要有一个div作为容器(id=splitter_container): 可拖动效果就在这个容器里面进行<br> 
                    容器里面需要有3个div,分别代表左栏(id=splitter_left_panel),分割线(id=splitter_bar), 右栏(id=splitter_right_panel)<br> 
                    这4个div需要用css修饰一下<br> 
                    <code> 
#splitter_container{ 
width: 100%; 
height: 100%; 
border: solid #eee 1px; 
margin: 0px; 
padding: 0px; 
overflow: hidden; 
}<br> 
#splitter_left_panel{ 
width: 300px; 
height: 100%; 
float: left; 
border: solid blue 0px; 
}<br> 
#splitter_bar{ 
width: 8px; 
height: 100%; 
float: left; 
background-color: #ccc; 
cursor: col-resize; 
}<br> 
#splitter_right_panel{ 
height: 100%; 
padding-top: 10px; 
} 
</code> 
<br><br> 
给body加上onload事件处理函数,以触发splitter: <br> 
onload="Splitter.init({id: 'splitter_Container', isWidthLimit: true});" <br> 
Splitter的init方法传入一个json对象作为配置参数,其中容器id是必需的.<br> 
还可以配置更多的参数, 比如:<br> 
isWidthLimit: 可选值true, false, 设置左面板是否限制宽度;<br> 
lPanelMaxWidth: 左面板最大宽度,比如: 500px;<br> 
lPanelMinWidth: 左面板最小宽度,比如: 100px;<br> 
barActiveColor: 分割线拖动的时候的颜色: 比如'red', '#0080ff';<br> 
更多web开发相关的内容就在<a href='http://blog.csdn.net/sunxing007'>blog.csdn.net/sunxing007</a>     
            </div> 
    </div> 
</body> 
</html>
Javascript 相关文章推荐
jQuery 处理网页内容的实现代码
Feb 15 Javascript
JS中confirm,alert,prompt函数使用区别分析
Apr 01 Javascript
Jquery数独游戏解析(一)-页面布局
Nov 05 Javascript
jQuery实现列表的全选功能
Mar 18 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
Nov 19 Javascript
jquery弹出遮掩层效果【附实例代码】
Apr 28 Javascript
Vue.js使用v-show和v-if的注意事项
Dec 13 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
Dec 21 Javascript
vue.js使用watch监听路由变化的方法
Jul 08 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
Aug 21 Javascript
微信小程序获取当前位置和城市名
Nov 13 Javascript
JS图片懒加载技术实现过程解析
Jul 27 Javascript
javascript 简练的几个函数
Aug 29 #Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
Aug 28 #Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
Aug 28 #Javascript
javascript 遍历验证所有文本框的值
Aug 27 #Javascript
JQuery 浮动导航栏实现代码
Aug 27 #Javascript
jQuery ui1.7 dialog只能弹出一次问题
Aug 27 #Javascript
JSON 客户端和服务器端的格式转换
Aug 27 #Javascript
You might like
深入PHP异步执行的详解
2013/06/03 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
2011/12/12 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
javascript获取系统当前时间的方法
2015/11/19 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
Python时间获取及转换知识汇总
2017/01/11 Python
python对象与json相互转换的方法
2019/05/07 Python
PyQt5 对图片进行缩放的实例
2019/06/18 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
python与js主要区别点总结
2020/09/13 Python
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
Ruby如何创建一个线程
2013/03/10 面试题
教师远程培训感言
2014/03/06 职场文书
小学生综合素质评语
2014/04/23 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
社会实践活动报告
2015/02/05 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
nginx中proxy_pass各种用法详解
2021/11/07 Servers
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android