extjs4 desktop 实现仿win7效果的桌面窗口预览效果

先上图:

这个预览效果是不是很炫,代码如下:

在原extjs desktop自带的demo的基础上,拓展TaskBar.js代码:

Ext.namespace("LinBsoft._PreviewBox");

LinBsoft._PreviewBox = Ext.extend(Ext.Component,
				{
				    inited: false,
				    defaultZIndex: 21000,
				    defaultLeft: 0,
				    defaultBottom: 40,
				    hideBottom: 30,
				    boxWidth: 250,
				    cloneWinMaxWidth: 220,
				    cloneWinMaxHeight: 116,
				    hideDelay: 500,
				    showDelay: 500,
				    constructor: function () {
				        LinBsoft._PreviewBox.superclass.constructor.call(this, { renderTo: document.body, cls: "lbs-previewbox", hidden: true });
				        this.inited = false;
				        this.hoverCount = 0
				    },

				    createBoxElements: function () {
				        var a = this.getEl(), b;
				        this.boxMl = a.createChild({ tag: "div", cls: "lbs-previewbox-ml" });
				        this.boxMr = this.boxMl.createChild({ tag: "div", cls: "lbs-previewbox-mr" });
				        this.boxMc = this.boxMr.createChild({ tag: "div", cls: "lbs-previewbox-mc" });
				        this.arrow = a.createChild({ tag: "div", cls: "lbs-previewbox-arrow" });
				        b = this.boxMc;
				        this.desc = b.createChild({ tag: "div", cls: "lbs-previewbox-desc" });
				        b.createChild({ tag: "hr" });
				        this.win = b.createChild({ tag: "div", cls: "lbs-previewbox-win" });
				        this.inited = true;
				        this.mon(mydsk.desktop.taskbar.getEl(), "click", this.onTaskbarClick, this);
				        this.mon(mydsk.desktop.taskbar.getEl(), "contextmenu", this.onTaskbarClick, this)
				    },
				    onTaskbarClick: function () { this.hideBox(true) },
				    showBox: function (a) {
				        this.needShowBox = true;
				        this.hoverCount += 1;
				        Ext.defer(function () { this.doShowBox(a, this.hoverCount) }, 300, this);
				    },

				    doShowBox: function (f, e) {
				        var d, h, b, a, c, g;
				        if (!f || !f.win || !f.centerX) { alert("required parameters not exist"); return }
				        if (this.hoverCount !== e) { return }
				        if (!this.needShowBox) { return }
				        if (!this.inited) { this.createBoxElements() }
				        c = Ext.isNumber(f.centerX) ? f.centerX : this.defaultLeft;
				        d = f.win;
				        h = d.getEl();
				        g = d.title || "";
				        this.desc.update(g || "");
				        if (this.clonedEl) { this.clonedEl.remove() }
				        this.clonedEl = this.getClonedEl(d);
				        this.clonedEl.show();
				        this.win.appendChild(this.clonedEl);
				        b = this.getEl();
				        if (this.isVisible()) {
				            b.setBottom(this.defaultBottom);
				            this.show();
				            b.shift({ left: c - (this.boxWidth / 2), opacity: 1, easing: ‘easeIn‘, duration: 500 })
				        } else {
				            b.setLeft(c - (this.boxWidth / 2));
				            b.setBottom(this.hideBottom);
				            b.setOpacity(0.2);
				            this.show();
				            b.shift({ bottom: this.defaultBottom, opacity: 1, easing: ‘easeIn‘, duration: 500 })
				        }
				        this.hoverCount = 0
				    },

				    hideBox: function (a) {
				        this.needShowBox = false;
				        Ext.defer((function () { if (this.needShowBox) { return } this.doHideBox(a) }), (a === true) ? 0 : 300, this)
				    },

				    doHideBox: function (b) {
				        var c;
				        var a = function () {
				            if (this.needShowBox) { return }
				            this.hide();
				        };
				        if (this.clonedEl) { this.clonedEl.remove() }
				        this.hoverCount = 0;
				        if (b === true) { a.call(this); return }
				        c = this.getEl();
				        c.shift({ bottom: this.hideBottom, opacity: 0, duration: 500, easing: ‘easeIn‘, scope: this, callback: a })
				    },

				    getClonedEl: function (e) {
				        var c = 0;
				        var h = 0;
				        var g = e.getEl();
				        var b = g.dom.cloneNode(true);
				        b.className = b.className.replace(‘x-hide-offsets‘, ‘‘);
				        b.removeAttribute("id");
				        var f = Ext.get(b);
				        f._previewMask = f.createChild({ tag: "div", cls: "lbs-previewbox-win-mask" });
				        var a = g.getSize();
				        var d = this.cloneWinMaxWidth / a.width;
				        c = (this.cloneWinMaxHeight - a.height * d) / 2;
				        if ((a.height * d) > this.cloneWinMaxHeight) { d = this.cloneWinMaxHeight / a.height; c = 0; h = (this.cloneWinMaxWidth - a.width * d) / 2 }
				        d = Math.min(d, 1);
				        f.setStyle("transform-origin", "0% 0%");
				        f.setStyle("-webkit-transform-origin", "0% 0%");
				        f.setStyle("-moz-transform-origin", "0% 0%");
				        f.setStyle("-o-transform-origin", "0% 0%");
				        f.setStyle("msTransform-origin", "0% 0%");
				        f.setStyle("-webkit-transform", String.format("scale({0})", d));
				        f.setStyle("-moz-transform", String.format("scale({0})", d));
				        f.setStyle("-o-transform", String.format("scale({0})", d));
				        f.setStyle("transform", String.format("scale({0})", d));
				        f.setStyle("msTransform", String.format("scale({0},{1})", d, d));
				        f.setLeftTop(h, c);
				        return f
				    }
				});

然后,在 Ext.define(‘Ext.ux.desktop.TaskBar‘, { 的  initComponent: function () { 里new一个对象

  LinBsoft.PreviewBox = new LinBsoft._PreviewBox();

在鼠标经过进入和移出任务栏快捷图标时显示和隐藏预览小窗:

    onMouseOverHandler: function (d) {
        var posx = 173 + d.x + (d.width / 2);
        var mx = window.event.x;
        if (Ext.isIE) { posx = mx + 173 }
        else if (Math.abs(posx - mx) > 73) { posx = mx }
        var b = { win: d.win, centerX: posx };
        LinBsoft.PreviewBox.showBox(b)
    },
    onMouseOutHandler: function (a) {
        LinBsoft.PreviewBox.hideBox()
    },

其中 b变量计算显示小窗的位置,因如ie和谷歌浏览器等的位置计算有差别,作了适应计算。

因为win7 是操作系统,可以直接操作复制屏幕显示内存,而js在浏览器中运行,不可能做这个操作,因此,这只是通过复制dom和css的缩小效果实现。

时间: 2024-10-09 15:49:04

extjs4 desktop 实现仿win7效果的桌面窗口预览效果的相关文章

Android 手势检测实战 打造支持缩放平移的图片预览效果(下)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图片,简单介绍了下Matrix:具体请参考:Android 手势检测实战 打造支持缩放平移的图片预览效果(上):本篇继续完善我们的ImageView~~ 首先加入放大后的移动~~ 1.自由的进行移动 我们在onTouchEvent里面,加上移动的代码,当然了,必须长或宽大于屏幕才可以移动~~~ @Ov

jquery实现上传图片及图片大小验证、图片预览效果代码

jquery实现上传图片及图片大小验证.图片预览效果代码 上传图片验证 */ function submit_upload_picture(){     var file = $('file_c').value;     if(!/.(gif|jpg|jpeg|png|gif|jpg|png)$/.test(file)){            alert("图片类型必须是.gif,jpeg,jpg,png中的一种")        }else{      $('both_form')

带预览效果的幻灯片

正在做一个带预览效果的幻灯片. 首先,要分析整个效果.采用VCD分析法(V;view; C: contral; D:data). 先观察整个效果图,将效果图划分为不同的块级.画出结构分析图,设置每个大块的类名. 分析要使用的数据. 进行代码开发:1, 视觉效果开发: HTML + CSS; 2, 动画效果: javascript; HTML页面编写,先架好结构,并用css样式来使页面变成要展示的样子.(以前总是看着图,事无巨细的一层层写下来,并一小块一小块的去做好样式设置,发现这样不仅浪费时间,

JS实现图片上传预览效果:方法一

<script type="text/javascript"> //处理file input加载的图片文件 $(document).ready(function(e) { //判断浏览器是否有FileReader接口 if(typeof FileReader =='undefined') { /*$("#images_show").css({'background':'none'}).html('亲,您的浏览器还不支持HTML5的FileReader接口

JavaScript 图片上传预览效果

图片上传预览是一种在图片上传之前对图片进行本地预览的技术.使用户选择图片后能立即查看图片,而不需上传服务器,提高用户体验.但随着浏览器安全性的提高,要实现图片上传预览也越来越困难.不过群众的智慧是无限的,网上已经有很多变通或先进的方法来实现.例如ie7/ie8的滤镜预览法,firefox 3的getAsDataURL方法.但在opera.safari和chrome还是没有办法实现本地预览,只能通过后台来支持预览.在研究了各种预览方法后,作为总结,写了这个程序,跟大家一起分享.上次写的简便无刷新文

实现QQ空间图片预览效果

今天项目遇到需求 要求 实现图片预览效果 .  类似于扣扣空间那种,本人也到网上找过 代码量太大了   ,类多到处是注释看的有点恶心 .然后自己写了一个图片预览的效果,其实很简单的 . 首先我们来分析一下 实现原理 :点击 图片 显示 新的窗口  滑动显示下一张  并且页码也跟随的变化, 轻触退出(本文代码没有) ;首先点击图片实现跳转时应该 携带当前图片页码 呵呵 gridview 里所有图片 地址信息 ,然后另一个显示图片页面实现可以用viewpager  事先加载好 然后 设置显示当前页

基于jQuery页面窗口拖动预览效果

今天给大家分享一款基于Query页面窗口拖动预览效果.这是一款基于jQuery+HTML5实现的模拟页面窗口显示拖动窗口预览特效.这款实例适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 在线预览   源码下载 实现的代码. html代码: <p> minimap - A jQuery Plugin<br> A preview of full webpage or its DOM element with flexible

10款超炫的开源jquery的源码预览效果

1.Flat Surface Shader – 超炫的 3D 模拟照明效果 Flat Surface Shader 是一个超炫的 3D 模拟照明效果,可以配置使用基于 Canvas 的 2D 上下文或者基于 SVG 多边形数组绘制三角形.它还采用原生的 Float32Arrays 存储数字数据,进行高度优化的计算.可以调整颜色参数预览效果,而且可以导出图像. 在线演示 源码下载 2.Sidr – 创建侧栏和响应式菜单的最佳 jQuery 插件 侧栏隐藏菜单是一个很好的方式,使得用户可以在需要的时

javascript和HTML5上传图片之前实现预览效果

一:FileList对象与file对象 FileList对象表示用户选择的文件列表,在HTML4中,file控件内只允许放置一个文件,但是到了HTML5中,通过添加multiple属性,file控件内允许一次放置多个文件,控件内的每一个用户选择的文件都是一个file对象,而FileList对象是file对象的列表: 比如如下代码: 选择文件<input type="file" id="file" multiple size="80"/>