Как заставить сумму следовать за ползунком?
На сайте имеется калькулятор стоимость кол-ва монет. Как сделать так чтобы скидка всегда была активным и следовала за ползунком?
let sheet = document.createElement('style'),
$rangeInput = $('.range input'),
prefs = ['webkit-slider-runnable-track', 'moz-range-track', 'ms-track'];
$rangeMin = $rangeInput.attr('min');
$rangeMax = $rangeInput.attr('max');
document.body.appendChild(sheet);
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
let getTrackStyle = function(el) {
let curVal = el.value,
val = Math.floor(curVal * 100 / $rangeMax),
style = '';
$('#quantity_coins').val(curVal + ' K');
$('#coins').text(numberWithCommas(curVal * 1000));
$('.range-labels li').removeClass('active selected');
let curLabel = $('.range-labels').find('li[data-value="' + curVal + '"]');
let countLabel = $('.dsc').find('li[data-value="' + curVal + '"]');
curLabel.addClass('active selected');
curLabel.prevAll().addClass('selected');
countLabel.prevAll().css('opacity', '1');
$.each($('.range-labels li'), function(i, val) {
if (curVal > $(val).data('value')) {
$(this).addClass('selected');
}
});
$.each($('.dsc span'), function(i, val) {
if (curVal <= $(val).data('value') + 10 && curVal >= $(val).data('value')) {
$(this).css('opacity', '1');
} else {
$(this).css('opacity', '0');
}
});
// Change background gradient
for (let i = 0; i < prefs.length; i++) {
style += '.range {background: linear-gradient(to right, #EC1FF2 0%, #EC1FF2 ' + val + '%, transparent ' + val + '%, transparent 100%)}';
style += '.range input::-' + prefs[i] + '{background: linear-gradient(to right, #EC1FF2 0%, #EC1FF2 ' + val + '%, #333333 ' + val + '%, #333333 100%)}';
}
let coins_need = $('#coins-count').val();
let discount = calculate_discount(coins_need);
let price = Math.ceil(coins_need / 10 * rate * discount);
let sell = Math.ceil(price - ((price * (1 - discount) * 100) / 100));
$('#order-discount').text(Math.floor((1 - discount) * 100) + "%");
$("#coins-price").text(price);
$("#coins-sell").text(sell);
let sw = screen.width;
return style;
}
function calculate_discount(coins) {
if (coins < 500) {
$('#coins-price').css("display", "none");
$('#rub-old').css("display", "none");
} else {
$('#coins-price').css("display", "block");
$('#rub-old').css("display", "block");
}
switch (true) {
case (coins >= 500 && coins < 1000):
discount = 0.05;
break;
case (coins >= 1000 && coins < 1500):
discount = 0.06;
break;
case (coins >= 1500 && coins < 2000):
discount = 0.07;
break;
case (coins >= 2000 && coins < 2500):
discount = 0.08;
break;
case (coins >= 2500 && coins < 3000):
discount = 0.09;
break;
case (coins >= 3000 && coins < 3500):
discount = 0.1;
break;
case (coins >= 3500 && coins < 4000):
discount = 0.11;
break;
case (coins >= 4000 && coins < 4500):
discount = 0.12;
break;
case (coins >= 4500 && coins < 5000):
discount = 0.13;
break;
case (coins == 5000):
discount = 0.15;
break;
default:
discount = 0;
break;
}
console.log(discount);
return 1 - discount;
console.log(discount);
}
$rangeInput.on('input', function() {
sheet.textContent = getTrackStyle(this);
});
// Change input value on label click
$('.range-labels li').on('click', function() {
$rangeInput.val($(this).data('value')).trigger('input');
calculate_price($('#quantity_coins').val());
});
function calculate_price(value) {
let val = Math.ceil(Number(value.replace(/\D+/g, "")) / 10) * 10;
if (val > 5000) val = 5000;
let price = val / 10 * rate;
$("#coins-price").text(price);
$(this).val(val + ' K');
}
$(document).ready(function() {
let coins = $('#quantity_coins');
coins.val(coins.val() + ' K');
let price = $('#coins-count').val() / 10 * rate;
$("#coins-price").text(price);
$rangeInput.trigger('input');
coins.on('change', function() {
let val = Math.ceil(Number($(this).val().replace(/\D+/g, "")) / 10) * 10;
calculate_price($(this).val());
$rangeInput.val($(this).val()).trigger('input');
});
coins.on('focus', function() {
let val = $(this).val();
$(this).val(Number(val.replace(/\D+/g, "")));
});
coins.on('focusout', function() {
let val = $(this).val();
$(this).val(Number(val.replace(/\D+/g, "")) + ' K');
});
});
function validate(evt) {
var theEvent = evt || window.event;
var key = theEvent.keyCode || theEvent.which;
key = String.fromCharCode(key);
var regex = /[0-9]|\./;
if (!regex.test(key)) {
theEvent.returnValue = false;
if (theEvent.preventDefault) theEvent.preventDefault();
}
}
html {}
*:focus {
outline: none;
}
@media (min-width: 1200px) {
.container,
.container-lg,
.container-md,
.container-sm,
.container-xl {
max-width: 1170px;
}
}
.container-with-imgs-short,
.container-with-imgs-long {
position: relative;
}
.container-with-imgs-short:before,
.container-with-imgs-short:after {
position: absolute;
content: '';
top: 50%;
transform: translateY(-50%);
width: 220px;
height: 280px;
display: block;
}
.container-with-imgs-long:before,
.container-with-imgs-long:after {
position: absolute;
content: '';
top: 40%;
width: calc(44px * 5);
height: calc(71px * 5);
display: block;
z-index: 11;
}
@media (max-width: 992px) {
.container-with-imgs-short:before,
.container-with-imgs-short:after,
.container-with-imgs-long:before,
.container-with-imgs-long:after {
display: none;
}
}
.container .mobile-img-wrapper {
display: none;
}
.container .mobile-img-wrapper img {
width: 100%;
height: auto;
}
@media (max-width: 576px) {
.container .mobile-img-wrapper {
display: block;
}
ul.mx-auto {
opacity: 0;
}
}
.buy_coins-block .input_quantity input:focus {
box-shadow: 0px 0px 0px 2px #fff;
}
.buy_coins-block textarea.input_quantity {
min-height: 125px;
width: 100%;
background: rgba(255, 255, 255, .1);
border: 2px solid #fac260;
color: #fff;
text-transform: uppercase;
padding: 15px;
font-size: 18px;
border-radius: 3px;
text-transform: unset;
}
#count_coins .input_quantity:after,
.with_fut:after {
content: 'FUT';
position: absolute;
right: 13px;
top: 50%;
transform: translateY(-50%);
font-family: 'DIN Pro Cond';
font-style: italic;
font-weight: bold;
font-size: 13px;
line-height: 22px;
display: block;
height: 24px;
width: 25px;
padding-right: 1px;
margin: auto;
border-radius: 50%;
color: #828282;
border: 1px solid #828282;
text-align: center;
background: #1a1a1a;
}
.with_fut {
position: relative;
}
.buy_coins-block input[type=text]::placeholder {
color: rgba(255, 255, 255, .3);
}
#count_coins .price_rub {
font-weight: bold;
color: #fff;
font-size: 85px;
padding: 30px 10px;
}
.range {
position: relative;
width: 100%;
height: 5px;
margin-top: 10px;
border-radius: 50px;
}
.range input {
width: 100%;
position: absolute;
top: 1px;
left: 0;
right: -3px;
height: 0px;
-webkit-appearance: none;
z-index: 10;
}
.range input::-webkit-slider-thumb {
-webkit-appearance: none;
width: 18px;
height: 18px;
margin: -6px 0 0;
border-radius: 50%;
background: #EC1FF2;
cursor: pointer;
border: 0 !important;
}
.range input::-moz-range-thumb {
width: 18px;
height: 18px;
margin: -8px 0 0;
border-radius: 50%;
background: #EC1FF2;
cursor: pointer;
border: 0 !important;
}
.range input::-ms-thumb {
width: 18px;
height: 18px;
margin: -8px 0 0;
border-radius: 50%;
background: #EC1FF2;
cursor: pointer;
border: 0 !important;
}
.range input::-webkit-slider-runnable-track {
width: 100%;
height: 4px;
cursor: pointer;
/* background: none; */
background: #333333;
}
.range input::-moz-range-track {
width: 100%;
height: 4px;
cursor: pointer;
background: #333333;
}
.range input::-ms-track {
width: 100%;
height: 4px;
cursor: pointer;
background: #333333;
}
.range input:focus {
background: none;
outline: none;
}
.range input::-ms-track {
width: 100%;
cursor: pointer;
background: transparent;
border-color: transparent;
color: transparent;
}
.range-labels {
margin: -4px -55px 0px;
padding: 11px 20px;
list-style: none;
}
.range-labels li {
position: relative;
float: left;
width: calc(100% / 11);
text-align: center;
color: #b2b2b2;
font-size: 14px;
cursor: pointer;
}
.range-labels li::before {
content: "";
position: absolute;
top: -13px;
right: 0;
left: 0;
margin: 0 auto;
width: 4px;
height: 4px;
background: #fff;
border-radius: 50%;
z-index: 10;
}
.range-labels li:last-child {
/* margin-left: 0px; */
/* text-align: right; */
/* padding-left: 3%; */
}
.range-labels li:last-child:before {
/* left: 15px; */
}
.range-labels .active,
.range-labels .selected {
color: #EC1FF2;
font-size: 10px;
}
.range-labels .selected::before {
background: transparent;
}
.range-labels .active.selected::before {
display: none;
}
.progress {
background-color: rgba(255, 255, 255, 0.2);
border-radius: 30px;
height: 8px;
width: 100%;
}
.progress-bar {
background-color: #44FFC9;
}
span.coins_icon {
height: 20px;
width: 20px;
display: inline-block;
background: url('/storage/fut_small_icon.svg');
color: #766318;
text-align: center;
line-height: 30px;
border-radius: 50%;
margin-right: 8px;
}
span.coins {
margin-right: 10px;
}
span.avatar_icon {
height: 30px;
width: 30px;
display: inline-block;
background: url('/storage/avatar.svg');
/* color: #777;
text-align: center; */
/* line-height: 30px; */
border-radius: 50%;
margin-right: 15px;
}
/* span.avatar_icon:before {
content: "\f007";
display: inline-block;
font: normal normal normal 14px/1 FontAwesome;
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
} */
@media (max-width: 768px) {
.range-labels {
display: flex;
flex-direction: row;
justify-content: space-between;
}
.range-labels li {
width: calc(100% / 14);
text-align: center;
font-size: 10px;
}
.s500 {
transform: translateX(-20px);
z-index: 999;
}
.s1m {
transform: translateX(-50px);
z-index: 999;
}
.s2m {
transform: translateX(-30px);
z-index: 999;
}
.ft {
transform: translateX(11px);
z-index: 999;
}
.df1 {
transform: translateX(-30px);
}
.df2 {
transform: translateX(-16px);
}
.df5 {
transform: translateX(5px);
}
.hid {
position: absolute;
}
.discaundet {
display: block;
height: 10px;
width: 100%;
}
.discaundet p {
display: none;
}
.dsc {
width: 90%;
float: right;
transform: translateY(-10px);
}
.set_coins {
padding-top: 15px;
}
.dsc span {
display: block;
position: relative;
}
}
<head>
<link href="http://futbuy.net/css/bootstrap.min.css" rel="stylesheet">
<link href="http://futbuy.net/css/bootstrap-five-columns.css" rel="stylesheet">
<link href="http://futbuy.net/css/font-awesome.min.css" rel="stylesheet">
<link href="http://futbuy.net/css/jquery.fancybox.min.css" rel="stylesheet" />
<link href="http://futbuy.net/css/main.css" rel="stylesheet">
</head>
<div class="secondary-bg container-fluid" id="buy_coins-count">
<div class="container container-with-imgs-long">
<div class="row justify-content-center">
<form class="col-md-12" method="POST" action="">
<div class="col mt-5 main-col-anyway">
<div class="col-md-8 col-lg-8 text-center set_coins" id="count_coins">
<div class="discaundet">
<div class="dsc">
<script>
if (screen.width > 992) {
document.write('<span data-value="10">0%</span><span data-value="500">5%</span><span data-value="1000">6%</span><span data-value="1500" class="hid">7%</span><span data-value="2000">7%</span><span data-value="2500" class="hid">8%</span><span data-value="3000">9%</span><span data-value="3500" class="hid">10%</span><span data-value="4000">12%</span><span data-value="4500" class="hid">13%</span><span data-value="5000">15%</span>');
} else {
document.write('<span data-value="10" class="firstsell">0%</span><span data-value="500" class="">5%</span><span data-value="1000" class="df1">6%</span><span data-value="2000" class="df2">7%</span><span data-value="3000" class="df2">9%</span><span data-value="4000" class="df2">12%</span><span data-value="5000" style="margin-right: -70px" class="df5">15%</span>');
}
</script>
</div>
</div>
<div class="range">
<input id="coins-count" type="range" min="10" max="5000" step="10" value="10">
</div>
<ul class="range-labels">
<script>
if (screen.width > 992) {
document.write('<li data-value="10" class="selected">10K</li><li data-value="500" class="selected ">500K</li><li data-value="1000" class="selected">1М</li><li data-value="1500" class="selected hid">1.5М</li><li data-value="2000" class="selected">2М</li><li data-value="2500" class="selected hid">2.5М</li><li data-value="3000" class="selected">3М</li><li data-value="3500" class="selected hid">3.5М</li><li data-value="4000" class="selected">4М</li><li data-value="4500" class="selected hid">4.5М</li><li data-value="5000" class="selected">5М</li>');
} else {
document.write('<li data-value="10" class="selected">10K</li><li data-value="500" class="selected s500">500K</li><li data-value="1000" class="selected s1m">1М</li><li data-value="2000" class="selected s2m">2М</li><li data-value="3000" class="selected s2m">3М</li><li data-value="4000" class="selected s2m">4М</li><li data-value="5000" class="selected">5М</li>');
}
</script>
</ul>
<script>
let rate = '{{$rate}}';
</script>
<script src="https://plentz.github.io/jquery-maskmoney/javascripts/jquery.maskMoney.min.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
<script src="https://plentz.github.io/jquery-maskmoney/javascripts/jquery.maskMoney.min.js" type="text/javascript"></script>
<script>
let rate = '95';
</script>
<script src="https://plentz.github.io/jquery-maskmoney/javascripts/jquery.maskMoney.min.js" type="text/javascript"></script>
<script type="text/javascript" src="http://futbuy.net/js/count_coins.js" async></script>
<div id="vk_community_messages"></div>
<script type="text/javascript" src="https://vk.com/js/api/openapi.js?162" async></script>
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/[email protected]/slick/slick.min.js"></script>
<script>
if (window.matchMedia("(max-width: 768px)").matches) {
$('#advantages_block .row').slick({
dots: true,
adaptiveHeight: true
});
}
$('a[href*="#"]').not('[href="#"]').not('[href="#0"]').click(function(event) {
if (
location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') &&
location.hostname == this.hostname
) {
var target = $(this.hash);
target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
if (target.length) {
event.preventDefault();
$('html, body').animate({
scrollTop: target.offset().top
}, 1000, function() {
var $target = $(target);
$target.focus();
if ($target.is(":focus")) {
return false;
} else {
$target.attr('tabindex', '-1');
$target.focus();
};
});
}
}
});
$(document).ready(function() {
$('button.navbar-toggler').click(function() {
$('body .secondary-bg > .container, body .main-bg > .container').toggleClass('blur');
});
});
</script>
Ответы (1 шт):
Автор решения: Daniil Loban
→ Ссылка
в начале файла:
const perscentsLabel = document.querySelectorAll('.dsc span')
дополняем кейсы
function calculate_discount(coins) {
if (coins < 500) {
$('#coins-price').css("display", "none");
$('#rub-old').css("display", "none");
} else {
$('#coins-price').css("display", "block");
$('#rub-old').css("display", "block");
}
switch (true) {
case (coins < 500):
perscentsLabel[0].style.opacity = '1'
discount = 0;
break;
case (coins >= 500 && coins < 1000):
perscentsLabel[1].style.opacity = '1'
discount = 0.05;
break;
case (coins >= 1000 && coins < 1500):
perscentsLabel[2].style.opacity = '1'
discount = 0.06;
break;
case (coins >= 1500 && coins < 2000):
perscentsLabel[3].style.opacity = '1'
discount = 0.07;
break;
case (coins >= 2000 && coins < 2500):
perscentsLabel[4].style.opacity = '1'
discount = 0.08;
break;
case (coins >= 2500 && coins < 3000):
perscentsLabel[5].style.opacity = '1'
discount = 0.09;
break;
case (coins >= 3000 && coins < 3500):
perscentsLabel[6].style.opacity = '1'
discount = 0.1;
break;
case (coins >= 3500 && coins < 4000):
perscentsLabel[7].style.opacity = '1'
discount = 0.11;
break;
case (coins >= 4000 && coins < 4500):
perscentsLabel[8].style.opacity = '1'
discount = 0.12;
break;
case (coins >= 4500 && coins < 5000):
perscentsLabel[9].style.opacity = '1'
discount = 0.13;
break;
case (coins == 5000):
perscentsLabel[10].style.opacity = '1'
discount = 0.15;
break;
default:
discount = 0;
break;
}
console.log(discount);
return 1 - discount;
console.log(discount);
}
в функции getTrackStyle:
$.each($('.dsc span'), function(i, val) {
$(this).css('opacity','0');
});