前端页面,使用 dom 鼠标拖拽画一个矩形和监听键盘
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>RunJS</title>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<style type="text/css">
.container {
background: green;
height: 200px;
position: relative;
margin-left: 100px;
}
.rect {
position: absolute;
top: 0;
left: 0;
width: 0;
height: 0;
border: 1px solid red;
background: rgba(230, 230, 230, 0.5);
}
</style>
</head>
<body>
<div class="container">
<div class="rect"></div>
</div>
<script>
var $container = $(".container");
var $rect = $(".rect");
var parentOffset = $container.offset()
var startPoint = null;
var isDown = null;
function init(opts) {
$rect.css({
top: opts.top + 'px',
left: opts.left + 'px'
});
$rect.width(opts.width);
$rect.height(opts.height);
}
function reset() {
init({
top: 0,
left: 0,
width: 0,
height: 0
});
$rect.hide();
}
reset();
$rect.on('click', function(e) {
edit()
});
$container.on('mousedown', function(e) {
start(e);
});
$container.on("mousemove", function(e) {
move(e);
})
$container.on('mouseup', function(e) {
end(e);
});
$container.on('mouseleave', function(e) {
end(e);
});
document.addEventListener("keydown", keydown);
function start(e) {
var re1 = $(e.target);
if (re1.is($rect)) {
return
}
isDown = true;
$rect.width(0);
$rect.height(0);
$rect.show();
startPoint = {
y: e.pageY - parentOffset.top,
x: e.pageX - parentOffset.left
};
$rect.css({
top: startPoint.y + 'px',
left: + startPoint.x + 'px'
});
}
function move(e) {
if (isDown) {
$rect.width((e.pageX - parentOffset.left) - startPoint.x);
$rect.height((e.pageY - parentOffset.top )- startPoint.y);
}
}
function end(e) {
if (!isDown) {
return;
}
var x = e.pageX > (parentOffset.left + $container.width()) ? parentOffset.left + $container.width() : e.pageX;
var y = e.pageY > (parentOffset.top + $container.height()) ? parentOffset.top + $container.height() : e.pageY;
$rect.width((x - parentOffset.left) - startPoint.x);
$rect.height((y - parentOffset.top )- startPoint.y);
isDown = false;
startPoint = null;
save();
}
function save() {
console.log({
top: $rect.position().top,
left: $rect.position().left,
width: $rect.width(),
height: $rect.height()
})
}
function edit() {
console.log('edit');
}
function goNext() {
console.log('goNext');
}
function goPrev() {
console.log('goPrev');
}
function keydown(e) {
if (e.key === 'd' || e.key === "Delete") {
reset();
e.preventDefault();
} else if (e.key === 'e') {
edit();
e.preventDefault();
} else if (e.key === 'ArrowRight' || e.key === "f" || e.key === "Enter") {
goNext();
e.preventDefault();
} else if (e.key === 'ArrowLeft' || e.key === "s") {
goPrev();
e.preventDefault();
}
}
</script>
</body>
</html>
前端页面,使用 dom 鼠标拖拽画一个矩形和监听键盘的更多相关文章
- ArcGIS JS 学习笔记2 实现仿百度的拖拽画圆
一.前言 吐槽一下,百度在国内除了百度地图是良心产品外,其他的真的不敢恭维.在上一篇笔记里,我已经实现了自定义的地图测量模块.在百度地图里面(其他地图)都有一个周边搜索的功能,拖拽画一个圆,然后以圆半 ...
- 鼠标拖拽定位和DOM各种尺寸详解
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- JS Event 鼠标拖拽事件
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- WPF 在image控件用鼠标拖拽出矩形
原文:WPF 在image控件用鼠标拖拽出矩形 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee ...
- 2018-11-19-WPF-在image控件用鼠标拖拽出矩形
title author date CreateTime categories WPF 在image控件用鼠标拖拽出矩形 lindexi 2018-11-19 15:35:13 +0800 2018- ...
- CSharpGL(20)用unProject和Project实现鼠标拖拽图元
CSharpGL(20)用unProject和Project实现鼠标拖拽图元 效果图 例如,你可以把Big Dipper这个模型拽成下面这个样子. 配合旋转,还可以继续拖拽成这样. 当然,能拖拽的不只 ...
- JavaScript鼠标拖拽特效及相关问题总结
#div1{width:200px;height:200px;background:red;position:absolute;} #div2{width:200px;height:200px;bac ...
- 一款基于jQuery的支持鼠标拖拽滑动焦点图
记得之前我们分享过一款jQuery全屏广告图片焦点图,图片切换效果还不错.今天我们要分享另外一款jQuery焦点图插件,它的特点是支持鼠标拖拽滑动,所以在移动设备上使用更加方便,你只要用手指滑动屏幕即 ...
- 【狼】unity 鼠标拖拽物体实现任意角度自旋转
主要涉及函数 Input.GetAxis(“Mouse x”) 可取得鼠标横向(x轴)移动增量 Input.GetAxis(“Mouse y”) 可取得鼠标竖向(y轴)移动增量 通过勾股定理获取拖拽长 ...
随机推荐
- 谈谈java中成员变量与成员方法继承的问题
谈谈java中成员变量与成员方法继承的问题 关于成员变量和成员方法的的继承问题,我也可以做一个小测试,来看看结果. 首先我们先创建一个父类:
- all.css
@charset "utf-8"*{-webkit-tap-highlight-color:rgba(0,0,0,0); padding:0; margin:0;}body{ fo ...
- HDU1525 Euclid's Game
Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtra ...
- SDOI2017 Round1 Day2 题解
T2好厉害啊……AK不了啦……不过要是SCOI考这套题就好了240保底. BZOJ4819 新生舞会 模板题,分数规划+二分图最大权匹配. 费用流跑得过,可以不用KM. UPD:分数规划用迭代跑得飞快 ...
- 网卡流量检测.py
network_speed网卡流量检测 #!/usr/bin/env python #coding:utf-8 import sys import os import atexit import ti ...
- Sudo环境变量继承
sudo中默认配置会重置环境变量,所以使用sudo的时候需要小心这点.如何让sudo继承我们需要的环境变量?有如下两种方法: #sudo visudo 或者 #vi /etc/sudoers ...
- 【eclipse插件开发实战】Eclipse插件开发1——eclipse内核结构、扩展点机制
Eclipse插件开发实战1--eclipse内核结构.扩展点机制 一.前言 本系列总体介绍eclipse插件开发基本理论.插件项目结构及开发步骤,最后再给出两个插件开发实例. 总体安排结构如下: 1 ...
- TypeScript完全解读(26课时)_6.TypeScript完全解读-泛型
6.TypeScript完全解读-泛型 创建实例ts文件generics.ts 在index.ts内引入 fill是填充数组,创建的数组的元素数是times,填充的值就是接收的value的值 这里传入 ...
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 27. CICD Azure DevOps
VSTS做持续集成 后来改名叫做Azure Deveps https://azure.microsoft.com/zh-cn/services/devops/ 这是中文的地址 创建一个项目 名称.描述 ...
- UVa 820 Internet Bandwidth (裸板网络流)
题意:有一个计算机网络,输入节点数n,输入网络流源点和汇点src,des,再输入双向边数m.给出m条边的负载,求最大流. 析:直接上网络流的最大流. 代码如下: #pragma comment(lin ...