利用jQuery UI为CMS网站实现拖拽布局效果,秒杀table布局

1 实现效果

对于使用过CMS系统制作网站的人应该都清楚,制作网站过程有一个重要的步骤就是制作页面布局。目前,实现页面布局有两种方式:table与div。这两种方式各有其优劣之处。

Table:

优势:使用简单,使用表格进行布局顺理成章,概念和效果图理解起来很简单,制作也方便。

劣势:表格布局比较固定,布局效果控制的比较死,一些较为特殊的效果、层叠效果等比较难以实现。

Div:

优势:布局效果灵活,div能轻易的控制布局位置,浮动效果等。

劣势:操作较为复杂,需要前端布局设计人员对div的特性、层叠样式等都较为熟悉。

可以看出,其实table和div这两种布局方式是互为优劣的。但是目前来说div越来越成为一种主流设计方式,其布局效果灵活、样式新颖的特点也越来越受到青睐。而且这里我们所讲的,如果你想使用拖拽的方式轻松实现页面布局,那非div不可。如图:

如下图,可以将布局div拖入布局区,使用鼠标拖拽随意移动其位置,同时可以将其选中,使用键盘进行各个方向的位置移动,还可以delete键将其删除。另外,还可以使用鼠标拖拽其右下角改变div的大小。

双击某个div后,会弹出属性对话框。可以输入div的宽度,高度,还可以在文本区中加入div中的内容。

2 实用工具

整个工具使用jQueryUI来制作。制作过程用到了jQueryUI的包含的以下成员:

1) Accordion

用于实现左侧枫叶菜单,div来源基于此处。

2) Draggable

拖拽项即使用Draggable来实现。

3) Droppable

Droppable用来实现布局释放区。

4) Resizable

Resizable用来实现对div大小的拖拽设置效果。

5) Dialog

Dialog用来制作双击div时弹出的属性对话框。

3 实现过程

3.1 增加左侧折叠导航

增加左侧折叠导航,用到了jQueryUI中的Accordion,效果如图:

代码:

        //增加折叠效果
	$("#catalog").accordion( {
		heightStyle : "fill"
	});
	//使<li>标签中的元素可拖拽
	$("#catalog li").draggable( {
		appendTo : "body",//用来指定控件在拖拽过程中ui.helper的容器, 默认情况下, ui.helper使用和初始定义的draggable相同的容器, 也就是其父元素.默认值  "parent"
		helper : "clone" //拖拽元素时的显示方式。(如果是函数,必须返回值是一个DOM元素)可选值:"original", "clone", Function默认值  "original"
	});

3.2 设置布局画布

列表项已经可以拖拽了,现在还需要有地方可以接收这些元素。我们要实现的效果是,从左侧列表拖出,放入右面的布局画布区域,因此要将布局画布区域设置为接收区,jQueryUI提供了Droppable来实现这个效果:

var bordNum = 0;

	$("#pageAreaWrapper div")
			.droppable(
					{
						activeClass : "ui-state-default",
						hoverClass : "ui-state-hover",
						accept : ".item",
						drop : function(event, ui) {
							//$(this).find(".placeholder").remove();
						var divContent = "";

						//生成布局界面的div
						var ss = $("<div id=\"border_"
								+ ++bordNum
								+ "\" class=\"item-accepted componentWrapper\" style=\"position: absolute; z-index: 101;\">"
									+ "<div class=\"shield\" style=\"position:absolute\">"
									+ "</div>"
									+ "<div class=\"wrapperBorder\" style=\"background-color: transparent; border: 0px solid transparent; opacity: 1;\">"
										+ "<div class=\"wrapperPadding\">"
											+ "<div class=\"wrapperContent\" style=\"width: 320px; height:240px; word-break:break-all\">"
											+ divContent
											+ "</div>"
										+ "</div>"
									+ "</div>"
								+ "</div>");

						//ss.text(ui.draggable.text()).appendTo(this);
						ss.appendTo(this);

						//获取拖入位置
						var px = ui.position.left;
						var py = ui.position.top;

						//获取布局画布pageArea的在整个页面的绝对偏移量
						var pageArea_px = $("#pageArea")[0].offsetLeft;
						//此处加上73是因为外层的table的top位置为73
						var pageArea_py = $("#pageArea")[0].offsetTop + 73;

						//alert("cart2_px=" + cart2_px + ", cart2_py=" + cart2_py);

						//获取滚动条滚动距离
						var scrollpx = $("#bodyOfPage").scrollLeft();
						var scrollpy = $("#bodyOfPage").scrollTop();

						//刚拖入时的位置,要考虑到滚动条的因素
						setPosition(ss, px - pageArea_px + scrollpx, py - pageArea_py + scrollpy);

						ss.draggable( {
							containment : "#pageAreaWrapper",
							scroll : false,
							stop : function(event, ui) {

							}
						});

						//双击div,编辑div内部内容
						ss.dblclick(function() {

										var dialog;

										dialog = $( "#dialog-form" ).dialog({
											autoOpen: false,
											height: 400,
											width: 450,
											modal: true,
											buttons: {
											OK: function() {
													var valid = true;

													if ( valid ) {
														var content = dialog.find("#content");
														var divWidth = dialog.find("#divWidth");
														var divHeight = dialog.find("#divHeight");
														//alert(divWidth.val() + " " + divHeight.val());

														ss.css('width', divWidth.val());
														ss.find(".wrapperContent").css('width', divWidth.val());
														ss.css('height', divHeight.val());
														ss.find(".wrapperContent").css('height', divHeight.val());

														ss.find(".wrapperContent").html(content.val());
														dialog.dialog( "close" );
													}
													return valid;
												},
											Cancel: function() {
														dialog.dialog( "close" );
													}
											},
											close: function() {
												//form[ 0 ].reset();
												//allFields.removeClass( "ui-state-error" );
											},
											open: function(event, ui) {
												//dialogSource =
											}
										});

										//设置textarea的值需要用val()函数,html()函数设置不成功
										dialog.find("#content").val(ss.find(".wrapperContent").html());
										dialog.find("#divWidth").val(ss.css("width"));
										dialog.find("#divHeight").val(ss.css("height"));

										dialog.dialog( "open" );
									}
						);

						//定义点击选中事件
						$("*")
								.click(function(event, ui) {//alert(event.currentTarget.id);
										//每次点击都是先取消选中,然后再让相应元素被选中
										$(".selected").removeClass("selected");
										if (event.currentTarget
												.getAttribute("class") == "shield") {//alert(1);

											$(this).parent().find(
													".wrapperBorder").addClass(
													"selected");
											return false;
										}
									/*	else if ($(this).hasClass(
												"componentWrapper")) {//alert(2);

											$(this).find(".wrapperBorder")
													.addClass("selected");

										}*/
										//else {
										//	$(".wrapperBorder").removeClass("selected");
										//}

										//只激活第一次点击,之后停止起泡
										//return false;

									});

						//调整大小时同时将内层div大小调整
						$(".componentWrapper").resizable(
								{
									autoHide : true,
									resize : function(event, ui) {
										//alert($(this).width());
										$(this).find(".wrapperContent").css(
												"width", $(this).width());
										$(this).find(".wrapperContent").css(
												"height", $(this).height());
									}
								});

					}
					});

这里需要说明:

1. 为了使每个被拖出来的div的id都不一样,设置了一个变量“bordNum”来标识。

2. 每个被拖出来的div,也就是ss,需要再次设置为Droppable,才能使其在画布中也能够被拖动。

3. 为了可以使用鼠标选中某个div,需要为div动态增加样式,而且要注意获取对象并动态增加了样式之后就要通过“return false”来阻止事件冒泡。

4. 刚拖入时,放入位置还要考虑到滚动条的因素。

5. 通过设置div为Resizable使其可以被拖拽调整大小。

3.3 键盘动作

键盘动作主要有选中后:

向上移动一个像素;

向下移动一个像素;

向左移动一个像素;

向右移动一个像素;

删除。

代码:

$(document).ready(function() {
	divFullScreen();//页面加载时全屏
		$(window).bind('resize', function() {
			divFullScreen();//最大化,还原窗口大小时DIV尺寸跟着变化,不过最好在CSS里给这个DIV加个min-width等于html,body的最小宽度。
			});

		//定义键盘移动div位置事件
		$(document).keydown(function(event) {

			var x = $(".selected").parent().position().top;//水平方向位移
				var y = $(".selected").parent().position().left;//垂直方向位移

				switch (event.which) {
				//case 37: y = y - 10; $("border_1").css("left", y + "px"); break;
				case 37:
					if (y >= 1) {
						//alert(y);
						y = y - 1;
						//alert(y);
						$(".selected").parent().css("left", y + "px");
					} else {
						y = 0;
					}
					break;

				case 38:
					if (x > 1) {
						x = x - 1;
						$(".selected").parent().css("top", x + "px");
					} else {
						x = 0;
					}

					break;

				case 39:
					if (y < $("#pageAreaWrapper").width()
							- $(".selected").width()) {
						y = y + 1;
						$(".selected").parent().css("left", y + "px");
					} else {
						y = $("#pageAreaWrapper").width();
					}

					break;

				case 40:
					x = x + 1;
					$(".selected").parent().css("top", x + "px");
					break;

				case 46:
					$(".selected").parent().remove();
					break;

				default:
					break;
				}
				//返回false是为了停止冒泡,以便点击键盘向下键时页面不随着移动
				return false;
			});

	});

时间: 2024-10-09 06:35:38

利用jQuery UI为CMS网站实现拖拽布局效果,秒杀table布局的相关文章

利用 jQuery UI 和 Ajax 创建可定制的 Web 界面

如今,网站比以往更具可定制性,允许用户更改其空间,根据自己的喜好对其进行个性化.个性化的主页或仪表板页面(例如 iGoogle.MyYahoo! 和 MyAOL)日渐普及,大多数 Web 应用程序内甚至也整合了类似的功能.jQuery 库简化了此类复杂 JavaScript 交互的编写,随着 jQuery UI 的引入,这项功能得到了进一步的简化,该库以易于访问的 jQuery 插件的形式提供了常用用户界面类型. 本文介绍了如何利用 Ajax 和 jQuery UI 创建具有各种定制功能的高度可

jquery实现拖拽的效果

上篇讲的是原生js实现拖拽的效果,本篇是jquery实现拖拽的效果. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta charset="utf-8"/> <title> New Documen

IOS开发UI篇—手势识别器(拖拽+旋转+缩放)

IOS开发UI篇—手势识别器(拖拽+旋转+缩放) 一.拖拽 示例代码: 1 // 2 // YYViewController.m 3 // 06-拖拽事件 4 // 5 // Created by apple on 14-6-19. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYViewController.h" 10 11 @interface YYViewController ()

Android中GridView拖拽的效果

最 近看到联想,摩托罗拉等,手机launcher中有个效果,进入mainmenu后,里面的应用程序的图标可以拖来拖去,所以我也参照网上给的代码,写了 一个例子.还是很有趣的,实现的流畅度没有人家的那么好,我只是模仿这种效果,我写的这个拖拽是两个图标之间进行交换,所以,当从一行的某个位置,换到下 一行的另一列的时候,发现有好几个图标都改变位置了,因为是相邻两个交换位置,所以每经过相邻的图标的时候都改变位置.先弄个雏形,以后再更新优化. 转载请标明出处:http://blog.csdn.net/wd

ToolStrip控件左右拖拽移动效果实现

1.主窗体下部添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位.2.当ToolStrip控件中子控件超出屏幕时,拖动控件可以实现滑动效果.拖动到控件边缘距窗体边缘1/3宽度时(可设),自动回弹.拖动控件边缘在屏幕内时释放鼠标,控件自动回弹,边缘吸附窗体边缘.3.当ToolStrip控件中子控件数目较少可以在屏幕上完全显示时,拖动效果不可见.4.增加 添加.删除 按钮,点击时可增删一个ToolStripButton,方便拖动效果可见(ToolStrip控件中子控件

实现小窗口拖拽的效果

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; min-height: 36.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #d74200 } p.p4 {

2.2.4、用jwplayer实现youku可拖拽播放效果(nginx,yamdi)

Yamdi,为flv/mp4视频添加关键帧 1.解压下载的文件tar –zxvf yamdi-1.8.tar.gz 2.进入解压后的目录cd yamdi-1.8. 3.编译并安装 make && make install 4.使用该软件为视频添加关键帧信息实现拖动效果 具体使用方法如下yamdi -i input.mp4 -o out.mp4 Nginx需要加如下配置 location ~ \.flv$ { flv; } 如果要限制带宽和第一次下载量可加如下参数 limit_rate_af

IE8利用setCapture和releaseCapture解决iframe的拖拽事件

最近有个需求须要实现左右拖拽功能,页面右边是个iframe页面,在chrome测试通过之后,发现在ie8上面效果不是很理想,最后查找资料得知可以使用ie自带的setCapture和releaseCapture来解决. sideDragBar.on('mousedown.sideMenu', function(e){ this.setCapture && this.setCapture();// ie下可以使用setCapture来解决object拖拽问题 startDragging(e);

103 extend 插件入口 jquery eq 和get的封装 拖拽插件

//demo.js window.onload = function () { //个人中心 $().getClass("member").hover(function(){ $(this).css("background","url(images/arrow2.png) no-repeat 55px center"); $().getClass("member_ul").show(); },function(){ $().g