转眼似乎半个多月过去了,最近忙了点其他的事,所以这个CMS做的进度也慢了,不过昨天和今天稍微加了点班,把最大的一块制作OK了,也就是下面我要说的——

窗口

  先看下窗口大致构成图吧:

  窗口很简单,顶部的标题区域、中间的展示区域和底部的功能区域。首先,窗口肯定是通过图标点击后才生成的,也就是窗口不是事先加载并隐藏好,是点击某个图标后再通过jquery写入到页面里来,那我们要做的就是给图标绑定一个创建窗口的事件,我们看下代码:

//创建窗体
Core.create = function(obj){var sc = obj.attr('shortcut');var window_warp = 'window_'+shortcut[sc][0]+'_warp';var window_inner = 'window_'+shortcut[sc][0]+'_inner';var resizeTemp = '<div resize="{resize_type}" style="position:absolute;overflow:hidden;background:url(img/transparent.gif) repeat;display:block;{css}"></div>';_cache.resize = { "t":"left:0;top:-3px;width:100%;height:5px;z-index:1;cursor:n-resize","r":"right:-3px;top:0;width:5px;height:100%;z-index:1;cursor:e-resize","b":"left:0;bottom:-3px;width:100%;height:5px;z-index:1;cursor:s-resize","l":"left:-3px;top:0;width:5px;height:100%;z-index:1;cursor:w-resize","rt":"right:-3px;top:-3px;width:10px;height:10px;z-index:2;cursor:ne-resize","rb":"right:-3px;bottom:-3px;width:10px;height:10px;z-index:2;cursor:se-resize","lt":"left:-3px;top:-3px;width:10px;height:10px;z-index:2;cursor:nw-resize","lb":"left:-3px;bottom:-3px;width:10px;height:10px;z-index:2;cursor:sw-resize"};$('#desk').append('<div id="'+window_warp+'" window="'+shortcut[sc][0]+'" class="window-container window-current" style="width:'+shortcut[sc][4]+'px;height:'+shortcut[sc][5]+'px;top:'+shortcut[sc][6]+'px;left:'+shortcut[sc][7]+'px;z-index:'+Core.config.createIndexid+'"><div id="'+window_inner+'" style="height:100%"></div></div>');$("#"+window_warp).data("info",{width:shortcut[sc][4],height:shortcut[sc][5],top:shortcut[sc][6],left:shortcut[sc][7]});Core.config.createIndexid += 1;$('#'+window_inner).append('<div class="title-bar">'+shortcut[sc][1]+'<div class="title-handle"><a class="ha-hide" btn="hide" href="#ha-hide">最小化</a><a class="ha-max" btn="max" href="#ha-max">最大化</a><a class="ha-revert" btn="revert" href="#ha-revert" style="display:none">还原</a><a class="ha-close" btn="close" href="#ha-close">关闭</a></div></div>');$('#'+window_inner).append('<div class="window-frame"><div style="z-index:9000000;background:none;height:100%;position:absolute;width:100%;filter:alpha(opacity=0);-moz-opacity:0;opacity:0;display:none"></div><iframe frameborder="0" id="frame'+shortcut[sc][0]+'" src="'+shortcut[sc][3]+'"></iframe></div>');$('#'+window_inner).append('<div class="set-bar"><div class="fr"><a id="refresh" class="btn"><i class="icon ico-refresh"></i><span class="btn-con">刷新</span></a></div></div>');for(var k in _cache.resize){var ele = FormatModel(resizeTemp,{resize_type:k, css:_cache.resize[k]});$('#'+window_inner).append(ele);}//绑定窗口移动事件Core.bindWindowMove($('#'+window_warp));//绑定窗口缩放事件Core.bindWindowResize($('#'+window_warp));//绑定窗口功能按钮事件Core.handle($('#'+window_warp));
};

  我们先从这里看起,因为之前的定义:

 $('#desk').append('<div id="'+window_warp+'" window="'+shortcut[sc][0]+'" class="window-container window-current" style="width:'+shortcut[sc][4]+'px;height:'+shortcut[sc][5]+'px;top:'+shortcut[sc][6]+'px;left:'+shortcut[sc][7]+'px;z-index:'+Core.config.createIndexid+'"><div id="'+window_inner+'" style="height:100%"></div></div>'); (1)$("#"+window_warp).data("info",{width:shortcut[sc][4],height:shortcut[sc][5],top:shortcut[sc][6],left:shortcut[sc][7]}); (2)Core.config.createIndexid += 1; (3)$('#'+window_inner).append('<div class="title-bar">'+shortcut[sc][1]+'<div class="title-handle"><a class="ha-hide" btn="hide" href="#ha-hide">最小化</a><a class="ha-max" btn="max" href="#ha-max">最大化</a><a class="ha-revert" btn="revert" href="#ha-revert" style="display:none">还原</a><a class="ha-close" btn="close" href="#ha-close">关闭</a></div></div>'); (4)$('#'+window_inner).append('<div class="window-frame"><div style="z-index:9000000;background:none;height:100%;position:absolute;width:100%;filter:alpha(opacity=0);-moz-opacity:0;opacity:0;display:none"></div><iframe frameborder="0" id="frame'+shortcut[sc][0]+'" src="'+shortcut[sc][3]+'"></iframe></div>'); (5)$('#'+window_inner).append('<div class="set-bar"><div class="fr"><a id="refresh" class="btn"><i class="icon ico-refresh"></i><span class="btn-con">刷新</span></a></div></div>'); (6)

  (1)这里我先给#desk增加了一个div,这个div也就是整个窗体的div,并且这个窗体的是为使用状态,因为新建的窗口肯定为使用状态的,不会覆盖在其他窗口下面,所以在样式里我写了z-index,并且这个值不是固定死的,(3)我在添完后马上对这个全局变量z-index进行了加1,这样就可以保证之后新建的窗体能出现在最上面。

  (2)在添加完窗体后我马上对这个窗体绑定了它的数据,分别是width、height、top、left,这个之后会说有什么用,先跳过。

  (4)然后我加入窗体必备的4个按钮,最小化、最大化、还原、关闭,当然其中还原按钮是隐藏着的。

  (5)然后我加载的iframe,用于显示需要加载的页面

  (6)最后我加入了底部功能栏

  然后看下这段代码:

 for(var k in _cache.resize){var ele = FormatModel(resizeTemp,{resize_type:k, css:_cache.resize[k]});$('#'+window_inner).append(ele);}

  上面我定义了一个数组(_cache.resize),这里在对它进行循环,在循环体内我用了一个FormatModel(),这个方法我在上篇文章里提到过,就不再介绍用法了:《自己写的一个分享按钮的插件(可扩展,内附开发制作流程)》

  这个数组长度为8,也就是这个循环一共添加了8个div,那么这8个div到底是什么东西呢,看下这张图就明白了:

  对了,就是8个方向,相信有童鞋应该知道是干嘛用的了,就是之后窗体缩放需要用到了,我会对这8个div分别绑定事件,让他们实现对窗体大小的缩放功能。

  至此,窗体添加的功能大致完毕,但还需要完善,比如同个图标的窗体已经创建过,就不需要继续创建了,而只需把窗体的样式改变下,比如修改成使用状态,并且把z-index的值修改最高。具体代码我就不贴出来了,留给大家去分析吧。

任务栏

  创建窗体的同时,也需要创建任务栏,代码很简单,稍微看下吧:

   $('.task-window li b').removeClass('focus');$('.task-window').append('<li window="'+shortcut[sc][0]+'"><b class="focus"><img src="'+shortcut[sc][2]+'"><span>'+shortcut[sc][1]+'</span></b></li>');

  原理就是在添加前,把任务栏里现有的任务选中样式清除,然后添加新的任务。

切换窗口

  切换窗口就是当我同时打开2个以上窗口时,直接在窗口上,或者任务栏里切换窗口的事件,功能比较简单,先看下代码,然后我再稍微把思路说下。

//任务栏
Core.taskwindow = function(obj){var window_warp = 'window_'+obj.attr('window')+'_warp';var window_inner = 'window_'+obj.attr('window')+'_inner';//改变任务栏样式$('.task-window li b').removeClass('focus');obj.children('b').addClass('focus');//改变窗口样式$('.window-container').removeClass('window-current');$('#'+window_warp).addClass('window-current').css({'z-index':Core.config.createIndexid}).show();//改变窗口遮罩层样式$('.window-frame').children('div').show();$('#'+window_inner+' .window-frame').children('div').hide();Core.config.createIndexid += 1;
};//窗口
Core.container = function(obj){//改变任务栏样式$('.task-window li b').removeClass('focus');$('.task-window li[window="'+obj.attr('window')+'"] b').addClass('focus');//改变窗口样式$('.window-container').removeClass('window-current');obj.addClass('window-current').css({'z-index':Core.config.createIndexid});//改变窗口遮罩层样式$('.window-frame').children('div').show();obj.find('.window-frame').children('div').hide();Core.config.createIndexid += 1;
};

  大致思路就是,当我点击任务栏里某个任务,找到与这个任务相对应的窗口,让它显示并更新z-index,然后把自己修改成选中状态,同理点击窗口时也会触发一个类似这样的事件,可以通过两个function里的注释看到,代码执行流程几乎都是一样的。

  这里有个小技巧,还记得窗口由哪三部分构成么?顶部、中间和底部,中间是iframe。小技巧就是,当我创建窗体时,给iframe加了一个div遮罩层,宽高刚好和iframe一样,当窗体不在使用状态时,比如被别的窗口覆盖在下面,那个遮罩层就显示出来,刚好把iframe盖住,因为遮罩层是透明了,所以看上去没有差异。为什么要这么做呢,因为这样,在切换窗口时,点击事件可以不单单只写在顶部的标题区域,在点击iframe(实际点击的时遮罩层)也可以实现窗体切换功能,当然,切换后要马上把遮罩层隐掉。

  今天就说要这里吧,下次我会把窗口移动、缩放的给大家说下,之所以要单独把这个拎出来,是因为我这两天就一直再搞这个,虽然现在弄好了,但感觉还是有点问题,需要优化的地方应该还有很多,所以下次我会把我的疑问抛出来,同时也希望得到大神们的解答。

EonerCMS——做一个仿桌面系统的CMS(三)相关推荐

  1. EonerCMS——做一个仿桌面系统的CMS(二)

    上一周我说到,我要开始做一个仿桌面系统的CMS.现在,一周过去了,来做个小小的总结吧,顺便把上一周片尾留的小问题解答下. 桌面 关于界面,思前想后,还是模仿115的了,说是模仿,其实几乎是照搬.因为我 ...

  2. EonerCMS——做一个仿桌面系统的CMS(十一)

    随着jq1.7的发布,事件绑定有了统一的API:on().off(),我的EonerCMS也做了相应的更新,因为改动部分不很多,所以就一笔带过了. 因为仿os界面框架已经做的差不多了,要准备开始做实际 ...

  3. EonerCMS——做一个仿桌面系统的CMS(九)

    首先说明,上面图片和文章无关,只是我随便弄的一张配图,因为我刚才在想4个DIV能不能摆成那种造型,当然最终是以失败告终. 恢复正题,这次更新变动不大,增加了一个效果和一个方法,也发现了一个bug,但还 ...

  4. php 仿电脑桌面系统,EonerCMS——做一个仿桌面系统的CMS(十-附最新源码)

    废话不多说,继上次遗留的问题--内存泄漏. 趁周末,的接都上的和,近很触是没他电同近很触是没查了好多资料,也问了好多JS高手,大致是这么个情况.因为我每打开一个窗口,就绑定了一个永久性的dom元素,而 ...

  5. 前端的小玩意(9.5)——做一个仿360工具箱的web页面(完结篇,可以跑起来的工具箱)

    前端的小玩意(9.1)--做一个仿360工具箱的web页面(Tab按钮切换) http://blog.csdn.net/qq20004604/article/details/52216203 前端的小 ...

  6. 前端的小玩意(9.3)——做一个仿360工具箱的web页面(我的工具里的模板和样式)

    前端的小玩意(9.1)--做一个仿360工具箱的web页面(Tab按钮切换) http://blog.csdn.net/qq20004604/article/details/52216203 前端的小 ...

  7. 做一个音视频点播系统要多久?操作越简单越好

    视频作为传播渠道有其天然优势,画面更生动.音视频齐全.用户体验和观看更高,也可以更直观的表达内容.而且随着互联网基础设施的快速发展,视频已经成为现代社会主要的表达方式了,各种视频教程.课程.娱乐等等都 ...

  8. php 考试系统 倒计时,jQuery_jQuery练习——倒计时,近学生做一个在线考试系统, - phpStudy...

    jQuery练习--倒计时 近学生做一个在线考试系统,需要加入试卷倒计时功能.很显然最放方便的就是ajax实现.一下子想起上次提到的jQuery,一用果然简单.jQuery中提供了ajax的方便功能. ...

  9. 做一个商城直播系统,跟上这波双十一

    做一个商城直播系统,跟上这波双十一 又快到一年一度的双十一了.淘宝直播一姐曾在去年双十一,一个人卖出了3.3亿的销售额,创造了行业的销售神话.近两年,很多电商平台开始关注起直播互动电商,希望在直播中, ...

最新文章

  1. Struts2 的stream result用法
  2. 尝试编辑虚拟磁盘时服务器遇到错误,虚拟磁盘Linux服务端测试及故障处理有哪些呢?...
  3. LibreOJ #6002. 「网络流 24 题」最小路径覆盖
  4. Python Django 自定义Manager(重写父类方法实现自定义逻辑)
  5. stream获取filter
  6. MacBook搭建go语言开发环境
  7. 作业帮电脑版在线使用_应届生应聘作业帮的在线辅导老师
  8. 数据链路层的差错控制ARQ
  9. SetWindowLong 除去窗体标题栏
  10. 汇编语言王爽第四版第七章(实验六)
  11. PHP丢失依赖文件libssl.so libcrypto.so
  12. 月份缩写python_用法语月份缩写解析日期
  13. 如何为搭建的网站配置自己的域名 1-2
  14. STM8L051之通过ADC1与DMA读取内部参考电压,求取VDD电源电压---库函数版
  15. 【一起读源码】1. Java 中元组 Tuple
  16. C#窗体加标尺的两种方式及显现效果
  17. C语言中fprintf函数的使用介绍
  18. 16.引言篇——自定义过滤器及标签
  19. 反编译系列教程(上)
  20. IE、Safari、Chrome浏览器JavaScript兼容性改造总结

热门文章

  1. AtCoder - 2581 Meaningful Mean
  2. yyyyMMddHHmmss转变为日期格式
  3. laravel--表单验证
  4. QThread使用——关于run和movetoThread的区别
  5. jconsole jvisualvm远程监视websphere服务器JVM的配置案
  6. DevExpress学习之DevExpress.XtraGrid.Columns.GridColumn
  7. 如何实施好基于MOSS的企业搜索项目(上)
  8. C#中out 及 ref 区别
  9. 行人检测(Pedestrian Detection)资源
  10. 基于局部均方差相关信息的图像去噪及其在实时磨皮美容算法中的应用。