Heim Web-Frontend js-Tutorial javascript 事件处理、鼠标拖动效果实现方法详解_javascript技巧

javascript 事件处理、鼠标拖动效果实现方法详解_javascript技巧

May 16, 2016 pm 05:53 PM
事件处理 鼠标拖动

先看看要拖动的层(模拟窗口)的效果图吧。


要实现的拖动效果:鼠标左键在窗口上方的标题栏上按下,同时移动鼠标,窗口跟着移动。
窗口:

复制代码 代码如下:





一点准备工作:
要让窗口能自由移动,那么窗口的定位(position)应该采用绝对定位(absolute);
给窗口添加标题栏,这里使用一个放在窗口顶部的层实现,同时将标题栏的鼠标光标设置为拖动(move)形状(在chrome中拖动的时候,光标会变成文字光标,松开鼠标键后恢复)。
复制代码 代码如下:

#win {
position:absolute;
width:480px;
height:320px;
background-color:#d4d4d4;
border: 1px solid #4d4d4d;
}
#win_header {
width:480px;
height:48px;
background-color:#4d4d4d;
cursor:move;
}

定义一个工具函数,用来获取指定ID属性的元素:
复制代码 代码如下:

function $id(id) {
return document.getElementById(id);
}

定义一个浏览器核心标识isIE:
var isIE = (window.navigator.userAgent.indexOf("IE") == -1) ? false : true;
获取到窗口元素及其标题栏:
复制代码 代码如下:

var win = $id("win");
var header = $id("win_header");

为了方便记录鼠标和窗口的位置信息,创建一个位置:
复制代码 代码如下:

var pos =function(x, y) {
this.x = x;
this.y = y;
};

给窗口设置一个初始位置(css的left值和top值)。
这里不知道是为什么,如果不使用js设置这两个属性,就取不到值,在CSS中指定了也不行。
复制代码 代码如下:

var originalpos = new pos(20, 20);

在拖动窗口的过程中,需要记录的值有:
鼠标按下时鼠标光标的位置
复制代码 代码如下:

var oldmouse =new pos(0, 0);

鼠标按下时窗口的位置
var oldpos = new pos(0, 0);
鼠标移动时窗口的新的位置
var newpos = new pos(0, 0);
设置窗口的初始位置
复制代码 代码如下:

win.style.left = originalpos.x + "px";
win.style.top = originalpos.y + "px";

又是因为浏览器的差异(IE和非IE),元素绑定事件处理函数的方法不同(IE使用attachEvent,非IE使用addEventListener),为了简化事件绑定的操作,定义一个事件绑定函数:
复制代码 代码如下:

function bind(ev, func) {
if(isIE) {
  header.attachEvent("on" + ev, func);
} else {
  header.addEventListener(ev, func, false);
}
}

在做好这些工作后,就可以开始处理鼠标事件了。
在这个程序中,只希望鼠标左键拖动窗口,其它键都不能,所以需要判断是否是鼠标左键按下。而这个判断会在几个函数中都使用到,所以提取出来到一个函数中,通过传入的参数(鼠标键值,即按下了哪个键)判断。在这里,需要注意浏览器间的差异:IE中鼠标左键的值是1,而非IE中值是0.
复制代码 代码如下:

function isLeftButton(btn) {
if(isIE) {
if(btn == 1)
return true;
else
return false;
} else {
if(btn == 0)
return true;
else
return false;
}
}

拖动动作是在按下鼠标左键后移动来完成的。把这个动作分享开来,即是鼠标先触发了按下动作(mousedown),然后触发了移动动作(mousemove)。为了判断是否是真的在拖动还是只是鼠标从窗口上经过,设置一个变量来记录鼠标按下的状态:
var mousedown = false;
由于CSS中存在的兼容性问题,这里使用js来控制鼠标悬停在窗口标题栏上面的时候的颜色变化。
悬浮
复制代码 代码如下:

function over(e){
  header.style.backgroundColor = "#5d5d5d";
}

离开
复制代码 代码如下:

function out(e) {
header.style.backgroundColor = "#4d4d4d";
// 有时候鼠标会在未松开的情况下离开窗口,
// 此时通过触发鼠标的松开事件来使窗口脱离鼠标的控制
up(e);
}

按下
在按下事件中,需要先判断是否按下的是鼠标的左键;
若是才记录鼠标和窗口此时的位置,否则不记录。
复制代码 代码如下:

function down(e) {
e = e || event;
if(!isLeftButton(e.button))
return;
mousedown = true;
oldmouse.x = e.clientX;
oldmouse.y = e.clientY;
oldpos.x = parseInt(win.style.left.replace("px", ""));
oldpos.y = parseInt(win.style.top.replace("px", ""));
}

松开
复制代码 代码如下:

function up(e) {
if(!isLeftButton(e.button))
return;
mousedown = false;
}

移动
这里就涉及到鼠标的两个事件:
按下和移动。当且仅当鼠标左键按下时,移动动作才有效。
窗口的新位置,是由鼠标在拖动状态下的移动距离(X和Y的距离)决定的。即:
新的鼠标位置送去按下左键时记录下的位置,得到一个距离,然后将窗口的位置加上鼠标移动的距离得到窗口的新位置。
复制代码 代码如下:

function move(e) {
if(!isLeftButton(e.button))
return;
if(mousedown) {
e =e || event;
newpos.x = e.clientX - oldmouse.x;
newpos.y = e.clientY - oldmouse.y
win.style.left = (oldpos.x + newpos.x) + "px";
win.style.top = (oldpos.y + newpos.y) + "px";
}
}

事件处理都写好了,最后来给元素绑定上吧,阿门!
复制代码 代码如下:

bind("mouseover", over);
bind("mouseenter", over);
bind("mouseout", out);
bind("mouseleave", out);
bind("blur", out);
bind("mousedown", down);
bind("mouseup", up);
bind("mousemove", move);

不过在FF中的拖动有问题,只能第一次正常拖动,后面就有点乱了!
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Python-GUI-Programmierung: Beginnen Sie schnell und erstellen Sie einfach interaktive Schnittstellen Python-GUI-Programmierung: Beginnen Sie schnell und erstellen Sie einfach interaktive Schnittstellen Feb 19, 2024 pm 01:24 PM

Eine kurze Einführung in die Python-GUI-Programmierung. GUI (Graphical User Interface, grafische Benutzeroberfläche) ist eine Möglichkeit, Benutzern die grafische Interaktion mit Computern zu ermöglichen. Unter GUI-Programmierung versteht man die Verwendung von Programmiersprachen zur Erstellung grafischer Benutzeroberflächen. Python ist eine beliebte Programmiersprache, die eine umfangreiche GUI-Bibliothek bietet und die Python-GUI-Programmierung sehr einfach macht. Einführung in die Python-GUI-Bibliothek Es gibt viele GUI-Bibliotheken in Python, von denen die am häufigsten verwendeten sind: Tkinter: Tkinter ist die GUI-Bibliothek, die mit der Python-Standardbibliothek geliefert wird. Sie ist einfach und benutzerfreundlich, verfügt jedoch über begrenzte Funktionen. PyQt: PyQt ist eine plattformübergreifende GUI-Bibliothek mit leistungsstarken Funktionen.

Wie verwalte ich eine vollständige kreisförmige Ereigniswarteschlange in C++? Wie verwalte ich eine vollständige kreisförmige Ereigniswarteschlange in C++? Sep 04, 2023 pm 06:41 PM

Einführung CircularQueue ist eine Verbesserung linearer Warteschlangen, die eingeführt wurde, um das Problem der Speicherverschwendung in linearen Warteschlangen zu lösen. Zirkuläre Warteschlangen nutzen das FIFO-Prinzip, um Elemente daraus einzufügen und daraus zu löschen. In diesem Tutorial besprechen wir den Betrieb einer zirkulären Warteschlange und deren Verwaltung. Was ist eine kreisförmige Warteschlange? Eine kreisförmige Warteschlange ist eine andere Art von Warteschlange in der Datenstruktur, bei der das Front-End und das Back-End miteinander verbunden sind. Er wird auch als Ringpuffer bezeichnet. Sie funktioniert ähnlich wie eine lineare Warteschlange. Warum müssen wir also eine neue Warteschlange in die Datenstruktur einführen? Wenn Sie eine lineare Warteschlange verwenden und die Warteschlange ihr maximales Limit erreicht, ist möglicherweise etwas Speicherplatz vor dem Endzeiger vorhanden. Dies führt zu Speicherverlust und ein guter Algorithmus sollte in der Lage sein, die Ressourcen voll auszunutzen. Um die Speicherverschwendung zu lösen

Ereignisverarbeitungsbibliothek in PHP8.0: Ereignis Ereignisverarbeitungsbibliothek in PHP8.0: Ereignis May 14, 2023 pm 05:40 PM

Ereignisverarbeitungsbibliothek in PHP8.0: Ereignis Mit der kontinuierlichen Entwicklung des Internets wird PHP als beliebte Back-End-Programmiersprache häufig bei der Entwicklung verschiedener Webanwendungen verwendet. In diesem Prozess ist der ereignisgesteuerte Mechanismus zu einem sehr wichtigen Teil geworden. Die Ereignisverarbeitungsbibliothek Event in PHP8.0 bietet uns eine effizientere und flexiblere Ereignisverarbeitungsmethode. Was ist Event-Handling? Event-Handling ist ein sehr wichtiges Konzept bei der Entwicklung von Webanwendungen. Ereignisse können jede Art von Benutzerzeile sein

Wie implementiert man die Funktion zum Ziehen einer Mauslinie in JavaScript? Wie implementiert man die Funktion zum Ziehen einer Mauslinie in JavaScript? Oct 19, 2023 am 11:51 AM

Wie implementiert man die Funktion zum Ziehen einer Mauslinie in JavaScript? Zusammenfassung: Die Funktion zum Ziehen von Linien mit der Maus ist in vielen Projekten weit verbreitet und kann zum Erstellen interaktiver Diagramme, zum Zeichnen von Skizzen usw. verwendet werden. In diesem Artikel wird erläutert, wie Sie mithilfe von JavaScript die Funktion zum Ziehen von Linien mit der Maus implementieren, und es werden spezifische Codebeispiele bereitgestellt, die den Lesern helfen, sie besser zu verstehen und anzuwenden. Einführung: In der Webentwicklung ist es häufig erforderlich, hochgradig interaktive Effekte zu erzielen, und die Funktion zum Ziehen von Linien mit der Maus ist eine der häufigsten Anforderungen. Durch Ziehen mit der Maus können wir

Was bedeuten sprudelnde Ereignisse? Was bedeuten sprudelnde Ereignisse? Feb 19, 2024 am 11:53 AM

Bubbling-Ereignisse bedeuten, dass in der Webentwicklung ein Ereignis, das für ein Element ausgelöst wird, an die oberen Elemente weitergegeben wird, bis es das Dokumentstammelement erreicht. Diese Ausbreitungsmethode ähnelt einer Blase, die allmählich vom Boden aufsteigt, und wird daher als Blasenereignis bezeichnet. In der tatsächlichen Entwicklung ist es sehr wichtig zu wissen und zu verstehen, wie Bubbling-Ereignisse funktionieren, um Ereignisse richtig zu handhaben. Im Folgenden werden das Konzept und die Verwendung von Bubbling-Ereignissen anhand spezifischer Codebeispiele ausführlich vorgestellt. Zuerst erstellen wir eine einfache HTML-Seite mit einem übergeordneten Element und drei untergeordneten Elementen

So lösen Sie das Verzögerungsproblem beim Ziehen von Fenstern mit der Maus in Windows 10 So lösen Sie das Verzögerungsproblem beim Ziehen von Fenstern mit der Maus in Windows 10 Jan 06, 2024 pm 05:28 PM

Wenn Sie bei der Verwendung des Win10-Systems beim Ziehen des Fensters mit der Maus auf Verzögerungen und Einfrierungen stoßen, geht der Editor davon aus, dass es sich um ein Problem mit den Systemeinstellungen oder um ein Treiberproblem handeln muss. Sie können versuchen, den Treiber neu zu installieren oder den main.cpl-Code während des Betriebs zu verwenden, um das Problem zu lösen. Schauen wir uns die detaillierte Lösung für die Verzögerung beim Ziehen des Fensters mit der Maus in Win10 an. Was tun, wenn beim Ziehen des Fensters mit der Maus in Win10 eine Verzögerung auftritt: Methode 1 (üblich für kabelgebundene und kabellose): 1. Drücken Sie auf dem Win10-Systemdesktop die Tastenkombination „win+r“, um das Ausführungsfenster zu öffnen , geben Sie ein: main.cpl und drücken Sie zur Bestätigung die Eingabetaste. 2. Öffnen Sie dann das Dialogfeld „Mauseigenschaften“, klicken Sie auf die Maustaste und passen Sie die Doppelklickgeschwindigkeit der Maus an, indem Sie den Cursor in „Doppelklickgeschwindigkeit“ verschieben. 3. Klicken Sie dann

Verwendung von $listeners zur Übergabe von Ereignisbehandlungsfunktionen in Vue Verwendung von $listeners zur Übergabe von Ereignisbehandlungsfunktionen in Vue Jun 11, 2023 pm 03:09 PM

In Vue gibt es häufig einige verschachtelte Komponenten, und zwischen diesen verschachtelten Komponenten müssen Ereignisse übergeben werden. In Vue wird das $emit-Ereignis für die Ereigniskommunikation zwischen Komponenten verwendet. In einigen Fällen müssen wir jedoch den Ereignishandler einer übergeordneten Komponente an eine verschachtelte untergeordnete Komponente übergeben. In diesem Fall ist die Verwendung des Ereignisses $emit nicht geeignet. Zu diesem Zeitpunkt können Sie die von Vue bereitgestellten $listeners verwenden, um die Ereignisverarbeitungsfunktion zu übergeben. Was sind also $listener?

Analyse der v-on-Direktive in Vue: Umgang mit Formularübermittlungsereignissen Analyse der v-on-Direktive in Vue: Umgang mit Formularübermittlungsereignissen Sep 15, 2023 am 09:12 AM

Analyse der v-on-Direktive in Vue: Umgang mit Formularübermittlungsereignissen In Vue.js wird die v-on-Direktive zum Binden von Ereignis-Listenern verwendet und kann verschiedene DOM-Ereignisse erfassen und verarbeiten. Unter diesen ist die Verarbeitung von Formularübermittlungsereignissen einer der häufigsten Vorgänge in Vue. In diesem Artikel wird erläutert, wie Sie mit der v-on-Direktive Formularübermittlungsereignisse verarbeiten, und es werden spezifische Codebeispiele bereitgestellt. Zunächst muss klargestellt werden, dass sich das Formularübermittlungsereignis in Vue auf das Ereignis bezieht, das ausgelöst wird, wenn der Benutzer auf die Schaltfläche „Senden“ klickt oder die Eingabetaste drückt. In Vue können Sie bestehen

See all articles