需求:公司在给学校做项目,有一个页面要展示一些考号,座号之类的东西,因为要经常修改,所以在后台要做一个能够自定义的页面,效果如下


创建的组件分为两种:文本组件(自定义要显示的文本,如标题等),数据组件(如座位号等,只能修改宽高等,内容不可直接编辑)。

首先说明编辑功能的基本实现


1:布局



在每个创建出的组件中,绿色的div(.container)是最外层的div,蓝色的span是用来编辑文本的,上面的工具条也在container中,使其向上偏移显示在外面。顶部的红色长条div(.move)是隐藏起来的,将拖动事件添加到它上面。右下角有一个正方形的div(.zoom),将缩放事件添加到它上面。


2:编辑功能

一般编辑文本使用的是input,但这里用input显然不行,给上图中蓝色的span(也可以是div)添加上contenteditable="true"属性,就可以对其内容进行编辑了。


3:拖动

由于所有的dom都在container中,所以拖动时只需要改变container的位置即可。


$container.find('.move').on('mousedown', function(e) {

var $element = $(this).parent();
disX = e.pageX - $element.offset().left;
disY = e.pageY - $element.offset().top;
$(document).on('mousemove', function(e) {
var x = e.pageX - disX;
var y = e.pageY - disY;

$element.css('left', x);
$element.css('top', y);
//限制拖动范围
if(x<=0){
$element.css('left', 0);
}
if(y<=35){
$element.css('top', 35);
}
//组件靠近顶部时,工具条显示在下方
if(y<=70){
$element.find('.editBox').removeClass('editBoxTop').addClass('editBoxBot');
}else{
$element.find('.editBox').removeClass('editBoxBot').addClass('editBoxTop');
}

return false; //防止鼠标移动时选中文字
})

$(document).on('mouseup', function() {
$(this).off('mousemove');
})
})


在基本的拖动上加上范围限制,防止组件被拖出页面,同时在组件靠近顶部时,让工具条显示在下方。


4:缩放

$container.find('.zoom').on('mousedown', function(e) {		
cancelBubble(e);
var $element = $(this).parent();
$(document).on('mousemove', function(e) {
var x = e.pageX - $element.offset().left; //pagex和offset获取的都是相对document左上角的位置
var y = e.pageY - $element.offset().top;
$element.css('width', x);
$element.css('height', y);
return false; //防止鼠标移动时选中文字
})

$(document).on('mouseup', function() {
$(this).off('mousemove');
})
})


这段实现的是缩放的基本功能,后面还要限制他的最小宽高。cancelBubble是取消冒泡的函数

//取消冒泡函数
function cancelBubble(e) {
document.all ? (e.cancelBubble = true) : (e.stopPropagation());
}

5:工具条

工具条里的功能基本就是对文本进行操作的,在相应的按钮上添加上功能就行了,这里的颜色选择器我使用的一个叫jscolor的插件,在博客里也有些。


6:源码

额,其他地方都是一些DOM和样式的操作,就不在这里一一列举了,放出源码吧,里面有注释(有点乱抱歉= =!),有兴趣的可以看看,有问题可以留言。


CSDN:http://download.csdn.net/download/huangxin112/10175982

CSDN上传时积分最低只能选2分,不能免费,在百度云又传了一份

https://pan.baidu.com/s/1c1Fxa5i





更多相关文章

  1. 利用js、jQuery和css实现环形进度条组件封装
  2. tomahawk JSF组件扩展组件(一)
  3. 采用HTML5的开源组件绘制复杂图形
  4. 通过html5 touch事件封装手势识别组件
  5. qmlcanvas,类Html5 canvas的组件
  6. html高德地图ip定位之后拖动自定义定位地址
  7. 使用Javascript / jQuery的/ CSS。如何在目标div之外维护拖动事
  8. react系列(一)JSX语法、组件概念、生命周期介绍
  9. 如何从Vue.js中的变量名加载组件?

随机推荐

  1. android的UriMatcher类
  2. android中获取网络图片
  3. Layout布局
  4. android ImageButton 左中右分段排列
  5. Android(安卓)xUtils框架(一) DbUtils
  6. Android 配置环境
  7. 根据百度地图API得到坐标和地址并在地图
  8. android 4.2 修改默锁屏为无
  9. android实现猜扑克牌小游戏(改进:每次只可
  10. Android trouble shooting 整理