PHP+jQuery实现随意拖动层并即时保存拖动位置


Posted in Javascript onApril 30, 2015

想拖动页面上的层,完全可以用jQuery ui的Draggable方法来实现,那如何将拖动后层的位置保存下来呢?本文将给出答案。本文讲解了如何采用PHP+MySQL+jQuery,实现随意拖动层并即时保存拖动位置。

PHP+jQuery实现随意拖动层并即时保存拖动位置

之前我有文章:,文中以项目为示例,讲解了实现拖动布局的方法。本文与之不同之处在于可以任意拖动页面位置,原理就是通过拖动将拖动后层的相对位置left,top和z-index三个参数更新到数据表中对应的记录,页面通过CSS解析每个层不同的位置。请看具体实现步骤。

准备MySQL数据表

首先需要准备一张表notes,用来记录层的内容,背景色和坐标等信息。

CREATE TABLE IF NOT EXISTS `notes` ( 
 `id` int(11) NOT NULL auto_increment, 
 `content` varchar(200) NOT NULL, 
 `color` enum('yellow','blue','green') NOT NULL default 'yellow', 
 `xyz` varchar(100) default NULL, 
 PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

然后向表中插入几条记录,注意xyz字段表示的是层的xyz坐标的组合,格式为"x|y|z"。

drag.php

在drag.php中,需要读取notes表中的记录,显示在drag.php页面中,代码如下:

include_once('connect.php'); //链接数据库 
$notes = '';  
$left='';  
$top='';  
$zindex='';  
$query = mysql_query("select * from notes order by id desc"); 
while($row=mysql_fetch_array($query)){ 
  list($left,$top,$zindex) = explode('|',$row['xyz']); 
  $notes.= ' 
  <div class="note '.$row['color'].'" style="left:'.$left.'px;top:'.$top.'px;z-index:' 
.$zindex.'"> 
    <span class="data">'.$row['id'].'.</span>'.htmlspecialchars($row['content']).' 
  </div>'; 
}

然后将读取出来的$notes现在在div中。

<div class="demo"> 
  <?php echo $notes;?> 
</div>

注意,我在生成的每个DIV.note中定义了位置,即设置该div的left,top和z-index值。

CSS

.demo{position:relative; height:500px; margin:20px; border:1px dotted #d3d3d3} 
.note{width:150px; height:150px; position:absolute; margin-top:150px; padding:10px; 
 overflow:hidden; cursor:move; font-size:16px; line-height:22px;} 
.note span{margin:2px} 
 
.yellow{background-color:#FDFB8C;border:1px solid #DEDC65;} 
.blue{background-color:#A6E3FC;border:1px solid #75C5E7;} 
.green{background-color:#A5F88B;border:1px solid #98E775;}

有了样式之后,然后运行drag.php,这时就可以看到页面中排列的的几个层,但是还不能拖动,因为还要加入jQuery。

jQuery

首先需要载入jquery库和jquery-ui插件以及global.js。

<script type="text/javascript" src="js/jquery.js"></script> 
<script type="text/javascript" src="js/jquery-ui.min.js"></script>

然后再global.js加入代码:

$(function(){ 
  var tmp; 
   
  $('.note').each(function(){ 
    tmp = $(this).css('z-index'); 
    if(tmp>zIndex) zIndex = tmp; 
  }) 
  make_draggable($('.note')); 
}); 
var zIndex = 0;

global.js中,首先在$(function()里定义了一个变量tmp,通过判断每个div.note的z-index值,保证拖动时,该DIV在最上层(即z-index为最大值),就是不会被别的层覆盖。
并且设置zIndex的初始值为0。
接下来,写了一个函数make_draggable();该函数调用jquery ui插件的Draggable方法,处理拖动范围,透明度及拖动停止后执行的更新操作。

function make_draggable(elements){ 
  elements.draggable({ 
    opacity: 0.8, 
    containment:'parent', 
    start:function(e,ui){ ui.helper.css('z-index',++zIndex); }, 
    stop:function(e,ui){ 
      $.get('update_position.php',{ 
         x   : ui.position.left, 
         y   : ui.position.top, 
         z   : zIndex, 
         id  : parseInt(ui.helper.find('span.data').html()) 
      }); 
    } 
  }); 
}

当拖动时,将当前层的z-index属性设置为最大值,即保证当前层在最上面,不被其他层覆盖,并且设置了拖动范围和透明度,当停止拖动时,向后台update_position.php发送一个ajax请求,传递的参数有x,y,z和id的值。接下来我们来看update_position.php的处理。
update_position.php保存拖动位置
update_position.php需要做的是,获取前台通过ajax请求发来的数据,更新数据表中相应的字段内容。

include_once('connect.php'); 
if(!is_numeric($_GET['id']) || !is_numeric($_GET['x']) || !is_numeric($_GET['y']) || 
!is_numeric($_GET['z'])) 
die("0"); 
 
$id = intval($_GET['id']); 
$x = intval($_GET['x']); 
$y = intval($_GET['y']); 
$z = intval($_GET['z']); 
 
mysql_query("UPDATE notes SET xyz='".$x."|".$y."|".$z."' WHERE id=".$id); 
 
echo "1";

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
JS 中document.URL 和 windows.location.href 的区别
Nov 11 Javascript
ExtJs之带图片的下拉列表框插件
Mar 04 Javascript
textarea中的手动换行处理的jquery代码
Feb 26 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
Mar 10 Javascript
使用jQuery jqPlot插件绘制柱状图
Dec 18 Javascript
jquery实现左右无缝轮播图
Jul 31 Javascript
jQuery实现图片轮播效果代码
Sep 27 Javascript
JS实现电商放大镜效果
Aug 24 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
Aug 08 jQuery
在移动端使用vue-router和keep-alive的方法示例
Dec 02 Javascript
js数组去重的方法总结
Jan 18 Javascript
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
jquery实现键盘左右翻页特效
Apr 30 #Javascript
jquery Validation表单验证使用详解
Sep 12 #Javascript
jQuery实现企业网站横幅焦点图切换功能实例
Apr 30 #Javascript
JS实现动态移动层及拖动浮层关闭的方法
Apr 30 #Javascript
javascript实时获取鼠标坐标值并显示的方法
Apr 30 #Javascript
javascript实现鼠标拖动改变层大小的方法
Apr 30 #Javascript
jQuery实现伸展与合拢panel的方法
Apr 30 #Javascript
You might like
收集的二十一个实用便利的PHP函数代码
2010/04/22 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
jQuery幻灯片带缩略图轮播效果代码分享
2015/08/17 Javascript
jquery validate demo 基础
2015/10/29 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
python如何实现excel数据添加到mongodb
2015/07/30 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
Python装饰器入门学习教程(九步学习)
2016/01/28 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
python数据归一化及三种方法详解
2019/08/06 Python
pytest中文文档之编写断言
2019/09/12 Python
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
优秀应届毕业生推荐信
2014/02/18 职场文书
技校毕业生自荐书
2014/05/23 职场文书
世界读书日的活动方案
2014/08/20 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
婚庆答谢词
2015/01/04 职场文书
员工手册编写范本
2015/05/14 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
小学英语课教学反思
2016/02/15 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js
django 认证类配置实现
2021/11/11 Python
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技