鼠标拖拽事件

<!DOCTYPE>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>鼠标拖拽</title>
<script type="text/javascript" src="./js/jquery-1.7.2.min.js"></script>
<style type="text/css">
*{margin:0;padding:0;overflow: auto;}
html,body{width:100%;height: 100%;}
#content{width:90%;height: 90%;margin: 5%;background: red;position: relative;}
#test{width:100px;height: 100px;position: absolute;top:0;left: 5%;background: #90F58E;}
</style>
<script type="text/javascript">
$(function(){
    $("#test").mousedown(function(){
        var x = event.clientX - $(this).offset().left;
        var y = event.clientY - $(this).offset().top;
        $(this).data('x',x);
        $(this).data('y',y);
        $(this).data('down',true);
        console.log(event);
        return false;
    }).mousemove(function(){
        if($(this).data('down')) {
            var mx = event.clientX - $(this).data('x');
            var my = event.clientY - $(this).data('y');
            if(mx < $("#content").offset().left) {
                mx = $("#content").offset().left;
                $(this).data('down',false);
            } else if(mx > ($("#content").offset().left+$("#content").outerWidth()-$(this).outerWidth())) {
                mx = $("#content").offset().left+$("#content").outerWidth()-$(this).outerWidth();
                $(this).data('down',false);
            }
            if(my < $("#content").offset().top) {
                my = $("#content").offset().top;
                $(this).data('down',false);
            } else if (my >($("#content").offset().top+$("#content").outerHeight()-$(this).outerHeight())) {
                my = $("#content").offset().top+$("#content").outerHeight()-$(this).outerHeight();
                $(this).data('down',false);
            }
            $(this).offset({left:mx,top:my});
        } else {
            return false;
        }
    }).mouseup(function(){
        $(this).data('down',false);
    }).mouseleave(function(){
        $(this).data('down',false);
    });
})
</script>
</head>
<body>
<div id="content">
    <div id="test"></div>
</div>
</body>
</html>

### 实现鼠标拖拽事件 在 OpenLayers 中实现鼠标拖拽事件可以通过配置交互对象 `ol.interaction.DragAndDrop` 或者自定义交互逻辑来完成。对于特定功能如放大所选区域、旋转放缩以及绘制特殊图形,可以利用内置的交互组件并结合 Vue.js 进行开发。 #### 放大所选区域效果 为了实现在按下 Shift 键的同时使用鼠标拖拽以放大选定区域的功能,在 vue+openlayers 应用程序中,可通过监听鼠标的 down 和 move 事件,并记录下起始位置与结束位置形成矩形框,之后基于该矩形调整视图范围[^1]: ```javascript import 'ol/ol.css'; import {Map, View} from 'ol'; // ...其他必要的导入语句... const map = new Map({ target: 'map', layers: [ // 定义图层... ], view: new View({ center: [0, 0], zoom: 2, }), }); let start; let end; map.on('singleclick', function (evt) { if (!event.shiftKey) return; // 只有当Shift键被按下的时候才处理 const coordinate = evt.coordinate; if (!start) { start = coordinate; } else { end = coordinate; const extent = [Math.min(start[0], end[0]), Math.min(start[1], end[1]), Math.max(start[0], end[0]), Math.max(start[1], end[1])]; map.getView().fit(extent); start = null; end = null; } }); ``` #### 拖拽旋转放缩效果 要创建一个允许用户通过按住 Shift 并拖动来进行旋转和缩放的地图应用,则需进一步扩展上述代码片段中的逻辑,加入角度计算部分,并调用相应的 API 方法更新地图视角[^2]: ```javascript // 假设已经存在了一个名为rotateScaleHandler函数用于处理旋转和缩放行为 function rotateScaleHandler(event){ if(!event.shiftKey || !start){return;} let deltaX = event.pixel[0]-startPixel[0]; let deltaY = event.pixel[1]-startPixel[1]; // 计算新的中心点坐标 var newCenter=[startCoordinate[0]+deltaX,startCoordinate[1]+deltaY]; // 更新view参数 mapView.setCenter(newCenter); // 如果需要的话还可以在这里添加更多复杂的变换操作比如旋转等 } // 绑定到mousemove事件上 map.on('pointerdrag',rotateScaleHandler); ``` 请注意这只是一个简化版的例子,实际项目可能还需要考虑边界情况和其他细节优化。 #### 自定义绘制三角形 为了让 OpenLayers 支持通过鼠标拖拽的方式绘制三角形,可以在初始化时注册一个新的绘图工具,并重写其默认的行为模式[^3]: ```javascript import Draw from 'ol/interaction/Draw'; new Draw({ source: vectorSource, type: 'Circle',// 此处应替换为Triangle类型或其他自定义几何体名称, // 需要在OpenLayers源码基础上做适当修改才能真正支持此特性 }) ``` 由于标准版本并不直接提供 Triangle 类型的支持,所以如果想要实现这一点则涉及到对库本身的定制化改造工作。 #### 控制条件设置 最后提到的是有关于如何设定某些情况下禁用或启用地图拖拽及滚轮变焦等功能的需求。可以直接传入选项给 Interaction 的构造器来达到目的[^4][^5]: ```javascript interactions: defaultInteractions().extend([ new DragPan({condition: shiftKeyOnly}), new MouseWheelZoom({duration: 0})]) ``` 以上就是几种不同类型的鼠标拖拽事件及其对应的解决方案概览。每种场景的具体实施可能会有所不同,具体取决于项目的复杂度和个人需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值