artDialog是一个轻巧且高度兼容的javascript对话框组件,可让你的网页交互拥有桌面软件般的用户体验。

演示地址:artDialog猛击前往

项目主页:http://code.google.com/p/artdialog/

artDialog2采用全新的UI

功能: 支持锁定屏幕(遮罩)、模拟alert和confirm、多窗口弹出、静止定位、支持Ese键关闭对话框、定时关闭、自定义位置、拖动、鼠标调节窗口大小、换肤……

优点

  1. 兼容主流浏览器: 支持IE6和IE6+, Firefox, chrome, Opera, Safari
  2. 自适应内容: 无需预设高宽, 对话框自适应消息内容的大小 (包括按钮),并且支持消息框大小拖动调节
  3. 智能消息对齐: 如果设置了对话框宽度,文本会自动居中或者居左对齐
  4. 容错: 如果定义的宽度高度小于内容大小不会出现错位,
  5. 智能定位: 使用自定义坐标的时候智能修正位置,确保其在可视范围 (适用于弹出菜单)
  6. 拖动流畅: 不会粘住鼠标也不会拖出浏览器视口导致无法控制
  7. 轻巧: js压缩后不到8KB (在js内嵌了核心兼容布局CSS的情况下)
  8. 制订皮肤: 九宫格布局, 钩子完善,制作皮肤相当简易, 内置IE6 png 32透明和定位解决方案。
  9. IE6无抖动静止定位: 在IE6下可实现与现代浏览器一样完美静止定位效果
  10. IE6遮盖下拉控件支持: 支持 IE6 下覆盖下拉控件 (注:半透明皮肤不支持)


artDialog 兼容布局设计思路

还是大学的时候就对对弹出层和lightBox特效的着迷,记得那个时候下载过百度贴吧的弹出层类,支持遮罩与对话框半透明投影。打开分析看到里面布满了CSS教科书上传说、且邪恶的table,于是乎我第一反应就是把里面的结构改了,改成DIV+CSS的,最后压缩成17KB大小,弄完后自然很得意。后来我发现我修改后的对话框经常出现错位等问题,而原作却不会出现。由于当时对XTHML理解不是很透彻,后来也就把这个事儿给忘记了。

现在由于项目需要,我得做交互相关的工作,但是一直没有找到自己满意的对话框类。网上那些对话框功能强大的就设计过度,或者要依赖于第三方框架,总之以我现在的水平是无法完全读懂其代码的,只知道其JS布满了解决浏览器兼容的条件判断,我甚至无法为它制作一个满意的风格。

后来我就自己写了这个对话框组件,在这里我把自己的设计思路说明下:

由于XHML结构是写在js里面的,XHTML完全是用于样式表现,所以我们没有必要听从WEB标准老师的教诲,尽量选择适合表现的XHTML标签。显然table(表格)的特性用于此是再好不过了:超强容错能力、高度宽度自适应内容、带有布局,浏览器对其理解得很透彻(尤其是IE)。这也说明了开头我说的百度的对话框不会错位的特性。

下面就是artDialog的XHTML结构图:

对话框从div.ui_dialog_wrap开始,里面分别套用了两个table,最外层的table是九宫格布局,用来支持圆角皮肤的,里面的table.ui_dialog_main是装载消息内容的(包括标题、内容、按钮),其中js设置的高度与宽度就应用在table.ui_dialog_main里面的一个td(单元格)上面,这样外层的table就会随着table.ui_dialog_main变化而自动伸展。由于表格的特性,内容如果超出td的高度宽度,td会自动调整大小的,所以不用担消息内容被截取了。

artDialog支持多窗口弹出,每一个div.ui_dialog_wrap里面都带有一个用于遮罩的div.ui_overlay,而实际的遮罩层却是里面的div,我们可以在css里面设置div的颜色与透明度,外层的div.ui_overlay用于js执行透明渐变。div.ui_overlay弹出的时候高度与高度都设置为100%并且使用绝对定位,div.ui_dialog_wrap则使用了静止定位‘position: fixed’,也就是说遮罩只覆盖浏览器视口,没有像网上同类的对话框组件覆盖了整个页面(有人说页面过高会导致ie8透明滤镜失效)。IE6不支持’position: fixed’属性,下面给出CSS解决方案:

width: 100%; height: 100%; position: absolute; left: expression(documentElement.scrollLeft + documentElement.clientWidth – this.offsetWidth); top: expression(documentElement.scrollTop + documentElement.clientHeight – this.offsetHeight);

可以看到CSS应用了微软专属的HTA技术,div.ui_dialog_wrap 在IE6应用的是绝对定位,left与top由HTA动态改变。虽然网上很多文章说HTA不要使用,会严重消耗性能,但是我认为这个说法并不是绝对的,我在在IE6测试artDialog静止定位拖动滚动条消耗的性能几乎为零(但是在其他HTA应用确实比较消耗资源),况且静止定位只是一个表现形式而已,不是很重要。无论是css嵌入js与原生的js改变top与left同样会让div.ui_dialog_wrap抖动,因为每一次改变ie6都重新渲染一次,但是ie6却有一个有意思的特性,如果在body或者html设置一个静止定位的背景,div.ui_dialog_wrap就不会闪动了,完全模拟‘position: fixed’!考虑html标签很少用来做背景,我们可以这样写:

background:url(*) fixed

如果父元素拥有了定位属性,那子元素的top与left绝对定位也就相对于父元素,所以ie6 此时div.ui_dialog_wrap下的对话框——div.ui_dialog也就静止了。

IE6还有一个臭名昭著的bug:你如论设置多大的z-index都没有办法把select(下拉控件)无法遮盖,网上资料显示其权限比较高,同时也提到了iframe(嵌入式窗口)比select更高(iframe可以遮盖),只要在层下面放一个与其同等大小的z-index=-1的iframe就可以覆盖select了,所以我在div.ui_dialog放了一个巨大的的iframe,并且给div.ui_dialog设置了’overflow:hidden’,省得js又为了这一点点小事情去搞实地测量。当然我最后这个功能因为应用ie6的透明皮肤而妥协了(默认皮肤的css就隐藏了这个iframe),ie6应用了Png透明修复后下面却由这个iframe挡着,所谓鱼和熊掌不可兼得,要美丽就得付出代价,否则你就老实的针对IE6制作png 8位或者gif全透明的皮肤把。

好了,最重要的东西已经解说完毕,更细致的技巧可以查看js和_doc目录中的css文档。如果有更好的兼容方案欢迎提出。如果发现问题或者建议请给我发电子邮件。如果你对代码进行了优化,那也请您不吝给我一份吧,让它变得更好。

下载:http://code.google.com/p/artdialog/downloads/list

artDialog本身并不能获取内容,鉴于近日收到很多兄弟的留言询问此,不太熟悉js的朋友可以下载蓝色理想论坛讨论贴的附件看看
http://bbs.blueidea.com/viewthread.php?tid=2980170&page=1&extra=page%3D1

相关日志