Resizable Panel

HTML

 <!doctype html>
<html>
<head>
<title>Resizable Panel</title>
<meta charset="utf-8">
<link type="text/css" rel="stylesheet" href="css/style.css">
</head>
<body>
<div id="ui-resizable" class="ui-resizable">
<div id="title" class="title">resizable面板</div>
</div>
<script type="text/javascript" src="js/script.js"></script>
</body>
</html>

CSS

 .ui-resizable {
width:400px;
height:240px;
margin:50px;
position:relative;
border:1px solid black;
} .title {
height:50px;
line-height:50px;
text-align:center;
font-size:24px;
font-weight:bold;
background-color:#ccc;
} .resizable-r {
width:10px;
height:100%;
background-color:green;
position:absolute;;
right:;
top:;
cursor:e-resize;
} .resizable-b {
width:100%;
height:10px;
background-color:blue;
position:absolute;
bottom:;
right:;
cursor:s-resize;;
} .resizable-rb {
width:10px;
height:10px;
background-color:red;
position:absolute;
right:;
bottom:;
cursor:nw-resize;
}

JavaScript

思路总结:

(1)为面板附加三个控制元素;

(2)让控制元素支持拖动;

(3)动态调整面板的大小。

 window.onload = function() {
//添加控制元素
resizable("ui-resizable");
} function resizable(panel_id) {
//创建元素并添加属性
var panel = document.getElementById(panel_id);
var right = document.createElement("div");
var bottom = document.createElement("div");
var right_bottom = document.createElement("div");
right.className = "resizable-r resizable-control";
bottom.className = "resizable-b resizable-control";
right_bottom.className = "resizable-rb resizable-control";
//将元素添加到文档中
panel.appendChild(right);
panel.appendChild(bottom);
panel.appendChild(right_bottom);
document.body.appendChild(panel);
//为每一个元素添加事件,并传入相应的参数
right.onmousedown = function(event) {
fnDown(event, panel, right, "right");
}
bottom.onmousedown = function(event) {
fnDown(event, panel, bottom, "bottom");
}
right_bottom.onmousedown = function(event) {
fnDown(event, panel, right_bottom, "right_bottom");
}
}; function fnDown(event, panel, control, type) {
event = event || window.event;
//按下鼠标时,鼠标距离控制元素左上角的距离
//由于控制元素是绝对定位的,而且有一个已经定位的父元素,所以控制元素的offsetLeft值与offsetTop值需要额外处理
//控制元素right其offsetTop值为0.其真正距离页面上端的距离应该为它自己的offsetTop加上其父元素的offsetTop;
//其offsetLeft为390,其真正距离页面左边的距离应该加上其父元素的offsetLeft
var m_start_x = event.clientX - (control.offsetLeft + panel.offsetLeft);
var m_start_y = event.clientY - (control.offsetTop + panel.offsetTop); document.onmousemove = function(event) {
event = event || window.event;
//计算控制元素移动的动态距离
var l = event.clientX - panel.offsetLeft - m_start_x;
var t = event.clientY - panel.offsetTop - m_start_y;
//控制其移动最小距离
if(l < 200) {
l =200;
}
if(t < 50) {
t = 50;
}
//对不同类型的控制元素分别进行处理
switch(type) {
case "right":
//让控制元素跟随鼠标移动
//一定要记得加单位!!!
control.style.left = l + "px";
//调整面板
panel.style.width = l + 10 + "px";
break;
case "bottom":
control.style.top = t + "px";
panel.style.height = t + 10 + "px";
break;
case "right_bottom":
control.style.left = l + "px";
control.style.top = t + "px";
panel.style.width = l + 10 + "px";
panel.style.height = t + 10 + "px";
}
} document.onmouseup = function() {
//取消鼠标跟随
document.onmousemove = null;
document.onmouseup = null;
//将控制元素的位置复原
var controls = document.getElementsByClassName("resizable-control");
for(var i = 0, l = controls.length; i < l; i++) {
controls[i].style.left = "";
controls[i].style.top = "";
}
}
}

最后一步复原控制元素的位置,逻辑未明。。。

JS Resizable Panel 练习的更多相关文章

  1. easyloader.js源代码分析

    http://www.cnblogs.com/jasonoiu/p/easyloader_source_code_analysis.html Jquery easyui是一个javascript UI ...

  2. Dojo前端开发框架与jQuery前端开发框架,对比分析总结

    最近Dojo和jQuery双双发布了最新的1.8版本,有着相同版本号的两个Javascript库也有许多核心的相同之处:相同的资源加载机制AMD.相同的选择器 引擎Sizzle等.作为业界知名的Jav ...

  3. 3.EasyUI学习总结(三)——easyloader源码分析

    easyloader模块是用来加载jquery easyui的js和css文件的,即easyloader可以在调用的时候自动加载当前页面所需的文件,不用再自己引用, 而且它可以分析模块的依赖关系,先加 ...

  4. easyloader源码

    /** * easyloader - jQuery EasyUI * * Licensed under the GPL: * http://www.gnu.org/licenses/gpl.txt * ...

  5. Jquery easyui 教程

            Jquery easyui教程                 目  录 1基本拖放... 4 2构建购物车型拖放... 5 3创建课程表... 8 4菜单和按钮Menu and Bu ...

  6. easyui源码翻译1.32--EasyLoader(简单加载)

    前言 扩展自$.fn.datebox.defaults,使用$.fn.datetimebox.defaults重写默认值对象.下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3. ...

  7. Dojo与jQuery综合比较分析

    最近一直都在参与项目,无法抽空写些或者看些东西,周末抽了点时间看了下关于Dojo和Jquery的东西,在CSDN上看到一篇两个框架进行对比的文章,感觉写的不错,就拿了过来,没有别的意思,一来想保留下来 ...

  8. EasyUI学习总结(三)——easyloader源码分析(转载)

    声明:这一篇文章是转载过来的,转载地址忘记了,原作者如果看到了,希望能够告知一声,我好加上去! easyloader模块是用来加载jquery easyui的js和css文件的,而且它可以分析模块的依 ...

  9. (一)jQuery EasyUI 的EasyLoader载入原理

    1.第一次看了官网的demo.引用的是EasyLoader.js文件,而不是引用jquery.easyui.min.js文件,我就有疑问了,百度一下. jQuery EasyUI是一款基于JQuery ...

随机推荐

  1. 推荐一款开源的C#TCP通讯框架

    原来收费的TCP通讯框架开源了,这是一款国外的开源TCP通信框架,使用了一段时间,感觉不错,介绍给大家 框架名称是networkcomms 作者开发了5年多,目前已经停止开发,对于中小型的应用场景,够 ...

  2. MTK android 工程中如何修改照片详细信息中机型名

    每一个项目的机型名都不相同,因此拍出来的照片需要更改详细信息中的机型名. 那么,具体在哪里修改照片详细信息机型名呢 路径信息:/ALPS.JB3.TDD.MP.V2_TD_xxx/mediatek/c ...

  3. Android RotateAnimation详解

    RotateAnimation旋转坐标系为以旋转点为坐标系(0,0)点.x轴为0度,顺时针方向旋转一定的角度.1.RotateAnimation(fromDegrees, toDegrees) [默认 ...

  4. Java系列,《Java核心技术 卷1》,chapter 13,集合

    13.1.2 Java类库中的集合接口和迭代器接口     删除元素,对于next和remove的调用是互相依赖的,如果调用remove之前没有调用next,则会跑出IllegalStateExcep ...

  5. [MetaHook] Load TGA texture to OpenGL

    This function load a *.tga texture file and convert to OpenGL pixel format, uncompress only. #pragma ...

  6. 动画:UIKitAnimation 简单动画学习 iOS (一) 渐变 、 移动 、翻页、来回翻转 ——转载

    转载请说明(谢谢) http://blog.csdn.net/a21064346/article/details/7851695 点击打开链接 以下 一个系列的 动画效果 在 UIView.h文件中可 ...

  7. 20145222黄亚奇《Java程序设计》第2周学习总结

    教材学习内容总结 类型: 整数:short(占2字节).int(4).long(8). 浮点数:float(4).double(8) 字符:char(2) 布尔:boolean类型表示true与fal ...

  8. JavaScript中的各种小坑汇总

    1.Number()将部分非数字类型转换为0 强制转换为数值类型函数: parseFloat.parseInt 优点:对非数值类型统一返回NaN 缺点:会将一部分符合数值类型的字符串也识别为数值 pa ...

  9. 一个HTML5老兵坦言:我们真的需要“小程序”么?

    在PC时代,浏览器成为互联网信息的入口,并非因为它支持了HTML技术,而是因为它给人类带来了“世界是平的”的空间和理念,人类历史上第一次实现了信息的互联互通. 今天,微信虽然用了HTML5技术来做应用 ...

  10. Deep Learning 论文解读——Session-based Recommendations with Recurrent Neural Networks

    博客地址:http://www.cnblogs.com/daniel-D/p/5602254.html 新浪微博:http://weibo.com/u/2786597434 欢迎多多交流~ Main ...