`
落花虽有意
  • 浏览: 185304 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

仿网易博客拖放自定义布局效果(附代码)

阅读更多

以前在用网易博客时就发现它的自定义布局功能不错,视觉上感觉也很好,虽然已经不用网易博客很多月,但一直对这个影响深刻,前几天刚看完一个不错的电视剧,心情放松,所以这两天就简单的模仿了一个,虽然是简单的模仿,不过写起来也是有点困难,至少对我自己是这样的:)

 

先对这个程序的相关东西说明下吧:

1,测试通过浏览器:IE6.0

2,里面用到了一些 jquery 的东西,不过整体上用的非常尴尬,因为对 jquery 实在不太熟悉,不过有时用的挺方便

 

下面就来大体上说说这个程序:

因为是自定义布局,所以对元素的定位,坐标等等一些东西要搞清楚,因为在 js 里面有一些看起来非常相似的属性弄的人头晕目眩,比如:event.x,event.clientX,event.offsetX 它们之间的区别。不过这些概念的讲解网上很多也很清晰,这里就不说了。下面说说这个程序的几个关键处。

 

关键处一:版式的动态切换

用过网易博客的应该知道网易博客的版式有很多种,对于“两列版式”就分为 “对称式”,“小大式”,“大小式”。而且除了“两列版式”还有“三列版式”,“三列版式”也分很多种。在我的程序中我只实现了“两列版式”,不过很容易扩展到“三列版式”,在后面扩展部分将说到。

 

其实版式的切换还是比较容易的,就是根据用户的设置然后动态改变各个控件的样式,如下:

 

.centerLeft
{
	width:450px;
	left:33px;
}

.maxLeft
{
	width:600px;
	left:33px;
}

<div id="weather" class="share" dragDiv="true">
	<div class="divHeader">天气</div>
	<div>
	今 22℃~32℃ 明 22℃~30℃ 
	</div>
</div>

 

拿“两列版式”的“对称式”的左边来说,如果有如上元素 $("#weather"),它初始位于版式的左边,则在 js 文件的初始函数里面就有如下语句:

 

$("#weather").addClass("centerLeft");

 

如果显示我们将版式设置为“大小式”,即版式左边大,右边小,则只需要将初始时的那个 centerLeft 样式换成相应的样式即可,这里就为 maxLeft,如下:

 

$("#weather").removeAttr("class");
$("#weather").addClass("share");
$("#weather").addClass("maxLeft");

 

当然在程序中不是这样一个个切换的,而是切换整个左边元素数组。其他的版式也是与此类似。

 

关键处二:拖动刚开始的半透明元素

我们在界面上拖动元素时其实拖动的不是实际本身的那个元素,而是拖动的一个在页面中一直存在的临时元素。在刚开始拖动时把实际需要拖动元素的所以属性复制给临时元素,然后设置临时元素的透明度,注册移动事件等等。当鼠标松开时再根据临时元素的当前位置判断实际需要拖动元素的新位置,并将临时元素隐藏,再改变实际需要拖动元素的位置。如在程序的 js文件里会看到这样的语句:

 

// 构造一个临时的悬浮DIV,相当于复制一个实际被拖动的对象
$("#tempDiv").html($(this).html());
$("#tempDiv").css({visibility:"visible",left:divLeft,
                                top:divTop,width:this.offsetWidth,
                                height:this.offsetHeight});
$("#tempDiv").fadeTo("fast" , 0.4 , function(){});

isMouseDown = true;
$("#tempDiv").mousemove(moveFn);

 

关键处三:拖动完时的位置判断与重新排版

当拖动到适当位置后鼠标松开时需要根据此时的位置来重新布局,将实际需要拖动的元素移动到期望的位置,其他元素则进行相应的移动设置。在程序中我是根据鼠标松开时的鼠标位置来判断新位置的。新位置有三种:第一种是放在版式任意一边的最后,而此时版式这边本身没有其他元素;第二种也是放在版式任意一边的最后,不过此时版式这边有其他元素;第三种是放在版式任意一边的其他元素中间或是最前。这三种情况是不同的情况需要进行不同的判断,如下

 

// 记录数组长度
var arrayLen = leftObjs.length;
		
// 左边数组没有元素时,即界面上左边为空的情况
if(arrayLen <= 0)
{
	moveUp();
	leftObjs[0] = activeDiv;

	divTop = getOffsetTop($("#pageHeader").get(0)) 
                              + $("#pageHeader").get(0).offsetHeight;
}
// 判断是否加在最末尾
else if(oldY >= (getOffsetTop(leftObjs[arrayLen-1]) 
                       + leftObjs[arrayLen-1].offsetHeight))
{
	index = arrayLen;
	moveUp();
                // 调用该函数可能改变当前数组的长度,故需要进行判断
	if(arrayLen > leftObjs.length)
		index--;				

	leftObjs[index] = activeDiv;
			
	// 获得拖动元素新位置的top值
	divTop = getOffsetTop(leftObjs[index-1]) 
                               + leftObjs[index-1].offsetHeight + 10;
}
// 放在其他元素中间的情况
else
{
	// 再判断其他元素,略
}

 

程序关键的地方基本上就是处理好上面这些。因为这个程序有很大局限性,所以下面来说说程序可以扩展的地方。

 

扩展处一:“多列版式”

前面也说过,这个程序是实现了“两列版式”,不过扩展为“多列版式”是件容易的事,就看实际有没有这个必要了。

在程序中,版式的每一列所包含的元素(即div)都记录在相应的数组里,对于“两列版式”需要两个数组,“多列版式”就相应需要多个数组了,然后再指定相应的样式,其他地方在增加一些判断就可以了。

 

扩展处二:选择性显示页面控件

在网易博客里用户可以根据自己需要或意愿选择在页面上最终能够显示出来的控件,而在我这个程序中并没有这样实现,如果需要实现需要对每个能够显示的控件设置一个标识符来控制它最终是否能够显示。

 

扩展处三:将“单机版”改为“网络版”

这个程序是个单独的程序,里面并没有任何一处与其他服务器进行数据的交换,这样的程序在实际中肯定是没有用的,因此将其改为“网络版”是很有必要的。如果要改为“网络版”,则最开始初始化的“版式信息”,“元素信息”等等都从服务器上获取,然后再用户改动后再将数据上传到服务器保存。程序中的初始化主要是下面两个函数:

 

// 给装载对象布局
function layoutObjs()
{
	// 得到初始布局高度
	var initTop = getOffsetTop($("#pageHeader").get(0)) 
                                     + $("#pageHeader").get(0).offsetHeight;
	var itTop = initTop;
	var i;
	
	for(i = 0 ; i < leftObjs.length ; i++)
	{
		$(leftObjs[i]).removeAttr("class");
		$(leftObjs[i]).addClass("share");
		$(leftObjs[i]).css({top:itTop});
		itTop += leftObjs[i].offsetHeight + 10;

		// 根据参数动态加载布局样式
		if(layout=="centerCenter")
		$(leftObjs[i]).addClass("centerLeft");
		else if(layout == "maxMin")
			$(leftObjs[i]).addClass("maxLeft");
		else if(layout == "minMax")
			$(leftObjs[i]).addClass("minLeft");
	}
		

	itTop = initTop;
	for(i = 0 ; i < rightObjs.length; i++)
	{
		$(rightObjs[i]).removeAttr("class");
		$(rightObjs[i]).addClass("share");
		$(rightObjs[i]).css({top:itTop});
		itTop += rightObjs[i].offsetHeight + 10;

		if(layout=="centerCenter")
		$(rightObjs[i]).addClass("centerRight");
		else if(layout == "maxMin")
		$(rightObjs[i]).addClass("minRight");
		else if(layout == "minMax")
		$(rightObjs[i]).addClass("maxRight");
	}
	
}

// 初始化装载对象
function initObjs()
{	
	leftObjs.push($("#userInfo").get(0));
	leftObjs.push($("#content").get(0));
	rightObjs.push($("#time").get(0));
	rightObjs.push($("#weather").get(0));	
	layoutObjs();
}

 

如果为“网络版”则 数组 push 时的数据全部从服务器上获取,layout 变量值也需要从服务器上获取。而拖动后的新数据则在相应的地方上传。

 

上面说了程序可以扩展的地方。下面说说这个程序的一部分不足的地方:

 

不足一:显示控件高度设置

程序中所有可显示控件的高度我都是最开始就设定了并且不能根据一些需要改变,所以无论在什么版式下显示控件的高度就没有发生变化,只有宽度在变。这个问题我想过不过没有好的方法解决。

 

不足二:没有包装成类

对于拖动元素其实可以包装成单独的类,然后把初始位置,宽度,高度以及最终位置等信息包装起来,这样操作起来比较方便,也比较清晰。不过最开始写时我没有想到。

 

不足三:jquery 用法尴尬

程序里面很多语句我开始都试着用 jquery 来写,不过经常因为理解而出现问题,最后还是改为基本的 js。而且在拖和放时我开始都用 jquery 里面的 show() ,hide() 等函数想实现动态效果,不过后来出来的效果却和我想象的完全两样,由此感觉 js 里面的函数执行不是串行的,不知道是不是这样:)

 

 

其实本身想说更多一点的,不过很多东西表达的不是太清楚。

后面有这个程序的下载文件,里面包含了 jquery 的 js 包,所以显得大了点。

 

最后希望大家能够指点一下。

  • shatter.rar (33 KB)
  • 描述: 包括四个文件,一个html文件,一个css文件,一个自己的js文件,一个jquery的js文件,下载后直接点击html看效果。注意配合页面顶端的工具条使用,不然可以没有反应哦
  • 下载次数: 1146
分享到:
评论

相关推荐

    实战ItemTouchHelper仿网易新闻客户端自定义栏目页面

    本实战项目"实战ItemTouchHelper仿网易新闻客户端自定义栏目页面"旨在通过ItemTouchHelper实现类似网易新闻客户端的栏目页面拖拽功能,使用户可以更加直观地进行内容排序和管理。下面将详细介绍这个项目中的关键技术...

    Qt高仿网易云音乐界面源码

    7. **自定义控件**:为了达到高度仿真的效果,可能会有一些自定义控件,如自定义进度条、滑动选择器等。这需要继承Qt的基础控件并重绘其画布,以实现特定的外观和行为。 8. **事件处理和动画**:Qt支持丰富的事件...

    android——仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

    自定义视图允许你覆盖默认行为,添加自定义布局和触摸事件处理。 2. **ItemTouchHelper**: Android SDK提供了一个名为`ItemTouchHelper`的工具类,它可以帮助你在RecyclerView上实现拖放和滑动删除等功能。在这个...

    仿网易印象派在线定制系统diy软件 ,DIY网站源码

    【标题】中的“仿网易印象派在线定制系统diy软件 ,DIY网站源码”指的是一个基于网络的个性化定制平台的源代码,该平台模仿了网易印象派的功能,让用户能够在线设计并定制各种产品,如T恤、杯子、台历和挂历等。...

    Android 频道管理----高仿 网易、今日头条 (可以拖动的GridView)demo

    如果应用需要适配不同尺寸的屏幕,那么使用Android的响应式布局(如ConstraintLayout)是必要的,它可以确保在各种设备上都有良好的显示效果。 10. **单元格间的碰撞检测** 在拖动过程中,需要检测拖动的频道与...

    Android-高仿网易新闻新版频道管理功能

    在Android开发领域,构建一个类似网易新闻客户端的频道管理功能是一项常见的需求,它涉及到用户界面设计、触摸事件处理以及数据管理等多个方面的技术。本项目"Android-高仿网易新闻新版频道管理功能"主要展示了如何...

    Android 高仿 频道管理----网易、今日头条(可以拖动的GridView)DEMO

    总结起来,这个DEMO涵盖了Android界面交互设计、触摸事件处理、数据存储与恢复、自定义Adapter、动画效果以及拖放排序等关键知识点。通过学习和理解这个DEMO,开发者可以掌握构建类似网易、今日头条频道管理界面的...

    winwebmail仿163界面

    - **JavaScript扩展**:添加或修改JavaScript代码,实现额外的功能或交互效果。 - **模板设计**:创建新的模板,使界面更具个性。 - **插件集成**:利用插件系统,整合其他第三方服务或工具。 总的来说,`...

    DraggableGridView:仿网易新闻,新闻栏目增加、拖动、删除等功能

    "DraggableGridView:仿网易新闻,新闻栏目增加、拖动、删除等功能"是一个项目,它旨在模仿网易新闻应用的部分特性,特别是它的栏目管理功能。这个项目是用Java语言实现的,因此我们主要会探讨Java编程在构建此类应用...

    频道管理recycleView

    最后,对于仿网易频道管理的实现,可能还需要添加长按菜单,允许用户进行更多操作,如添加新频道、批量删除等。这可以通过`RecyclerView.ItemLongClickListener`实现,当用户长按时弹出对话框或菜单。 总之,实现...

    Qt模仿网易云音乐 广告Banner

    通过拖放控件和设置属性,开发者可以快速创建GUI布局。该文件会被编译成C++代码,然后在程序中使用。 7. **.vcxproj和.vcxproj.filters**:这些是Visual Studio的项目文件,用于管理源代码、编译设置和资源。....

    水晶报表例子水晶报表例子

    “薛震的共享空间 _net制作水晶报表的最尽快方法 - taihongbo的日志 - 网易博客.htm”这篇博客可能介绍了如何高效地在.NET环境下集成水晶报表,包括安装和配置步骤,以及如何在代码中动态生成和显示报表。...

    有点类似网易新闻的栏目设置功能

    在拖放过程中,还需要实时更新`GridView`的布局,使得拖动的栏目和其他栏目能够正确显示。 除了前端的交互,后台的数据管理和同步也是这个功能的重要组成部分。如果栏目信息存储在服务器,每次添加、删除或拖动排序...

    仿163的HTMLeditor.rar

    仿163的HTMLeditor是借鉴了网易163邮箱中的富文本编辑器设计,提供了一种类似的操作体验,具有丰富的文本格式设置选项和多媒体插入功能。 在HTMLeditor中,主要包含以下几个关键知识点: 1. **HTML基础**:HTML...

    ios-YTGoodsDetailDemo.zip

    - **UITableViewCell自定义**:商品列表通常会自定义UITableViewCell,展示商品图片、名称、价格等信息,需要编写代码处理cell的重用和定制化内容加载。 2. **网络请求与数据解析** - **API接口调用**:获取商品...

    JavaScript客户端验证和页面特效制作(JavaScript)

    6. **拖放功能**:允许用户通过拖动元素来重新排列布局或上传文件。 7. **计时器与倒计时**:用于展示活动剩余时间、倒计时提醒等。 8. **动画效果**:利用CSS3和JavaScript库(如jQuery)创建平滑的过渡和动画效果...

    ItemTouchHelp-RecycleView(仿写网易新闻客户端,顶部tabs,滑动排序,增加删除 )

    相比旧版的ListView,RecyclerView提供了更好的性能和更灵活的布局管理,允许开发者自定义滑动效果和动画。 2. **ItemTouchHelper**: ItemTouchHelper是RecyclerView的一个扩展,用于实现对RecyclerView中的item...

    RecyclerView实现频道管理

    例如,可以使用ItemTouchHelper.SimpleCallback的默认动画,或者自定义动画效果。在拖动过程中,ItemTouchHelper会自动处理视图的过渡动画,使得用户体验更加流畅。 对于增加和删除标签的功能,我们可以在...

    长按之后可拖拽删除的GridView

    为了保证在不同设备和Android版本上的良好表现,开发者可能对布局和代码进行了相应的适配和兼容性测试。 10. 用户界面设计: 良好的用户界面设计是吸引用户的关键。项目可能对拖拽时的视觉反馈、删除确认提示等...

    学习过程做的实际案例

    8. 拖拽效果:实现元素的拖放功能,需要理解鼠标事件和元素位置的计算,可以使用HTML5的Drag and Drop API或者自定义JavaScript实现。 9. 仿网易云:这可能是一个音乐播放器的实现,涉及音频API的使用,如HTML5的...

Global site tag (gtag.js) - Google Analytics