如何为可拖动元素添加间隔
How to add interval to a draggable element
我创建了一个栏,您可以 select 不同的间隔。我试图让它可以拖动,我成功地实现了。我遇到的问题是我可以拖动绿色抓取栏(其中显示 "budget")。我希望能够拖动抓取条,然后将其放到范围点所在的位置(间隔),并将抓取条保持在外部元素 #sliderBar
.
内
无论如何我可以改变我必须做的事情来使这成为可能吗?
$(function() {
$("#sliderInterval").draggable();
});
$(function() {
var iSelected = 0;
var ranges = [{
lower: 500,
upper: 1000
}, {
lower: 1100,
upper: 2000
}, {
lower: 2100,
upper: 5000
}, {
lower: 5100,
upper: 10000
}, {
lower: 11000,
upper: 20000
}, {
lower: 21000,
upper: 50000
}, ];
var wslider = $("#sliderBar").width() / (ranges.length);
for (var i = 0; i < ranges.length; i++) {
var range = $('<div class="rangedot"><div class="intervalCircle"></div></div>');
var left = (100 / (ranges.length) * i);
rangeleft = "calc(" + left + "% - 2px)";
range.css({
left: rangeleft,
width: wslider
});
range.on("click", function(idx) {
return function() {
iSelected = idx;
var sliderleft = wslider * idx;
$("#sliderInterval").animate({
left: sliderleft
});
$("#budgetAmount").text("$" + ranges[idx].lower.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + " - " + "$" + ranges[idx].upper.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","));
};
}(i));
$("#sliderBar").append(range);
$("#sliderInterval").css("width", wslider + "px");
}
$("#budgetAmount").show().text("0 - ,000");
});
#project-slider-container {
width: 80%;
height: auto;
margin: 40px 0% 30px 0%;
text-align: center;
}
#project-slider-title {
text-align: left;
font-size: 1.2em;
font-weight: bold;
margin-bottom: 15px;
}
#project-slider-description {
text-align: left;
font-size: 1em;
line-height: 1.3em;
color: #2a2a2a;
}
#sliderBar {
border-radius: 15px;
width: 100%;
height: 40px;
margin: 30px 0;
background: #454343;
position: relative;
overflow: hidden;
}
.intervalCircle {
border-radius: 50%;
height: 10px;
width: 10px;
background: #CCC;
z-index: 1;
display: inline-block;
margin-top: 18px;
cursor: pointer;
}
.intervalCircle:hover {
border-radius: 50%;
height: 25px;
width: 25px;
background: #0085A1;
z-index: 1;
display: inline-block;
margin-top: 11px;
cursor: pointer;
}
.rangedot {
height: 40px;
position: absolute;
text-align: center;
left: 0px;
top: -8px;
cursor: pointer;
}
#sliderInterval {
height: 100%;
border-radius: 15px;
position: absolute;
text-align: center;
z-index: 99;
color: #FFF;
font-weight: bold;
background: #00a16d;
line-height: 40px;
}
#sliderIntervalBudget {
padding: 0 5px;
}
#budgetAmount {
font-size: 1.5em;
color: #00a16d;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div id="project-slider-container">
<div id="project-slider-title">PREFERRED BUDGET</div>
<div id="sliderBar">
<div id="sliderInterval"><span id="sliderIntervalBudget">BUDGET</span></div>
</div>
<div id="budgetAmount"></div>
</div>
这是使用 Slider 执行此操作的方法。
工作示例:https://jsfiddle.net/Twisty/1846p0nx/3/
HTML
<div id="project-slider-container">
<div id="project-slider-title">PREFERRED BUDGET</div>
<div id="project-slider-description">A transparent budget will help set expectations. A higher budget allows for a more complex website project.</div>
<div class="slide-wrap">
<div id="slider">
<div id="custom-handle" class="ui-slider-handle">BUDGET</div>
</div>
</div>
<div id="budgetAmount"></div>
</div>
CSS
.slide-wrap {
height: 40px;
padding: 0 60px;
background: #454343;
border-radius: 15px;
}
#slider {
border-radius: 15px;
height: 40px;
background: transparent;
border: 0;
padding: 0 60px;
}
#custom-handle {
border-radius: 15px;
border: 0;
height: 40px;
width: 120px;
text-align: center;
color: #FFF;
font-weight: bold;
background: #00a16d;
line-height: 40px;
top: 50%;
margin-top: -20px;
margin-left: -60px;
}
JavaScript
$(function(){
var ranges = [{
lower: 500,
upper: 1000
}, {
lower: 1100,
upper: 2000
}, {
lower: 2100,
upper: 5000
}, {
lower: 5100,
upper: 10000
}, {
lower: 11000,
upper: 20000
}, {
lower: 21000,
upper: 50000
}, ];
var handle = $("#custom-handle");
var amount = $("#budgetAmount");
$("#slider").slider({
min: 0,
max: 5,
step: 1,
create: function() {
var i = $(this).slider("value");
amount.text("$" + ranges[i].lower + " - $" + ranges[i].upper);
$.each(ranges, function(key, item) {
var range = $("<div>", {
class: "rangedot"
}).data("key", key);
var dot = $("<div>", {
class: "intervalCircle"
}).appendTo(range);
var l = Math.round(100 / (ranges.length - 1) * key);
var w = $("#slider").width() / (ranges.length);
range.css({
left: "calc(" + l + "% - " + (w / 2) + "px)",
width: w + "px"
}).click(function() {
$("#slider").slider("value", $(this).data("key"));
}).appendTo("#slider");
});
},
slide: function(event, ui) {
var i = ui.value;
amount.text("$" + ranges[i].lower + " - $" + ranges[i].upper);
}
});
});
更新
如果你想专门用 draggable 做这个,我会建议这个。
示例:https://jsfiddle.net/Twisty/1846p0nx/4/
$(function() {
var iSelected = 0;
var ranges = [{
lower: 500,
upper: 1000
}, {
lower: 1100,
upper: 2000
}, {
lower: 2100,
upper: 5000
}, {
lower: 5100,
upper: 10000
}, {
lower: 11000,
upper: 20000
}, {
lower: 21000,
upper: 50000
}];
var wslider = $("#sliderBar").width() / (ranges.length);
$("#sliderInterval").draggable({
axis: "x",
grid: [wslider, 0],
containment: "#sliderBar",
});
for (var i = 0; i < ranges.length; i++) {
var range = $('<div class="rangedot"><div class="intervalCircle"></div></div>');
var left = (100 / (ranges.length) * i);
rangeleft = "calc(" + left + "% - 2px)";
range.css({
left: rangeleft,
width: wslider
});
range.on("click", function(idx) {
return function() {
iSelected = idx;
var sliderleft = wslider * idx;
$("#sliderInterval").animate({
left: sliderleft
});
$("#budgetAmount").text("$" + ranges[idx].lower.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + " - " + "$" + ranges[idx].upper.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","));
};
}(i));
$("#sliderBar").append(range);
$("#sliderInterval").css("width", wslider + "px");
}
$("#budgetAmount").show().text("0 - ,000");
});
然后您可以使用 stop
或创建一个 droppable 来查看它的放置位置。我仍然建议使用滑块。
我创建了一个栏,您可以 select 不同的间隔。我试图让它可以拖动,我成功地实现了。我遇到的问题是我可以拖动绿色抓取栏(其中显示 "budget")。我希望能够拖动抓取条,然后将其放到范围点所在的位置(间隔),并将抓取条保持在外部元素 #sliderBar
.
无论如何我可以改变我必须做的事情来使这成为可能吗?
$(function() {
$("#sliderInterval").draggable();
});
$(function() {
var iSelected = 0;
var ranges = [{
lower: 500,
upper: 1000
}, {
lower: 1100,
upper: 2000
}, {
lower: 2100,
upper: 5000
}, {
lower: 5100,
upper: 10000
}, {
lower: 11000,
upper: 20000
}, {
lower: 21000,
upper: 50000
}, ];
var wslider = $("#sliderBar").width() / (ranges.length);
for (var i = 0; i < ranges.length; i++) {
var range = $('<div class="rangedot"><div class="intervalCircle"></div></div>');
var left = (100 / (ranges.length) * i);
rangeleft = "calc(" + left + "% - 2px)";
range.css({
left: rangeleft,
width: wslider
});
range.on("click", function(idx) {
return function() {
iSelected = idx;
var sliderleft = wslider * idx;
$("#sliderInterval").animate({
left: sliderleft
});
$("#budgetAmount").text("$" + ranges[idx].lower.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + " - " + "$" + ranges[idx].upper.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","));
};
}(i));
$("#sliderBar").append(range);
$("#sliderInterval").css("width", wslider + "px");
}
$("#budgetAmount").show().text("0 - ,000");
});
#project-slider-container {
width: 80%;
height: auto;
margin: 40px 0% 30px 0%;
text-align: center;
}
#project-slider-title {
text-align: left;
font-size: 1.2em;
font-weight: bold;
margin-bottom: 15px;
}
#project-slider-description {
text-align: left;
font-size: 1em;
line-height: 1.3em;
color: #2a2a2a;
}
#sliderBar {
border-radius: 15px;
width: 100%;
height: 40px;
margin: 30px 0;
background: #454343;
position: relative;
overflow: hidden;
}
.intervalCircle {
border-radius: 50%;
height: 10px;
width: 10px;
background: #CCC;
z-index: 1;
display: inline-block;
margin-top: 18px;
cursor: pointer;
}
.intervalCircle:hover {
border-radius: 50%;
height: 25px;
width: 25px;
background: #0085A1;
z-index: 1;
display: inline-block;
margin-top: 11px;
cursor: pointer;
}
.rangedot {
height: 40px;
position: absolute;
text-align: center;
left: 0px;
top: -8px;
cursor: pointer;
}
#sliderInterval {
height: 100%;
border-radius: 15px;
position: absolute;
text-align: center;
z-index: 99;
color: #FFF;
font-weight: bold;
background: #00a16d;
line-height: 40px;
}
#sliderIntervalBudget {
padding: 0 5px;
}
#budgetAmount {
font-size: 1.5em;
color: #00a16d;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div id="project-slider-container">
<div id="project-slider-title">PREFERRED BUDGET</div>
<div id="sliderBar">
<div id="sliderInterval"><span id="sliderIntervalBudget">BUDGET</span></div>
</div>
<div id="budgetAmount"></div>
</div>
这是使用 Slider 执行此操作的方法。
工作示例:https://jsfiddle.net/Twisty/1846p0nx/3/
HTML
<div id="project-slider-container">
<div id="project-slider-title">PREFERRED BUDGET</div>
<div id="project-slider-description">A transparent budget will help set expectations. A higher budget allows for a more complex website project.</div>
<div class="slide-wrap">
<div id="slider">
<div id="custom-handle" class="ui-slider-handle">BUDGET</div>
</div>
</div>
<div id="budgetAmount"></div>
</div>
CSS
.slide-wrap {
height: 40px;
padding: 0 60px;
background: #454343;
border-radius: 15px;
}
#slider {
border-radius: 15px;
height: 40px;
background: transparent;
border: 0;
padding: 0 60px;
}
#custom-handle {
border-radius: 15px;
border: 0;
height: 40px;
width: 120px;
text-align: center;
color: #FFF;
font-weight: bold;
background: #00a16d;
line-height: 40px;
top: 50%;
margin-top: -20px;
margin-left: -60px;
}
JavaScript
$(function(){
var ranges = [{
lower: 500,
upper: 1000
}, {
lower: 1100,
upper: 2000
}, {
lower: 2100,
upper: 5000
}, {
lower: 5100,
upper: 10000
}, {
lower: 11000,
upper: 20000
}, {
lower: 21000,
upper: 50000
}, ];
var handle = $("#custom-handle");
var amount = $("#budgetAmount");
$("#slider").slider({
min: 0,
max: 5,
step: 1,
create: function() {
var i = $(this).slider("value");
amount.text("$" + ranges[i].lower + " - $" + ranges[i].upper);
$.each(ranges, function(key, item) {
var range = $("<div>", {
class: "rangedot"
}).data("key", key);
var dot = $("<div>", {
class: "intervalCircle"
}).appendTo(range);
var l = Math.round(100 / (ranges.length - 1) * key);
var w = $("#slider").width() / (ranges.length);
range.css({
left: "calc(" + l + "% - " + (w / 2) + "px)",
width: w + "px"
}).click(function() {
$("#slider").slider("value", $(this).data("key"));
}).appendTo("#slider");
});
},
slide: function(event, ui) {
var i = ui.value;
amount.text("$" + ranges[i].lower + " - $" + ranges[i].upper);
}
});
});
更新
如果你想专门用 draggable 做这个,我会建议这个。
示例:https://jsfiddle.net/Twisty/1846p0nx/4/
$(function() {
var iSelected = 0;
var ranges = [{
lower: 500,
upper: 1000
}, {
lower: 1100,
upper: 2000
}, {
lower: 2100,
upper: 5000
}, {
lower: 5100,
upper: 10000
}, {
lower: 11000,
upper: 20000
}, {
lower: 21000,
upper: 50000
}];
var wslider = $("#sliderBar").width() / (ranges.length);
$("#sliderInterval").draggable({
axis: "x",
grid: [wslider, 0],
containment: "#sliderBar",
});
for (var i = 0; i < ranges.length; i++) {
var range = $('<div class="rangedot"><div class="intervalCircle"></div></div>');
var left = (100 / (ranges.length) * i);
rangeleft = "calc(" + left + "% - 2px)";
range.css({
left: rangeleft,
width: wslider
});
range.on("click", function(idx) {
return function() {
iSelected = idx;
var sliderleft = wslider * idx;
$("#sliderInterval").animate({
left: sliderleft
});
$("#budgetAmount").text("$" + ranges[idx].lower.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + " - " + "$" + ranges[idx].upper.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","));
};
}(i));
$("#sliderBar").append(range);
$("#sliderInterval").css("width", wslider + "px");
}
$("#budgetAmount").show().text("0 - ,000");
});
然后您可以使用 stop
或创建一个 droppable 来查看它的放置位置。我仍然建议使用滑块。