Comment puis-je définir un “cadre” pour ma glisser en mesure de l'objet en javascript?
Je suis en train de faire un Glisser-Déposer du moteur JavaScript. J'ai appris comment mettre une boîte englobante que l'élément parent. Cependant, maintenant que je souhaite pour définir la boîte englobante pour n'importe quel parent, d'un parent, ou de la totalité de la page (lié moins).
Maintenant mon Moteur Javascript ressemble:
//JavaScript Document
var dragObj;
document.addEventListener("mousedown", down, false);
function down(event) {
if(~event.target.className.search(/drag/)) {
dragObj = makeObj(event.target);
dragObj.element.style.zIndex="100";
document.addEventListener("mousemove", freeMovement, false);
}
}
function freeMovement(event) {
if (typeof(dragObj.element.mouseup) == "undefined")
document.addEventListener("mouseup", drop, false);
//Prevents redundantly adding the same event handler repeatedly
dragObj.element.style.left = Math.max(0, Math.min(event.clientX - dragObj.posX, dragObj.boundX)) + "px";
dragObj.element.style.top = Math.max(0, Math.min(event.clientY - dragObj.posY, dragObj.boundY)) + "px";
}
function drop() {
dragObj.element.style.zIndex="1";
document.removeEventListener("mousemove", freeMovement, false);
document.removeEventListener("mouseup", drop, false);
//alert("DEBUG_DROP");
}
function makeBoundlessObj(e) {
var obj = new Object();
obj.element = e;
obj.boundX = e.parentNode.offsetWidth - e.offsetWidth;
obj.boundY = e.parentNode.offsetHeight - e.offsetHeight;
obj.posX = event.clientX - e.offsetLeft;
obj.posY = event.clientY - e.offsetTop;
return obj;
}
function makeObj(e) {
obj = new Object();
obj.element = e;
obj.boundX = e.parentNode.offsetWidth - e.offsetWidth;
obj.boundY = e.parentNode.offsetHeight - e.offsetHeight;
obj.posX = event.clientX - e.offsetLeft;
obj.posY = event.clientY - e.offsetTop;
var curleft = curtop = 0;
if (e.offsetParent) {
do {
curleft += e.offsetLeft;
curtop += e.offsetTop;
//alert(e.id + ":" + e.innerHTML);
if(~e.className.search(/bound/)) {
obj.boundX = curleft - obj.element.offsetLeft;
obj.boundY = curtop - obj.element.offsetTop;
return obj;
}
} while (e = e.offsetParent);
}
return obj;
}
function findPos(obj) { //Donated by `lwburk` on StackOverflow
var curleft = curtop = 0;
if (obj.offsetParent) {
do {
curleft += obj.offsetLeft;
curtop += obj.offsetTop;
} while (obj = obj.offsetParent);
return { x: curleft, y: curtop };
}
}
Mon CSS est comme suit:
@charset "utf-8";
/* CSS Document */
* {
padding: 0px;
margin: 0px;
}
.drag {
position: absolute;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.bound {
position: relative;
}
.square {
width: 100px;
height: 100px;
background: red;
cursor:move;
}
#center {
width: 500px;
height: 300px;
margin: auto;
margin-top: 50px;
background-color:#ccc;
text-align: center;
border-radius: 25px;
-moz-border-radius: 25px;
}
#box {
background-color: #FF3;
height: 278px;
border-radius: 0 0 25px 25px;
-moz-border-radius: 0 0 25px 25px;
opacity: 0.5;
}
Et mon code HTML est assez propre:
<div id="center">
<h1>Hello World! <hr /></h1>
<div id="box" class="bound">
<p class="drag square"> One </p>
<p class="drag square"> Two </p>
</div>
</div>
J'ai tenté de faire des fonctions propres à plusieurs reprises. Je vais vous donner une que j'ai faite qui ne fonctionne pas, et je vais les énumérer pourquoi:
-
Si elle n'a pas de limites, j'ai mis le défaut de limites que l'élément parent (parce que je ne sais pas comment fixer des limites comme l'ensemble de la page)
-
Si l'un des éléments parents EST d'un bond, je ne suis pas le réglage de la limite coordonnées correctement (encore une fois, je ne sais pas comment)
Oh, et j'ai mis les limites alors que je créer les drag_object.
JavaScript fonction de création:
function makeObj(e) {
var obj = new Object();
obj.element = e;
obj.boundX = e.parentNode.offsetWidth - e.offsetWidth;
obj.boundY = e.parentNode.offsetHeight - e.offsetHeight;
obj.posX = event.clientX - e.offsetLeft;
obj.posY = event.clientY - e.offsetTop;
var curleft = curtop = 0;
if (e.offsetParent) {
do {
curleft += e.offsetLeft;
curtop += e.offsetTop;
//alert(e.id + ":" + e.innerHTML);
if(~e.className.search(/bound/)) {
obj.boundX = curleft - obj.element.offsetLeft;
obj.boundY = curtop - obj.element.offsetTop;
return obj;
}
} while (e = e.offsetParent);
}
return obj;
}
Est-ce le bon calcul pour le réglage de la boîte englobante et pourquoi? Puis-je me débarrasser de la position: relative
dans le .bound
classe? Puis-je faire .drag
classe pas position: absolute
? Je sais que toutes ces choses ne sera probablement grandement affecter la façon dont le cadre de la fonction est écrite. Si je avait à choisir entre le .drag
de la classe ou de l' .bound
classe à ne pas avoir besoin d'un certain type de position
, je choisirais la .bound
classe être réglé à n'importe quel type de positionnement.
Merci à vous tous pour la lecture et l'aider! Cela signifie beaucoup pour moi; je suis à temps plein (embarquement) élève à l'école secondaire avec très peu de temps libre =/
EDIT:
Je dois dire que j'en suis à ma dixième journée de l'apprentissage du Javascript ou du quinzième heure, selon la façon dont vous le regardez, et je voudrais apprendre la langue avant de me lancer à l'aide de bibliothèques comme jQuery. Ce moteur est un exercice académique que j'ai fait pour moi-même pour l'amour de la connaissance et de l'apprentissage de la langue =]
- +1 - certainement digne d'un objectif d'apprendre le JavaScript-même plutôt que de compter sur les bibliothèques. Cependant, vous pouvez probablement vous en apprendre beaucoup à partir de la déconstruction de la source de jQuery UI déplaçable de la bibliothèque (dont je sais qu'il prend en charge la fixation de l'élément à une boîte englobante). La plupart du code de jQuery UI est assez clair, si vous pouvez lire JS, il peut vous aider le long du chemin: jqueryui.com/demos/draggable/#constrain-movement
- merci. J'étais en train de penser au sujet de la lecture des différentes bibliothèques, mais, quand je regarde d'autres personnes de code, je n'ai aucune idée de ce qu'il se passe. Je ne connais pas assez bien le JavaScript encore. Cependant, la dernière fois que j'ai regardé quelqu'un version de "glisser-déposer" était avant, j'ai écrit une ligne de mon propre code, il est donc tout à fait possible que ce lien vous sera utile. Si seul le code est très bien commenté! Aussi, ces bibliothèques peut m'aider avec la façon dont je la structure du code. Je veux implémenter le moteur de sorte qu'il est facile à utiliser.
Vous devez vous connecter pour publier un commentaire.
La première chose que j'ai remarqué, c'est que vous n'avez pas un minimum de limite. Vous en aurez besoin pour faire appliquer la partie supérieure ET inférieure.
Est-ce le bon calcul pour le réglage de la boîte englobante et pourquoi?
Première chose, c'est que
dragObj
doit tenir compte à la fois des limites (s'applique àposition: absolute
):De la fortification des frontières est une simple mise à jour de
freeMovement
:Puis-je me débarrasser de la position relative dans le .liés classe? Yup.
Puis-je faire .faites glisser classe non position: absolute? Yup. Vous aurez juste envie de changer vos positions relatives et vos calculs pour tenir compte de cela. Par exemple, votre limite minimale sera maintenant de 0.
Voici le JSFiddle pour la
position:absolute
version: http://jsfiddle.net/feWcQ/ (fonctionne avec Firefox 4). J'ai également ajouté deux petites boîtes de montrer vos limites. Espérons que ma réponse vous aide!.drag
et.bound
de classe à n'importe quel type de positionnement? Quelle est la mathématique comme?object.style.position
puis d'effectuer vos calculs. Quand il estrelative
, puis minBoundX et minBoundY serait de 0 (comme je l'ai ci-dessus).findPos
fonction qui peut expliquer la relative/absolue de positionnement de l'élément de délimitation. Pour cela, je voudrais vraiment recommandons de regarder comment jQuery ou prototype.js est-il parce qu'il y a beaucoup de bizarreries.. surtout dans les navigateurs.Donc, avant de me prendre un coup de couteau, je recommanderais fortement le livre par OReilly, "Guide de référence pour le JavaScript". J'ai appris une tonne de là (et par la suite il a oublié quand je n'ai pas eu à l'utiliser tous les jours).
Donc il y a beaucoup de façons de la peau, ce chat, mais j'ai la partie la plus difficile est d'obtenir la position de la les choses dans une manière de croix-navigateur, sans l'aide d'une bibliothèque. Je n'ai pas fait de rappel de la syntaxe exacte (je ne vais pas essayer), mais fondamentalement, ce que vous devez faire est de trouver la boîte englobante de la position et de l'élément traîné de la position à l'aide de cette formule: http://blog.firetree.net/2005/07/04/javascript-find-position/ et puis compte pour largeurs d'élément et ainsi de suite pour rester à l'intérieur des boîtes.