鼠标拖拽缩放面板大小

52 篇文章 1 订阅
38 篇文章 0 订阅

又是一段不完美的实现,为啥设置样式left和top为空就能解决某一边元素动而右下角元素不动的bug???

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>带蒙层的弹出框</title>
    <style>
        body {
            margin: 0;
            padding: 50px;
            font-size: 14px;
            color: #333;
        }
        
        .panel {
            width: 400px;
            height: 240px;
            border: 1px solid #ccc;
            position: relative;
        }
        
        .title {
            /* width: 100%; */
            /* height: 40px; */
            background-color: #ccc;
            text-align: center;
            line-height: 40px;
            font-weight: bold;
        }
        
        .resizable-r {
            position: absolute;
            right: 0;
            top: 0;
            width: 10px;
            height: 100%;
            background-color: aqua;
            cursor: e-resize;
        }
        
        .resizable-b {
            position: absolute;
            left: 0;
            bottom: 0;
            width: 100%;
            height: 10px;
            background-color: hotpink;
            cursor: s-resize;
        }
        
        .resizable-rb {
            position: absolute;
            right: 0;
            bottom: 0;
            width: 20px;
            height: 20px;
            background-color: mediumpurple;
            cursor: se-resize;
        }
    </style>
</head>

<body>
    <div class="panel" id="resizable">
        <div class="title">Resizable Panel</div>
        <!-- 需要三个控制元素, 右,下,右下,以下是静态页面,后面需要动态加入-->
        <!-- <div class="resizable-r"></div>
        <div class="resizable-b"></div>
        <div class="resizable-rb"></div> -->
    </div>
    <script>
        // panel面板,ctrl控制元素,type控制元素类型(r,b,rb)
        var m_panel, m_ctrl, m_type;
        // moving鼠标是否按在控制元素,开始拖动;m_start_x/y鼠标相对ctrl的left/top;m_to_y鼠标的新位置
        var moving = 0,
            m_start_x = 0,
            m_start_y = 0,
            m_to_x = 0,
            m_to_y = 0;

        // 为控制元素支持拖拽
        function on_mousedown(e, panel, ctrl, type) {
            var e = e || window.event;
            m_start_x = e.pageX - ctrl.offsetLeft;
            m_start_y = e.pageY - ctrl.offsetTop;
            m_panel = panel;
            m_ctrl = ctrl;
            m_type = type;

            // 开始侦听处理移动事件
            moving = setInterval(on_move, 10);
        }

        function on_move() {
            // 如果鼠标在移动
            if (moving) {
                // 拖动范围限定,这个限定很不合理!!!,还不如直接设一个最小值呢
                var min_left = m_panel.offsetLeft;
                var min_top = m_panel.offsetTop;
                var to_x = m_to_x - m_start_x;
                var to_y = m_to_y - m_start_y;

                to_x = Math.max(to_x, min_left);
                to_y = Math.max(to_y, min_top);

                switch (m_type) {
                    case 'r':
                        m_ctrl.style.left = to_x + 'px';
                        // 加上控制元素的宽度10防止跳动
                        m_panel.style.width = to_x + 10 + 'px';
                        break;
                    case 'b':
                        m_ctrl.style.top = to_y + 'px';
                        m_panel.style.height = to_y + 10 + 'px';
                        break;
                    case 'rb':
                        m_ctrl.style.left = to_x + 'px';
                        m_ctrl.style.top = to_y + 'px';
                        m_panel.style.width = to_x + 20 + 'px';
                        m_panel.style.height = to_y + 20 + 'px';
                        break;
                }
            }
        }

        document.onmousemove = function(e) {
            var e = e || window.event;
            m_to_x = e.pageX;
            m_to_y = e.pageY;
        };
        document.onmouseup = function() {
            clearInterval(moving);
            moving = 0;
            // 解决某一边元素动而右下角元素不动的bug
            var cls = document.getElementsByClassName("resizable-ctrl");
            for (var i = 0; i < cls.length; i++) {
                cls[i].style.left = '';
                cls[i].style.top = '';
            }
        }

        // 为面板加入控制元素
        function Resizable(panel_id) {
            var panel = document.getElementById(panel_id);

            var r = document.createElement('div');
            var b = document.createElement('div');
            var rb = document.createElement('div');

            r.className = "resizable-r resizable-ctrl";
            b.className = "resizable-b resizable-ctrl";
            rb.className = "resizable-rb resizable-ctrl";

            panel.appendChild(r);
            panel.appendChild(b);
            panel.appendChild(rb);

            // 为控制元素设置拖拽处理
            r.addEventListener('mousedown', function(e) {
                on_mousedown(e, panel, r, 'r');
            });
            b.addEventListener('mousedown', function(e) {
                on_mousedown(e, panel, b, 'b');
            });
            rb.addEventListener('mousedown', function(e) {
                on_mousedown(e, panel, rb, 'rb');
            });
        }

        Resizable('resizable');
    </script>
</body>

</html>

慕课网https://www.imooc.com/video/3578/0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jZoomer开源项目主页:<br>http://code.google.com/p/jzoomer/<br>发布包下载地址:http://code.google.com/p/jzoomer/downloads/list<br>SVN下载地址:<br>http://jzoomer.googlecode.com/svn/trunk/<br><br>软件名:jZoomer<br>版本号:1.2.0<br>作者:talent_marquis<甜菜侯爵><br>联系方式:talent_marquis#163.com, marquisx.tz#google.com<br><br>简介:<br>jZoomer 是一款基于SWT/JFace的桌面应用软件<br>功能:<br>·动态放大镜功能<br>·静态图片缩放功能<br>·颜色拾取功能<br>·测量尺功能<br><br>特性:<br>·支持鼠标拖拽窗体和小控件<br>·支持国际化<br>·可扩展架构<br><br>日志:<br>20080621<br>1. Bug修正:<br> ·修正退出时报异常的Bug<br>2. 功能添加:<br> ·实现测量功能,可测量选中区域大小<br>3. 核心调整:<br> ·在system.properties中添加“tray.message.show”字段用以控制是否在托盘区显示提示信息<br> ·实现TrackerAction用以实现测量功能<br>4. 版本变更:<br> 版本升级为1.2.0<br><br>20080620<br>1. Bug修正:<br> ·修正程序退出时会报异常的Bug<br>2. 功能添加:<br> ·实现左键单击托盘区图标,主窗口开启/隐藏功能<br>3. 核心调整:<br>4. 版本变更:<br> 版本升级为1.1.4<br><br>20080619 2nd<br>1. Bug修正:<br> ·修正开始/暂停监视切换时有时会报空指针异常的错误<br>2. 功能添加:<br> ·实现静止时图片的缩放<br>3. 核心调整:<br> ·动态\静止开关中对图片处理的逻辑改变,以实现静止时图片的缩放功能<br> ·ZoomAction中zoomIn、zoomOut方法更新,支持对静止图片的缩放<br>4. 版本变更:<br> 版本升级为1.1.3<br> <br>20080619<br>1. Bug修正:<br> ·修正取色开启时鼠标双击取色后,色彩信息显示不正常的bug<br>2. 功能添加:<br> ·隐藏/取色后会在系统托盘区有信息提示<br>3. 核心调整:<br> ·在trayItem中加入tooltip用于辅助信息提示<br>4. 版本变更:<br> 版本升级为1.1.2<br><br>20080618 2nd<br>1. Bug修正:<br>2. 功能添加:<br> ·添加用户手册中文版V1.1<br> ·添加用户手册英文版V1.1<br> ·添加ant编译文件,使用“ant package”即可轻松打包发布文件<br> ·调整system.properties的排版,方便阅读<br>3. 核心调整:<br> ·加入fatjar.jar架包,用于打包编译<br>4. 版本变更:<br> 版本升级为1.1.1<br><br>20080618<br>1. Bux修正:<br> ·修正工程中加载lib路径不正确的bug<br> ·修正鼠标滚轮在停止取图监视时使用上的Bug<br> ·修正鼠标进入窗口后,还可以开启监视的Bug<br>2. 功能添加:<br> ·添加色彩信息面板<br> ·实现取色功能,用Ctrl+C开启,双击可以直接取色至剪贴板,单击暂停/开始取色<br>3. 核心调整:<br> ·在Google Code上添加了SVN地址用于维护,地址为:https://jzoomer.googlecode.com/svn/trunk/<br> ·重构鼠标拖拽Widget和面板的方法,增强其扩展性<br> ·添加ColorInfoPanel用于显示和拾取颜色<br> ·在ColorAction添加ColorInfoPanel相关的资源、逻辑和方法<br> ·添加TrackerAction用以实现对图片大小的测量(未实现)<br>4. 版本变更:<br> 版本升级为1.1<br>5. 待做事项:<br> ·停止监控时图片的缩放<br> ·对图片大小的测量(width=xxxpx,height=xxxpx)<br> ·色彩信息面板样式的美化<br> ·build.xml文件<br><br>20080617<br>1. Bug修正:<br> ·修正进出窗口时会报异常的Bug<br>2. 功能添加:<br> ·将开始/暂停监控的快捷键更改为Ctrl+Z<br> ·支持容器内部控件的拖拽(按住Ctrl键)<br> ·支持拖拽容器时移动整个Shell(在空白处)<br> ·拖拽鼠标变成小手形状<br> ·添加exit.confirm属性用以判断是否在退出时弹出提示框<br>3. 核心调整:<br> ·添加canvas用于对静止截图的处理<br> ·添加Tracker用于测量<br> ·添加Label用于信息提示<br> ·添加ColorAction用于对静止截图的处理<br>4. 版本变更:<br> 版本升级为1.03<br><br>20080616 2nd<br>1. Bug修正:<br> ·修正暂停监控时调整窗口大小,显示图像错乱的Bug<br>2. 功能添加:<br> ·添加设定背景色属性background.color<br>3. 核心调整:<br> ·去掉canvas,直接将采样图片放于container上,便于以后进一步在container上添加组件及操作<br>4. 版本变更:<br> ·版本升级为1.02<br><br>20080616<br>1. Bug修正:<br> ·暂未修正无法通过修改配置文件切换语言的Bug<br>2. 功能添加:<br> ·添加使用手册英文版v1.0<br> ·如需软件显示语言自动随系统语言切换,只需将System.properties中“locale”属性置空即可<br> ·调整缩放范围,使其既可放大屏幕也可缩小屏幕<br>3. 核心调整:<br> ·添加SWT/JFace的jar包到工程lib目录下<br> ·BasicWindow添加对鼠标移动点击的事件监听,以实现组件可用鼠标拖拽功能<br> ·BasicWindow添加在屏幕中央显示/随鼠标位置显示方法<br> ·更改屏幕采样并缩放的核心算法,使其缩放质量可以调整,支持缩小屏幕,且采样速度更快<br>4. 版本变更:<br> ·版本升级为1.0.1<br>5. 待做事项:<br> ·使用手册英文版<br> ·采样图片截取:只截取可见部分<br> ·对基类添加:随鼠标拖动功能,自动在屏幕中央显示功能,自动随鼠标显示功能<br> ·打包后无法通过修改配置文件切换语言(打包之前可以)<br> ·整理需要到的jar包,从eclipse中提取出来放到lib目录下<br> ·设置滚轮放大缩小可以开启/取消<br><br>20080615<br>1. Bug修正:<br> ·解决内存溢出Bug<br> ·解决字符串乱码Bug<br> `解决拖拽位置不正常Bug<br>2. 功能添加:<br> ·添加SystemPropertiesReader类,用于解析系统配置文件system.properties<br> ·完成软件的国际化,可根据需要切换英文/中文(暂时只能在启动前配置)<br> ·添加快捷键和部分图标<br> ·实现关闭到系统托盘效果<br>3. JZoomer v1.0 发布<br><br>20080614<br>1. 重新设计框架,提高其重用性<br>2. 实现功能:<br> ·字符串国际化<br> ·系统文件可编辑<br> ·系统托盘显示<br> ·支持滚轮缩放功能<br> ·控件拖拽功能<br> <br>20071227<br>1. JExplorer实现,初步了解JFace框架的设计思想,了解Action的使用方法<br><br>20070730<br>1. ColorPicker实现,其中含有部分放大镜功能,但有内存溢出Bug

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值