`

一个图片浏览的小组件,支持全方位调整和拖拽

阅读更多
功能:双击页面图片弹出一个内含图片窗口,可进行全方位调整和拖拽
特点:
  • 基于Ext-core,面向组件形式开发,不会与其它JS发生冲突
  • 支持主流浏览器,已测试ie6、FF、chrome
  • 全局单例模式,部分组件重用,事件注册优化,最大限度降低内存消耗
  • 精心布局,考虑了页面存在滚动条的情况
  • 使用特别简单

使用方法:
1.让页面加载完毕后执行初始化函数:
Ext.onReady(function(){
                Ext.ux.ImageView.init();
            });

2.为需要提供图片浏览功能的img添加class:resizable
<img src="wow.jpg" class="resizable"/>

预览:


附件例子可直接使用浏览器打开查看

//扩展下Ext.Element
(function(){
    var D = Ext.lib.Dom;
    Ext.apply(Ext.Element.prototype, {
        //全屏幕居中,该元素必须为body的直接子元素,且为绝对定位;
        center: function(){
            var xy = [D.getViewportWidth(), D.getViewportHeight()];
            var x = Ext.getBody().getScroll().left + (xy[0] - this.getWidth()) / 2;
            var y = Ext.getBody().getScroll().top + (xy[1] - this.getHeight()) / 2;
            this.setXY([x, y]);
        }
    });
}())

/**
 * 功能:双击页面图片弹出一个内含图片窗口,可进行全方位调整和拖拽
 *
 * @author chemzqm@gmail.com
 * @version 1.0
 * @since 2010-4-30
 */
Ext.ns('Ext.ux');

Ext.ux.ImageView = function(){

    return {
        init: function(){
            this.initMask();
            Ext.getBody().on('dblclick', function(e, t, o){
                var img = Ext.fly(t);
                if (img.hasClass('resizable')) {
                    this.viewImg = Ext.getBody().createChild({
                        tag: 'img',
                        cls: 'dd-view'
                    });
                    this.viewImg.dom.src = img.getAttribute('src');
                    this.el = this.viewImg.wrap({
                        tag: 'div',
                        id: 'mywrap'
                    });
                    this.el.setWidth(img.getWidth());
                    this.el.setHeight(img.getHeight());
                    this.el.setStyle({
                        position: 'absolute',
                        zIndex: 3000,
                        cursor: 'move'
                    });
                    this.el.center();
                    this.createMakeUp();
                    this.initEvent();
                }
            }, this, {
                delegate: 'img'
            });
        }
    }
}();

Ext.apply(Ext.ux.ImageView, {
    initMask: function(){
        var d = Ext.lib.Dom, w = d.getViewWidth(true), h = d.getViewHeight(true);
        this.mask = Ext.getBody().createChild({
            cls: 'dd-mask'
        });
        this.mask.setWidth(w);
        this.mask.setHeight(h);
        this.frame = Ext.DomHelper.insertBefore(this.mask, '<iframe class="dd-frame" frameborder="0"></iframe>', true);//创建夹层
        this.frame.setWidth(w);
        this.frame.setHeight(h);
        this.mask.hide();
        this.frame.hide();
    },
    createMakeUp: function(){
        this.mask.show();
        this.frame.show();
        var head = this.el.createChild({
            cls: 'dd-header'
        });
        this.closeEl = head.createChild({
            tag: 'button',
            cls: 'dd-close',
            html: '关闭'
        });
        this.creatProxy(this.el);
    },
    initEvent: function(){
        this.closeEl.on('click', this.onDestroy, this);
        Ext.getBody().on('mousedown', this.onMousedown, this, {
            delegate: 'span'
        });
        Ext.getBody().on('mouseup', this.onMouseup, this);
        Ext.getBody().on('click', this.onMouseup, this);
        this.el.on('mousedown', this.stratMove, this);
        this.el.on('mouseup', this.endMove, this);
        this.el.on('click', this.endMove, this);
        this.el.on('mousemove', this.onMove, this);
    },
    stratMove: function(e, t, o){
        if (!Ext.fly(t).hasClass('dd-inner')) {
            return;
        }
        this.begin = {
            x: e.getPageX(),
            y: e.getPageY(),
            ex: this.el.getLeft(),
            ey: this.el.getTop()
        }
        this.moving = true;
        this.el.on('mousemove', this.onMove, this);
    },
    onMove: function(e, t, o){
        if (!this.moving) {
            return false;
        }
        e.preventDefault();
        var dx = e.getPageX() - this.begin.x;
        var dy = e.getPageY() - this.begin.y;
        this.el.setX(this.begin.ex + dx);
        this.el.setY(this.begin.ey + dy);
        this.el.focus();
    },
    endMove: function(){
        this.moving = false;
    },
    onMousedown: function(e, t, o){
        e.preventDefault();
        this.begin = {
            x: e.getPageX(),
            y: e.getPageY(),
            ex: this.el.getLeft(),
            ey: this.el.getTop(),
            ew: this.el.getWidth(),
            eh: this.el.getHeight(),
            id: t.id
        };
        this.handler = Ext.get(t);
        Ext.getBody().on('mousemove', this.onMouseMove, this);
    },
    onMouseMove: function(e, t, o){
        e.preventDefault();
        var dx = e.getPageX() - this.begin.x;
        var dy = e.getPageY() - this.begin.y;
        this.resize(this.begin.id, dx, dy);
        this.adjustInner();
    },
    onMouseup: function(e, t, o){
        Ext.getBody().un('mousemove', this.onMouseMove, this);
    },
    //让内部区调整宽高
    adjustInner: function(){
        this.proxy.setHeight(this.el.getHeight() + 10);
        this.proxy.setWidth(this.el.getWidth() + 10);
    },
    resize: function(type, dx, dy){
        var x = this.begin.ex;
        var y = this.begin.ey;
        var w = this.begin.ew;
        var h = this.begin.eh;
        var me = this.el;
        var lx = dx > 0 ? true : false;
        var ly = dy > 0 ? true : false;
        switch (type) {
            case 'tl':{
                if (lx !== ly) {
                    return;
                }
                me.setStyle('left', x + dx + 'px');
                me.setStyle('top', y + dy + 'px');
                me.setWidth(w - dx);
                me.setHeight(h - dy);
                break;
            }
            case 'tr':{
                if (lx === ly) {
                    return;
                }
                me.setStyle('top', y + dy + 'px');
                me.setWidth(w + dx);
                me.setHeight(h - dy);
                break;
            }
            case 'bl':{
                if (lx === ly) {
                    return;
                }
                me.setStyle('left', x + dx + 'px');
                me.setWidth(w - dx);
                me.setHeight(h + dy);
                break;
            }
            case 'br':{
                if (lx !== ly) {
                    return;
                }
                me.setWidth(w + dx);
                me.setHeight(h + dy);
                break;
            }
            case 't':{
                me.setStyle('top', y + dy + 'px');
                me.setHeight(h - dy);
                break;
            }
            case 'b':{
                me.setHeight(h + dy);
                break;
            }
            case 'l':{
                me.setStyle('left', x + dx + 'px');
                me.setWidth(w - dx);
                break;
            }
            case 'r':{
                me.setWidth(w + dx);
                break;
            }
            
        }
        if (Ext.isIE6) {//垃圾ie6,子元素高度不会自适应
            var eh = this.el.getHeight();
            this.viewImg.setHeight(eh);
        }
        return;
    },
    creatProxy: function(el){
        this.proxy = el.createChild({
            cls: 'dd-proxy',
            children: [{
                cls: 'dd-inner'//ie需要一个透明元素遮挡,否则选定元素不一样
            }, {
                id: 'tl',
                tag: 'span',
                cls: 'dd-anchor dd-anchor-tl'
            }, {
                id: 'tr',
                tag: 'span',
                cls: 'dd-anchor dd-anchor-tr'
            }, {
                id: 'bl',
                tag: 'span',
                cls: 'dd-anchor dd-anchor-bl'
            }, {
                id: 'br',
                tag: 'span',
                cls: 'dd-anchor dd-anchor-br'
            }, {
                id: 'l',
                tag: 'span',
                cls: 'dd-handler dd-border-l'
            }, {
                id: 'r',
                tag: 'span',
                cls: 'dd-handler dd-border-r'
            }, {
                tag: 'span',
                id: 't',
                cls: 'dd-handler dd-border-t'
            }, {
                id: 'b',
                tag: 'span',
                cls: 'dd-handler dd-border-b'
            }]
        });
        this.adjustInner();
    },
    onDestroy: function(){
        this.closeEl.un('click', this.onDestroy, this);
        Ext.getBody().un('mousedown', this.onMousedown, this, {
            delegate: '.dd-handler'
        });
        Ext.getBody().un('mouseup', this.onMouseup, this);
        Ext.getBody().un('click', this.onMouseup, this);
        this.el.removeAllListeners();
        this.mask.hide();
        this.frame.hide();
        this.el.remove();
    }
    
});

  • 大小: 483.2 KB
1
0
分享到:
评论

相关推荐

    jquery图片全景查看器鼠标拖动图片全景预览效果代码

    总的来说,实现一个jQuery图片全景查看器,需要结合HTML、CSS、JavaScript和jQuery库的知识,通过鼠标拖动事件处理和图像处理技术,为用户提供一个可交互的全景视图。通过不断优化和调试,可以打造出一个流畅、直观...

    flex360°全视角立体旋转图片demo

    "flex360°全视角立体旋转图片demo"就是一个利用Adobe Flex技术来创建的交互式3D展示应用,它带给用户一种全新的、全方位的图片浏览体验。这个应用通过Flash平台实现了图片的立体360度旋转,使用户可以像观察实物...

    three.js从入门到精通系列教程005 - three.js使用鼠标拖拽缩放浏览全景图

    在本教程中,我们将深入探讨如何使用流行的JavaScript库——three.js来实现鼠标操作,包括拖拽和缩放,以便在3D环境中浏览全景图。这个功能对于创建虚拟展厅或在线房地产看房体验非常有用。 首先,我们需要理解...

    360度全景图片

    "360度全景图片"是一种特殊的图像格式,它通过拼接多张照片来创建一个全方位、无死角的视觉体验。这种技术广泛应用于虚拟现实(VR)、房地产展示、旅游景点导览、室内设计等多个领域。在描述中提到的“一个可以旋转...

    jQuery 360度全景图插件.zip

    它允许用户通过鼠标左右拖动来浏览全景图像,从而实现对场景的全方位观察。这种技术在房地产、旅游、艺术展览等领域有广泛应用,能够生动地呈现空间环境。 首先,我们要了解jQuery的基本概念。jQuery是一个快速、...

    jquery 360度旋转插件UIMIX.fullview

    - **360度无死角旋转**:UIMIX.fullview插件可以实现图片的无缝衔接,让物体看起来可以从任意角度旋转,提供全方位的视觉体验。 - **触控支持**:支持鼠标拖动和触摸滑动,用户可以通过点击和拖动来查看物体的不同...

    jQuery实现360°全景拖动展示

    jQuery实现360°全景拖动展示是一种在网页上创建沉浸式视觉体验的技术,它允许用户通过鼠标拖动或触摸滑动来查看全方位的图像。这种技术广泛应用于房地产、旅游、产品展示等领域,为用户提供更直观、更具吸引力的...

    jquery 360度旋转插件

    这个插件,名为elbeanio-jquery.tagsphere,以其易用性和灵活性,为开发者提供了一个高效且直观的解决方案,让用户能够全方位查看对象。 elbeanio-jquery.tagsphere的核心功能在于实现对象的360度无死角旋转,无论...

    Best jQuery UI),完整的案例

    **jQuery UI全方位解析** jQuery UI 是一个开源的 JavaScript 库,它基于 jQuery 基础构建,提供了丰富的用户界面组件,如对话框、拖放功能、日历、滑块、进度条等,使得开发者能够轻松创建出交互性强、用户体验...

    360°产品展示jQuery插件--3dEye.js

    3dEye.js是一款强大的jQuery插件,专为实现这种效果而设计,它允许用户以全方位视角查看产品细节,从而增强在线购物体验。本文将深入探讨3dEye.js的核心功能、应用场景以及如何有效地整合到你的网站中。 首先,我们...

    jQuery图片360度旋转插件spritespin特效代码

    jQuery图片360度旋转插件spritespin是前端开发中的一种特效工具,它利用JavaScript库jQuery和CSS3技术,将一系列连续的静态图像拼接成一个大图,从而实现图片的无缝平滑旋转,为用户提供一种360度全方位视角的浏览...

    新版WordPress资源分享下载站日主题RiPro主题全站美化包 集成到后台功能

    RiPro主题就是这样一个专为资源分享下载站设计的高质量主题,它提供了丰富的自定义选项,使得用户可以根据自己的需求对网站进行全方位的美化。这个全站美化包特别之处在于它将美化功能集成到了后台,让管理变得更加...

    themebetter_ent_1.4主题

    【themebetter_ent_1.4主题】是一个专为企业官方网站、导购站、淘宝客、团队展示和商品展示设计的专业WordPress主题。这个主题以其超全面的SEO优化、模块化设计和强大的功能而备受赞誉,同时也因其简洁易用的特性而...

    600web_HTML手机电脑网站_网页源码移动端前端js效果_H5模板_自适应css源码ui组件.zip

    "600web_HTML手机电脑网站_网页源码移动端前端js效果_H5模板_自适应css源码ui组件.zip"这个资源包是一个全方位的前端开发工具箱,涵盖了HTML5、CSS3、JavaScript以及响应式设计等多个关键领域,对于学习和实践Web...

    jquery全景图附带坐标

    它能够为用户提供一个全方位、多视角的图像浏览体验,通常应用于虚拟旅游、产品展示、室内设计等领域。在“jquery全景图附带坐标”这个主题中,我们将深入探讨如何使用jQuery和相关插件创建带有坐标系统的全景图。 ...

    全景图入门Demo(一)

    全景图技术在现代数字媒体和虚拟现实(VR)领域中占据着重要地位,它能够提供360度全方位的视角体验,让用户仿佛置身于场景之中。"全景图入门Demo(一)"是一个针对全景图列表实现的源码示例,旨在帮助初学者理解和应用...

    java制作360度全景页面的源码和脚本提供

    Java制作360度全景页面是一项技术性强且充满趣味性的任务,主要涉及到图像处理、Web开发和用户交互设计。...通过分析和集成这些文件,我们可以搭建一个完整的360度全景图浏览应用,为用户提供沉浸式的视觉体验。

    arcgis_js_v333_api.zip

    《ArcGIS JavaScript API 3.33 深度解析》 ...无论是简单的地图展示,还是复杂的地理分析和数据可视化,这个API都能提供全方位的支持。通过熟练掌握并应用API,开发者可以创造出具有深远影响力的GIS解决方案。

    jquery图片全景查看器特效代码

    这个插件允许用户从不同角度浏览图片,创造出类似虚拟现实的体验,尤其适用于展示室内设计、产品细节或者任何需要全方位视角的场景。由于它不依赖于Flash技术,因此在现代浏览器中运行良好,适应了HTML5的普及趋势。...

Global site tag (gtag.js) - Google Analytics