- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 this custom JavaScript range slider .我将包装器 (.range-slider
) 设置为以下内容:
position:absolute;
left: 60px;
然后,当我拖动 dragger
时,它与光标不在同一位置。 拖动器的
位置有点偏离。
如何让 dragger
跟随光标而不管它的父项在哪里?
我认为相关代码在updateDragger()函数
中:
e = e || window.event;
var pos = !isVertical ? e.pageX : e.pageY;
if (!pos) {
pos = !isVertical ? e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft : e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
}
if (down && pos >= rangeOffset && pos <= (rangeOffset + rangeWidth)) {
dragger.style[!isVertical ? 'left' : 'top'] = (pos - rangeOffset - (draggerWidth / 2)) + 'px';
cachePosition = Math.round(((pos - rangeOffset) / rangeWidth) * 100);
config.drag(cachePosition);
}
function rangeSlider(elem, config) {
var html = document.documentElement,
range = document.createElement('div'),
dragger = document.createElement('span'),
down = false,
rangeWidth, rangeOffset, draggerWidth, cachePosition;
var defaults = {
value: 0, // set default value on initiation from `0` to `100` (percentage based)
vertical: false, // vertical or horizontal?
rangeClass: "", // add extra custom class for the range slider track
draggerClass: "", // add extra custom class for the range slider dragger
drag: function(v) { /* console.log(v); */ } // function to return the range slider value into something
};
for (var i in defaults) {
if (typeof config[i] == "undefined") config[i] = defaults[i];
}
function addEventTo(el, ev, fn) {
if (el.addEventListener) {
el.addEventListener(ev, fn, false);
} else if (el.attachEvent) {
el.attachEvent('on' + ev, fn);
} else {
el['on' + ev] = fn;
}
}
var isVertical = config.vertical;
elem.className = (elem.className + ' range-slider ' + (isVertical ? 'range-slider-vertical' : 'range-slider-horizontal')).replace(/^ +/, "");
range.className = ('range-slider-track ' + config.rangeClass).replace(/ +$/, "");
dragger.className = ('dragger ' + config.draggerClass).replace(/ +$/, "");
addEventTo(range, "mousedown", function(e) {
html.className = (html.className + ' no-select').replace(/^ +/, "");
rangeWidth = range[!isVertical ? 'offsetWidth' : 'offsetHeight'];
rangeOffset = range[!isVertical ? 'offsetLeft' : 'offsetTop'];
draggerWidth = dragger[!isVertical ? 'offsetWidth' : 'offsetHeight'];
down = true;
updateDragger(e);
return false;
});
addEventTo(document, "mousemove", function(e) {
updateDragger(e);
});
addEventTo(document, "mouseup", function(e) {
html.className = html.className.replace(/(^| )no-select( |$)/g, "");
down = false;
});
addEventTo(window, "resize", function(e) {
var woh = dragger[!isVertical ? 'offsetWidth' : 'offsetHeight'];
dragger.style[!isVertical ? 'left' : 'top'] = (((cachePosition / 100) * range[!isVertical ? 'offsetWidth' : 'offsetHeight']) - (woh / 2)) + 'px';
down = false;
});
function updateDragger(e) {
e = e || window.event;
var pos = !isVertical ? e.pageX : e.pageY;
if (!pos) {
pos = !isVertical ? e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft : e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
}
if (down && pos >= rangeOffset && pos <= (rangeOffset + rangeWidth)) {
dragger.style[!isVertical ? 'left' : 'top'] = (pos - rangeOffset - (draggerWidth / 2)) + 'px';
cachePosition = Math.round(((pos - rangeOffset) / rangeWidth) * 100);
config.drag(cachePosition);
}
}
function initDragger() {
var woh = dragger[!isVertical ? 'offsetWidth' : 'offsetHeight'];
cachePosition = ((config.value / 100) * range[!isVertical ? 'offsetWidth' : 'offsetHeight']);
dragger.style[!isVertical ? 'left' : 'top'] = (cachePosition - (woh / 2)) + 'px';
config.drag(config.value);
}
range.appendChild(dragger);
elem.appendChild(range);
initDragger();
}
rangeSlider(document.getElementById('range-slider-1'), {
value: 30,
drag: function(v) {
document.getElementById('result-area').innerHTML = v + '%';
}
});
.range-slider {
width: 50%;
position: absolute;
top: 50px;
left: 60px;
}
.range-slider-track {
width: auto;
height: 20px;
margin: 0 auto;
position: relative;
}
.range-slider-track:before {
content: "";
display: block;
position: absolute;
top: 9px;
left: 0;
width: 100%;
height: 2px;
background-color: black;
}
.range-slider-track .dragger {
display: block;
width: 10px;
height: inherit;
position: relative;
z-index: 2;
background-color: red;
cursor: inherit;
/* opacity:.6; */
}
.range-slider-vertical {
display: inline-block;
vertical-align: middle;
margin: 0 1em 1em 0;
}
.range-slider-vertical .range-slider-track {
cursor: n-resize;
width: 20px;
height: 100px;
}
.range-slider-vertical .range-slider-track:before {
top: 0;
right: auto;
left: 9px;
width: 2px;
height: 100%;
}
.range-slider-vertical .range-slider-track .dragger {
width: inherit;
height: 10px;
}
.no-select {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
<div id="range-slider-1"></div>
<p id="result-area"></p>
最佳答案
您只需要获取容器元素 #range-slider-1
的位置,即传递给底部 rangeSlider
函数的元素.如果你知道了,你可以从 updateDragger
函数中的 pos
变量中减去位置偏移量。
我添加了 getElemPos
来获取元素的位置。现在您可以将 position
left
更改为任何您想要的。
这是一个示例,这仅适用于水平 slider ,不适用于垂直 slider ,但我相信您现在可以轻松地自行解决。 ;)
// This will help to get an elements position.
function getElemPos (elem) {
var xPos = 0,
yPos = 0;
while (elem) {
xPos += (elem.offsetLeft - elem.scrollLeft + elem.clientLeft);
yPos += (elem.offsetTop - elem.scrollTop + elem.clientTop);
elem = elem.offsetParent;
}
return { x: xPos, y: yPos };
}
function rangeSlider(elem, config) {
var html = document.documentElement,
range = document.createElement('div'),
dragger = document.createElement('span'),
down = false,
rangeWidth, rangeOffset, draggerWidth, cachePosition;
var defaults = {
value: 0, // set default value on initiation from `0` to `100` (percentage based)
vertical: false, // vertical or horizontal?
rangeClass: "", // add extra custom class for the range slider track
draggerClass: "", // add extra custom class for the range slider dragger
drag: function(v) { /* console.log(v); */ } // function to return the range slider value into something
};
for (var i in defaults) {
if (typeof config[i] == "undefined") config[i] = defaults[i];
}
function addEventTo(el, ev, fn) {
if (el.addEventListener) {
el.addEventListener(ev, fn, false);
} else if (el.attachEvent) {
el.attachEvent('on' + ev, fn);
} else {
el['on' + ev] = fn;
}
}
var isVertical = config.vertical;
elem.className = (elem.className + ' range-slider ' + (isVertical ? 'range-slider-vertical' : 'range-slider-horizontal')).replace(/^ +/, "");
range.className = ('range-slider-track ' + config.rangeClass).replace(/ +$/, "");
dragger.className = ('dragger ' + config.draggerClass).replace(/ +$/, "");
addEventTo(range, "mousedown", function(e) {
html.className = (html.className + ' no-select').replace(/^ +/, "");
rangeWidth = range[!isVertical ? 'offsetWidth' : 'offsetHeight'];
rangeOffset = range[!isVertical ? 'offsetLeft' : 'offsetTop'];
draggerWidth = dragger[!isVertical ? 'offsetWidth' : 'offsetHeight'];
down = true;
updateDragger(e);
return false;
});
addEventTo(document, "mousemove", function(e) {
updateDragger(e);
});
addEventTo(document, "mouseup", function(e) {
html.className = html.className.replace(/(^| )no-select( |$)/g, "");
down = false;
});
addEventTo(window, "resize", function(e) {
var woh = dragger[!isVertical ? 'offsetWidth' : 'offsetHeight'];
dragger.style[!isVertical ? 'left' : 'top'] = (((cachePosition / 100) * range[!isVertical ? 'offsetWidth' : 'offsetHeight']) - (woh / 2)) + 'px';
down = false;
});
var elemXY = getElemPos(elem);
function updateDragger(e) {
e = e || window.event;
var pos = !isVertical ? e.pageX : e.pageY;
if (!pos) {
pos = !isVertical ? (e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft) : e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
}
// Here you can substract the #range-slider-1 x postion from the mouse position.
pos -= elemXY.x;
if (down && pos >= rangeOffset && pos <= (rangeOffset + rangeWidth)) {
dragger.style[!isVertical ? 'left' : 'top'] = (pos - rangeOffset - (draggerWidth / 2)) + 'px';
cachePosition = Math.round(((pos - rangeOffset) / rangeWidth) * 100);
config.drag(cachePosition);
}
}
function initDragger() {
var woh = dragger[!isVertical ? 'offsetWidth' : 'offsetHeight'];
cachePosition = ((config.value / 100) * range[!isVertical ? 'offsetWidth' : 'offsetHeight']);
dragger.style[!isVertical ? 'left' : 'top'] = (cachePosition - (woh / 2)) + 'px';
config.drag(config.value);
}
range.appendChild(dragger);
elem.appendChild(range);
initDragger();
}
rangeSlider(document.getElementById('range-slider-1'), {
value: 30,
drag: function(v) {
document.getElementById('result-area').innerHTML = v + '%';
}
});
.range-slider {
width: 50%;
position: absolute;
top: 50px;
left: 25%;
}
.range-slider-track {
width: auto;
height: 20px;
margin: 0 auto;
position: relative;
cursor: pointer;
}
.range-slider-track:before {
content: "";
display: block;
position: absolute;
top: 9px;
left: 0;
width: 100%;
height: 2px;
background-color: black;
}
.range-slider-track .dragger {
display: block;
width: 10px;
height: inherit;
position: relative;
z-index: 2;
background-color: red;
cursor: inherit;
/* opacity:.6; */
}
.range-slider-vertical {
display: inline-block;
vertical-align: middle;
margin: 0 1em 1em 0;
}
.range-slider-vertical .range-slider-track {
cursor: n-resize;
width: 20px;
height: 100px;
}
.range-slider-vertical .range-slider-track:before {
top: 0;
right: auto;
left: 9px;
width: 2px;
height: 100%;
}
.range-slider-vertical .range-slider-track .dragger {
width: inherit;
height: 10px;
}
.no-select {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
<div id="range-slider-1"></div>
<p id="result-area"></p>
关于javascript - 具有绝对位置的 e.pageX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34404489/
我开始通过 Youtube 学习 Javascript,当我写下这段代码时,它说 pageX 未定义。我真的需要帮助。我正在开发一个捕获屏幕上鼠标位置的函数。并且请不要要求提供 HTML,因为它只是其
onClick a span,我必须在那个位置显示一条消息。所以我使用 e.pageX 来确定鼠标点击位置,因为可能有两个以上的跨度。它在决议中工作正常。如果我最大化分辨率,则消息显示在远离点击范围的
我正在使用 this custom JavaScript range slider .我将包装器 (.range-slider) 设置为以下内容: position:absolute; left: 6
我无法读取未定义的属性 pageX。 0 1 2 3
我在我的 phonegap 应用程序中使用了 intridea 的 sketch.js。修改后它工作正常 case 'touchstart': if (this.painti
因此,我使用从各种来源收集的以下代码来尝试计算出点击时图像的坐标: var naturalWidth = 690; var x = 0; var y = 0; var img = $('.imageT
有没有不使用 e.pageX 和 e.pageY 来定位任何元素的方法? 检查这个fiddle fiddle 实际上是对我要问的问题的一次糟糕尝试,但我认为一个视觉示例会更好。我想知道的是,是否可以通
所以,正如问题所指出的那样,有没有办法在 jQuery 中触发 mousemove 事件,同时将鼠标坐标发送到事件对象? 到目前为止,我的代码可以使用 .trigger(event) 函数触发 mou
我使用 jQuery 并从 jqueryUI 中拖动。当我将 jQuery 从 1.6 更新到 1.7 时,clientX 和 pageX 属性从事件变量中消失。这是一个例子: http://jsbi
我想覆盖所有事件的 event.pageX 和 event.pageY,因为 IE10+ 存在一个错误,有时会返回 pageX/Y 的浮点位置而不是整数。 最佳答案 据我所知,您无法覆盖此 nativ
我有一个事件来检测鼠标或触摸,并使用 setTimeout 将此事件发送到另一个函数。 我在检测鼠标或触摸事件时没有问题,我不能做的是将触摸事件发送到函数。 $(divst + ' #sortable
我一直在寻找一种让工具提示悬停在光标上方的方法,我看过很多建议使用事件 pageX 和 pageY 坐标如下: const showToolTip = (evt, text) => { let t
我正在尝试在鼠标滚轮事件时获取鼠标位置。 这是 fiddle 。 https://jsfiddle.net/xta2ccdt/7/ $("#container").on("mousewheel DOM
我创建 JavaScript 来获取鼠标坐标。 通过鼠标坐标显示图像的脚本(动画光标脚本 (с) Zac Ang Eng Keat): Cursor document.body.style.cu
好吧,“拆分”可能不是正确的词,我想要一个 div,如果你的鼠标在左半边执行一个功能,如果你的鼠标在右手边执行相反的功能。 在我在主 div 中设置两个额外的 div 并使用鼠标悬停来实现这一点之前,
我正在修改 js 中的 touchevents。我在 eclipse 的 logcat 中遇到过这个错误。 document.getElementById("squareBracket").
今天我发生了以下事情:我有一个现有的 mousemove 事件并稍后添加了 touchmove,如下所示: $(window).on "mousemove touchmove", (e) -> p
我正在尝试使用 jQuery 获取与 live 函数一起使用的 touchstart 事件的 X 位置? 即 $('#box').live('touchstart', function(e) { va
我试图在单击鼠标时将 div 放置在光标所在的位置。因此,当我使用 e.PageX 和 e.pageY 时,它实际上将我的 div 放置得比预期低得多。有什么想法吗? var mouseX = e.p
我正在 iPhone 上玩 touchstart 和 touchend 事件。我构建了一个示例页面,其中包含 div,如果您触摸它并滚动页面,它应该返回开始位置和结束位置的 y 坐标。 链接:http
我是一名优秀的程序员,十分优秀!