我想使用'鼠标拖动'在框内拖动背景的位置。
css:
.filmmakers #map {
width : 920px;
height : 500px;
margin-top : 50px;
margin-left : 38px;
border : 1px solid rgb(0, 0, 0);
cursor : move;
overflow : hidden;
background-image : url('WorldMap.png');
background-repeat : no-repeat;
}
html:
<div id = "map" src = "WorldMap.png" onmousedown = "MouseMove(this)"> </div>
javascript:
function MouseMove (e) {
var x = e.clientX;
var y = e.clientY;
e.style.backgroundPositionX = x + 'px';
e.style.backgroundPositionY = y + 'px';
e.style.cursor = "move";
}
没有任何事情发生,没有错误,没有警告,什么都没有......我尝试了很多东西:一个div内部的绝对定位图像(你可以猜到为什么不起作用),一个div中的一个可拖动的div背景图片,拖放表,最后我试了一下:
function MouseMove () {
e.style.backgroundPositionX = 10 + 'px';
e.style.backgroundPositionY = 10 + 'px';
e.style.cursor = "move";
}
这有效,但它与鼠标的位置无关,pageX和pageY也不起作用。
现场演示:http://jsfiddle.net/VRvUB/224/
P.S:无论你的想法是什么,请不要在JQuery中写下
干杯!
Mithos
答案 0 :(得分:5)
根据您的问题,我了解您需要帮助实施实际的“拖动”行为。我猜不会。无论如何,这是我努力的结果:http://jsfiddle.net/joplomacedo/VRvUB/236/
拖动只发生在鼠标按钮上,而且......好吧,它表现得像我想你想要的那样。如果你没有=)
,只看小提琴以下是希望在此处查看的人的代码:
var AttachDragTo = (function () {
var _AttachDragTo = function (el) {
this.el = el;
this.mouse_is_down = false;
this.init();
};
_AttachDragTo.prototype = {
onMousemove: function (e) {
if ( !this.mouse_is_down ) return;
var tg = e.target,
x = e.clientX,
y = e.clientY;
tg.style.backgroundPositionX = x - this.origin_x + this.origin_bg_pos_x + 'px';
tg.style.backgroundPositionY = y - this.origin_y + this.origin_bg_pos_y + 'px';
},
onMousedown: function(e) {
this.mouse_is_down = true;
this.origin_x = e.clientX;
this.origin_y = e.clientY;
},
onMouseup: function(e) {
var tg = e.target,
styles = getComputedStyle(tg);
this.mouse_is_down = false;
this.origin_bg_pos_x = parseInt(styles.getPropertyValue('background-position-x'), 10);
this.origin_bg_pos_y = parseInt(styles.getPropertyValue('background-position-y'), 10);
},
init: function () {
var styles = getComputedStyle(this.el);
this.origin_bg_pos_x = parseInt(styles.getPropertyValue('background-position-x'), 10);
this.origin_bg_pos_y = parseInt(styles.getPropertyValue('background-position-y'), 10);
//attach events
this.el.addEventListener('mousedown', this.onMousedown.bind(this), false);
this.el.addEventListener('mouseup', this.onMouseup.bind(this), false);
this.el.addEventListener('mousemove', this.onMousemove.bind(this), false);
}
};
return function ( el ) {
new _AttachDragTo(el);
};
})();
/*** IMPLEMENTATION ***/
//1. Get your element.
var map = document.getElementById('map');
//2. Attach the drag.
AttachDragTo(map);
答案 1 :(得分:2)
这不起作用,因为您将元素“map”传递给MouseMove
函数,并将其用作事件对象和元素。您可以使用JavaScript来分配事件处理程序而不是HTML属性,从而轻松解决这个问题:
<div id="map"></div>
在你的JavaScript中:
document.getElementById('map').onmousemove = function (e) {
// the first parameter (e) is automatically assigned an event object
var x = e.clientX;
var y = e.clientY;
// The context of this is the "map" element
this.style.backgroundPositionX = x + 'px';
this.style.backgroundPositionY = y + 'px';
}
http://jsfiddle.net/VRvUB/229/
此方法的缺点是backgroundPositionX
和backgroundPositionY
样式属性为not supported in all browsers。
你提到“div中的一个绝对定位的图像”,这可能是更兼容的解决方案。要使此设置生效,您需要将外部元素的position
设置为relative
,这会使absolute
个子元素将其边界用作零。
<div id="map">
<img src="" alt="">
</div>
CSS:
#map {
position:relative;
overflow:hidden;
}
#map img {
position:absolute;
left:0;
top:0;
}
此处它适用于您的代码:http://jsfiddle.net/VRvUB/232/
答案 2 :(得分:0)
这 100% 有效 普通 JavaScript
document.getElementById('image').onmousemove = function (e) {
var x = e.clientX;
var y = e.clientY;
this.style.backgroundPositionX = -x + 'px';
this.style.backgroundPositionY = -y + 'px';
this.style.backgroundImage = 'url(https://i.ibb.co/vhL5kH2/image-14.png)';
}
document.getElementById('image').onmouseleave = function (e) {
this.style.backgroundPositionX = 0 + 'px';
this.style.backgroundPositionY = 0 + 'px';
this.style.backgroundImage = 'url(https://i.ibb.co/Ph9MCB2/template.png)';
}
.container {
max-width: 670px;
height: 377px;
}
#image {
max-width: 670px;
height: 377px;
cursor: crosshair;
overflow: hidden;
background-image: url('https://i.ibb.co/Ph9MCB2/template.png');
background-repeat: no-repeat;
}
<div class="container">
<div id="image">
</div>
</div>