Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Калькулятор с 2мя ползунками (https://javascript.ru/forum/jquery/64419-kalkulyator-s-2mya-polzunkami.html)

fos 10.08.2016 01:47

Калькулятор с 2мя ползунками
 
Снова приветствую всех ГУРУ явы)

На сей раз задачку решил понагляднее изъяснить, дабы снова не пришлось 100раз с 0 переписывать все :)
В общем вот как оно должно выглядеть:


Теперь собсно как оно должно считаться
X= (выбранному радио х1,х2 или х3), где X1=30, X2=50, X3=100
Y= POLZUN2*900
Z = OPTION1*1800
W = OPTION2*10

ITOGO=POLZUN1*X + Y + Z + W

В общем задачка не из простых, надеюсь на понимание таких гуру как Рони :)))

fos 10.08.2016 01:53

Забыл еще дополнить зависимость POLZUN2 от POLZUN1, Каждые 100 единиц в POLZUN1 увеличивать стартовое значение в POLZUN2 на +1..

т.е. если в P1 выбрано меньше 100, то P2: от 1 до 6, если от 100 до 175, то P2: от 2 до 6, если от 200 до 275, P2 - от 3 до 6 Если 500 - от 6 до 6.

Учитывая мою криворукость я изуродую само понятие кода, попытаясь это все собрать в пучок :)

fos 10.08.2016 21:56

Собственно набросал верхушку, но попал тутже в тотальный ступор с радиобаттнами, не могу найти функцию, чтобы при checked'e "itnm" присваивалось соответствующее валуе выбранного радио...
Да и чувствую можно как-то укоротить это полотенце массивами (с ними у меня полный абзац), т.к. var price будет длинной до 500 с темже шагом (25), а это уже "Война и Мир"...

$(function() {
itnm = 40
var price = {
    50: {
        1: itnm*50+900*1,
        2: itnm*50+900*2,
        3: itnm*50+900*3,
        4: itnm*50+900*4,
        5: itnm*50+900*5,
        6: itnm*50+900*6,
    },
    75: {
        1: itnm*75+900*1,
        2: itnm*75+900*2,
        3: itnm*75+900*3,
        4: itnm*75+900*4,
        5: itnm*75+900*5,
        6: itnm*75+900*6,
    },
    100: {
        2: itnm*100+900*2,
        3: itnm*100+900*3,
        4: itnm*100+900*4,
        5: itnm*100+900*5,
        6: itnm*100+900*6,
    },
    125: {
        2: itnm*125+900*2,
        3: itnm*125+900*3,
        4: itnm*125+900*4,
        5: itnm*125+900*5,
        6: itnm*125+900*6,
    },
    150: {
        2: itnm*150+900*2,
        3: itnm*150+900*3,
        4: itnm*150+900*4,
        5: itnm*150+900*5,
        6: itnm*150+900*6,
    },
    175: {
        2: itnm*175+900*2,
        3: itnm*175+900*3,
        4: itnm*175+900*4,
        5: itnm*175+900*5,
        6: itnm*175+900*6,
    },
    200: {
        3: itnm*200+900*3,
        4: itnm*200+900*4,
        5: itnm*200+900*5,
        6: itnm*200+900*6,
    },
    225: {
        3: itnm*225+900*3,
        4: itnm*225+900*4,
        5: itnm*225+900*5,
        6: itnm*225+900*6,
    },
};

    function comb(a) {
        return Object.keys(a)
    }

    var steps = comb(price);
    var num = steps[0];
    var steps2 = comb(price[num]);

    $("#slider2").slider({
        value: 0,
        min: 0,
        max: steps2.length - 1,
        step: 1,
        slide: function(event, ui) {
            var Y = steps2[ui.value];
            $("#amount2").val(Y);
            $("#amount3").val(price[num][Y]);
        },
        change: function(event, ui) {
            var Y = steps2[ui.value];
            $("#amount2").val(Y);
            $("#amount3").val(price[num][Y]);
        }
    });
    $("#slider").slider({
        value: 0,
        min: 0,
        max: steps.length - 1,
        step: 1,
        slide: function(event, ui) {
            num = steps[ui.value];
            $("#amount").val(num);
            steps2 = comb(price[num]);
            $("#slider2").slider("option","max", steps2.length - 1);
            $("#slider2").slider("option", "value", 0)
        },
        change: function(event, ui) {
            num = steps[ui.value];
            $("#amount").val(num);
            steps2 = comb(price[num]);
            $("#slider2").slider("option","max", steps2.length - 1);
            $("#slider2").slider("option", "value", 0)
        }
    });
    $("#slider").slider("option", "value", 0)
});

body {
  font-family: sans-serif;
  font-size: 12px;
}

#amount, #amount2, #amount3 {
  font-size: 22px;
  font-weight: bold;
  border:none;
  color: #ff5555;
  background: none;

}
#slider, #slider2{
   width: 300px;
}
.radio {
display: inline;
}

<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js">
</script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<p class="radio"><input type="radio" name="xradio" value="40" checked>RADIO1</p><p class="radio"><input type="radio" name="xradio" value="50">RADIO2</p><p class="radio"><input type="radio" name="xradio" value="100">RADIO3</p>
<p>
  <input type="text" id="amount" readonly>
</p>

<div id="slider"></div>

<p>
  <input type="text" id="amount2" readonly>
</p>

<div id="slider2"></div>
<p>
  <input type="text" id="amount3" readonly>
</p>
</body>


Собсно на жсбин впилил: http://jsbin.com/sawexujera/edit?html,css,js,output

Поможите люди добрыя! :)

рони 10.08.2016 23:24

fos,
а на картинке 4 ползунка?

fos 10.08.2016 23:53

ну они потом тупо +вать по аналогии с ползуном 2, без зависимости от чего либо.. тупо передвинул + к сумме, там нужно додумать как их еще смысловой нагрузкой скрывать лучше они типа как опциональные... в общем по мере поступления проблемы, а то я нахрен позапутаюсь :))))

рони 11.08.2016 01:33

slider калькулятор
 
fos,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  body {
  font-family: sans-serif;
  font-size: 12px;
}

.amount{
  font-size: 22px;
  font-weight: bold;
  border:none;
  color: #ff5555;
  background: none;

}
.slider{
   width: 300px;
   margin: 20px;
}
.radio {
display: inline;
}
.opt [type="checkbox"] + *{
   display: none;
}
.opt :checked + *{
  display:  block;
}
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
  <script>
$(function() {
    var data = [
        [50, 500, 25],
        [1, 6, 1],
        [0, 6, 1],
        [0, 500, 5]
    ];

    function out() {
        var x = $('[name="xradio"]:checked').index('[name="xradio"]') || 0;
        x = [30, 50, 100][x];
        var p = $(".opt .amount");
        var p1 = +p[0].value;
        var min = 1;
        if (p1 > 100 && p1 < 175) min = 2;
        /*  */
        $(".slider").eq(1).slider("option", {
            "value": Math.max(p[1].value, min),
            "min": min
        });
        var y = p[1].value * 900;
        var z = p[2].value * 1800;
        var w = p[3].value * 10;
        $(".res").html(p1 * x + y + z + w)
    }
    $(".opt").each(function(i, el) {
        var d = data[i],
            am = $(".amount", el),
            sl = $(".slider", el),
            c = $('[type="checkbox"]',
                el);
        sl.slider({
            min: d[0],
            max: d[1],
            step: d[2],
            slide: function(event, ui) {
                am.val(ui.value)
            },
            change: function(event, ui) {
                am.val(ui.value)
            },
            stop: out
        });
        sl.slider("option", "value", d[0]);
        if (c.length) c.on("click", function() {
            !this.checked && sl.slider("option", "value", 0);
            out()
        })
    });
    $('[name="xradio"]').on("click", out)
});
  </script>
</head>

<body>

<div class="radio">
<label><input type="radio" name="xradio" value="40" checked>RADIO1</label>
<label><input type="radio" name="xradio" value="50">RADIO2</label>
<label><input type="radio" name="xradio" value="100">RADIO3</label></div>


<div class="opt">
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="opt">
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="opt">
  <input type="checkbox" >
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="opt">
  <input type="checkbox" >
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="res">0</div>
</body>
</html>

fos 11.08.2016 01:37

с css позже тогда помучаюсь, как это лучше визуализировать, а по механике вот:
body {
  font-family: sans-serif;
  font-size: 12px;
}

#amount, #amount2, #amount3, #amount4, #amount5 {
  font-size: 22px;
  font-weight: bold;
  border:none;
  color: #ff5555;
  background: none;

}
#slider, #slider2, #slider3, #slider4 {
   width: 300px;
}
.radio {
display: inline;
}

<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js">
</script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<p class="radio"><input type="radio" name="xradio" value="40" checked>RADIO1</p><p class="radio"><input type="radio" name="xradio" value="50">RADIO2</p><p class="radio"><input type="radio" name="xradio" value="100">RADIO3</p>
<p>
  <input type="text" id="amount" readonly>
</p>

<div id="slider"></div>

<p>
  <input type="text" id="amount2" readonly>
</p>

<div id="slider2"></div>
<p>
  <input type="text" id="amount4" value="0" readonly>
</p>

<div id="slider3"></div>

<p>
  <input type="text" id="amount5" value="0" readonly>
</p>

<div id="slider4"></div>
<p>
  <input type="text" id="amount3" readonly>
</p>
</body>

$(function() {
itnm = 40
var price = {
    50: {
        1: itnm*50+900*1,
        2: itnm*50+900*2,
        3: itnm*50+900*3,
        4: itnm*50+900*4,
        5: itnm*50+900*5,
        6: itnm*50+900*6,
    },
    75: {
        1: itnm*75+900*1,
        2: itnm*75+900*2,
        3: itnm*75+900*3,
        4: itnm*75+900*4,
        5: itnm*75+900*5,
        6: itnm*75+900*6,
    },
    100: {
        2: itnm*100+900*2,
        3: itnm*100+900*3,
        4: itnm*100+900*4,
        5: itnm*100+900*5,
        6: itnm*100+900*6,
    },
    125: {
        2: itnm*125+900*2,
        3: itnm*125+900*3,
        4: itnm*125+900*4,
        5: itnm*125+900*5,
        6: itnm*125+900*6,
    },
    150: {
        2: itnm*150+900*2,
        3: itnm*150+900*3,
        4: itnm*150+900*4,
        5: itnm*150+900*5,
        6: itnm*150+900*6,
    },
    175: {
        2: itnm*175+900*2,
        3: itnm*175+900*3,
        4: itnm*175+900*4,
        5: itnm*175+900*5,
        6: itnm*175+900*6,
    },
    200: {
        3: itnm*200+900*3,
        4: itnm*200+900*4,
        5: itnm*200+900*5,
        6: itnm*200+900*6,
    },
    225: {
        3: itnm*225+900*3,
        4: itnm*225+900*4,
        5: itnm*225+900*5,
        6: itnm*225+900*6,
    },
};

    function comb(a) {
        return Object.keys(a)
    }

    var steps = comb(price);
    var num = steps[0];
    var steps2 = comb(price[num]);
    $("#slider2").slider({
        value: 0,
        min: 0,
        max: steps2.length - 1,
        step: 1,
        slide: function(event, ui) {
            var Y = steps2[ui.value];
            $("#amount2").val(Y);
            $("#amount3").val(price[num][Y]);
        },
        change: function(event, ui) {
            var Y = steps2[ui.value];
            $("#amount2").val(Y);
            $("#amount3").val(price[num][Y]);
        }
    });
    $("#slider").slider({
        value: 0,
        min: 0,
        max: steps.length - 1,
        step: 1,
        slide: function(event, ui) {
            num = steps[ui.value];
            $("#amount").val(num);
            steps2 = comb(price[num]);
            $("#slider2").slider("option","max", steps2.length - 1);
            $("#slider2").slider("option", "value", 0)
        },
        change: function(event, ui) {
            num = steps[ui.value];
            $("#amount").val(num);
            steps2 = comb(price[num]);
            $("#slider2").slider("option","max", steps2.length - 1);
            $("#slider2").slider("option", "value", 0)
        }
    });
    $("#slider3").slider({
     value: 0,
     min: 0,
     max: 6, 
     step: 1,
     slide: function( event, ui ) {
     $( "#amount4" ).val( ui.value );
     },
     change: function(event, ui) {
     $( "#amount4" ).val( ui.value );
     }
    });
     $("#slider4").slider({
     value: 0,
     min: 0,
     max: 350, 
     step: 5,
     slide: function( event, ui ) {
     $( "#amount5" ).val( ui.value );
     },
     change: function(event, ui) {
     $( "#amount5" ).val( ui.value );
     }
    });
    $("#slider").slider("option", "value", 0)
});


Тут у меня сразу ступор с прибавкой к сумме по результатам 1 и 2го ползуна... В общем к amount3 нужно + amount4*1800 и + amount5*10.. часа 3 уже колдую хреновня какаят нерабочая получается да и только =\

запилил в джсбин: http://jsbin.com/ziwoqilula/edit?html,css,js,output

fos 11.08.2016 01:38

Цитата:

Сообщение от рони (Сообщение 425068)
fos,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  body {
  font-family: sans-serif;
  font-size: 12px;
}

.amount{
  font-size: 22px;
  font-weight: bold;
  border:none;
  color: #ff5555;
  background: none;

}
.slider{
   width: 300px;
   margin: 20px;
}
.radio {
display: inline;
}
.opt [type="checkbox"] + *{
   display: none;
}
.opt :checked + *{
  display:  block;
}
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
  <script>
$(function() {
    var data = [
        [50, 500, 25],
        [1, 6, 1],
        [0, 6, 1],
        [0, 500, 5]
    ];

    function out() {
        var x = $('[name="xradio"]:checked').index('[name="xradio"]') || 0;
        x = [30, 50, 100][x];
        var p = $(".opt .amount");
        var p1 = +p[0].value;
        var min = 1;
        if (p1 > 100 && p1 < 175) min = 2;
        /*  */
        $(".slider").eq(1).slider("option", {
            "value": Math.max(p[1].value, min),
            "min": min
        });
        var y = p[1].value * 900;
        var z = p[2].value * 1800;
        var w = p[3].value * 10;
        $(".res").html(p1 * x + y + z + w)
    }
    $(".opt").each(function(i, el) {
        var d = data[i],
            am = $(".amount", el),
            sl = $(".slider", el),
            c = $('[type="checkbox"]',
                el);
        sl.slider({
            min: d[0],
            max: d[1],
            step: d[2],
            slide: function(event, ui) {
                am.val(ui.value)
            },
            change: function(event, ui) {
                am.val(ui.value)
            },
            stop: out
        });
        sl.slider("option", "value", d[0]);
        if (c.length) c.on("click", function() {
            !this.checked && sl.slider("option", "value", 0);
            out()
        })
    });
    $('[name="xradio"]').on("click", out)
});
  </script>
</head>

<body>

<div class="radio">
<label><input type="radio" name="xradio" value="40" checked>RADIO1</label>
<label><input type="radio" name="xradio" value="50">RADIO2</label>
<label><input type="radio" name="xradio" value="100">RADIO3</label></div>


<div class="opt">
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="opt">
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="opt">
  <input type="checkbox" >
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="opt">
  <input type="checkbox" >
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="res">0</div>
</body>
</html>

ЕПТЫЖИТОПТЫЖИ))))))

Ща обмозгую...

fos 11.08.2016 01:52

Рони, я уже не раз говорил - Вы гений) Одно только "вывалилось" из алгаритма) зависимость 2го ползуна от 1го.. это основной момент.. т.к. в 1м считается колво, а во 2м часы затраченные... и за час более 100 единиц невтоптать :(, а так сделано прям вот точьвточь как я хотел, даже с обнулением при скрытии на чекбокс! вот прям из мозга весь алгаритм рассмотрели!:))))))

рони 11.08.2016 02:09

Цитата:

Сообщение от fos
Одно только "вывалилось" из алгаритма) зависимость 2го

всё там есть как вы описали строка 53 для примера

fos 11.08.2016 09:21

Цитата:

Сообщение от рони (Сообщение 425072)
всё там есть как вы описали строка 53 для примера

я в шоке... Профессор и все тут :)

fos 11.08.2016 09:45

Цитата:

Сообщение от рони (Сообщение 425072)
всё там есть как вы описали строка 53 для примера

балин, чет не выходит
if (p1 > 100 && p1 < 175) min = 2;
        if (p1 > 250 && p1 < 325) min = 3;
        if (p1 > 350 && p1 < 425) min = 4;
        if (p1 > 450) min = 5;

рони 11.08.2016 09:55

fos,
а что делать в промежутках между 175 и 250

fos 11.08.2016 10:08

Цитата:

Сообщение от рони (Сообщение 425087)
fos,
а что делать в промежутках между 175 и 250

во я затупок)
if (p1 > 75 && p1 < 250) min = 2;
        if (p1 > 245 && p1 < 350) min = 3;
        if (p1 > 345 && p1 < 450) min = 4;
        if (p1 > 445) min = 5;

рони 11.08.2016 10:26

fos,
вы ещё раз проверьте логику.
245 и 250 и где-то >= или <=

fos 11.08.2016 10:38

Цитата:

Сообщение от рони (Сообщение 425094)
fos,
вы ещё раз проверьте логику.
245 и 250 и где-то >= или <=

точно..
if (p1 > 75 && p1 < 250) min = 2;
        if (p1 >= 250 && p1 < 350) min = 3;
        if (p1 >= 350 && p1 < 450) min = 4;
        if (p1 >= 450) min = 5;


А можно синициировать калькуляцию на старте калькулятора? т.е. по-умолчанию мин-шкалы отображаются и радио выбирается чекедом, но res = 0 пока ползун или радио не потревожить.. а до тех пор циферка 0 выводится? можно её как-то задать изначально, чтобы дальнейшими манипуляциями уже изменялась? :)

-----------------------
НЕ ПРОСНУЛСЯ Я! не шумите) туплю пипец)))))))))
в дивеж 0 стоит))))))))))))

рони 11.08.2016 10:45

Цитата:

Сообщение от fos
А можно синициировать калькуляцию на старте калькулятора?

подумать в строке 89 пока не осенит.

рони 11.08.2016 10:58

fos,
порядок медитации строка 47 строка 89

fos 11.08.2016 11:23

Цитата:

Сообщение от рони (Сообщение 425097)
fos,
порядок медитации строка 47 строка 89

да хватит троллить)))))))))))), ну не выспался я, тупорылю еще)

рони 11.08.2016 11:45

fos,
out();
добавить в начало строки 89

fos 11.08.2016 12:46

Цитата:

Сообщение от рони (Сообщение 425099)
fos,
out();
добавить в начало строки 89

Спасибо в очередной раз!)

fos 13.08.2016 03:28

Балин.. сколько в код не всматриваюсь так и не нашел, где можно припилить скрытие amount для слайдеров под чекбоксами...

Т.е. пока галка не стоит рядом с чекбоксом "0" отображается. Его бы как-нить display:none; до момента, пока чекбокс не checked... реально это вообще?

рони 13.08.2016 10:52

Цитата:

Сообщение от fos
реально это вообще?

нужно изменить один символ в строках 28 и 31 + на ~

.opt [type="checkbox"] ~ *{
   display: none;
}
.opt :checked ~ *{
  display:  block;
}

fos 13.08.2016 12:50

Цитата:

Сообщение от рони (Сообщение 425281)
нужно изменить один символ в строках 28 и 31 + на ~

.opt [type="checkbox"] ~ *{
   display: none;
}
.opt :checked ~ *{
  display:  block;
}

Гениально! :)

fos 25.08.2016 21:32

Снова добрый вечер знатокам! :)

В общем новая палка в колесах... пытался кастомизировать на css чекбокс и радио по примеру, но совместить данный пример не могу :( Отдельно работает, а если прикручиваю в див opt...

т.е. инпут делаю вида <input type="checkbox" class="checkbox" id="checkbox-1" /> и после него <label for="checkbox-1">Чекбокс переключается кликом по тексту ...</label>, то ваще чек пропадает из видимости, но если тыкнуть в пустоту - появляется все должным образом... битых часа 3 уже пытаюсь, но только все в недееспособный вид приходит :(

И еще засада - все что после инпута чекбокс пытаюсь написать - все хайдится пока чекбокс не "checked".. т.е. я хочу подписать рядом с чекбоксом что собсно это за галочка, а пока не нажмешь не увидишь :)

рони 25.08.2016 22:00

fos,
:(

добавили label так внесите изменения
.opt [type="checkbox"] + label ~ *{
   display: none;
}
.opt :checked + label ~ *{
  display:  block;
}



<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  body {
  font-family: sans-serif;
  font-size: 12px;
}

.amount{
  font-size: 22px;
  font-weight: bold;
  border:none;
  color: #ff5555;
  background: none;

}
.slider{
   width: 300px;
   margin: 20px;
}
.radio {
display: inline;
}
.opt{
  margin: 30px 0;
}

.opt [type="checkbox"] + label ~ *{
   display: none;
}
.opt :checked + label ~ *{
  display:  block;
}


/* Cначала обозначаем стили для IE8 и более старых версий
т.е. здесь мы немного облагораживаем стандартный чекбокс. */
.checkbox {
  vertical-align: top;
  margin: 0 3px 0 0;
  width: 17px;
  height: 17px;
}
/* Это для всех браузеров, кроме совсем старых, которые не поддерживают
селекторы с плюсом. Показываем, что label кликабелен. */
.checkbox + label {
  cursor: pointer;
}

/* Далее идет оформление чекбокса в современных браузерах, а также IE9 и выше.
Благодаря тому, что старые браузеры не поддерживают селекторы :not и :checked,
в них все нижеследующие стили не сработают. */

/* Прячем оригинальный чекбокс. */
.checkbox:not(checked) {
  position: absolute;
  opacity: 0;
}
.checkbox:not(checked) + label {
  position: relative; /* будем позиционировать псевдочекбокс относительно label */
  padding: 0 0 0 60px; /* оставляем слева от label место под псевдочекбокс */
}
/* Оформление первой части чекбокса в выключенном состоянии (фон). */
.checkbox:not(checked) + label:before {
  content: '';
  position: absolute;
  top: -4px;
  left: 0;
  width: 50px;
  height: 26px;
  border-radius: 13px;
  background: #CDD1DA;
  box-shadow: inset 0 2px 3px rgba(0,0,0,.2);
}
/* Оформление второй части чекбокса в выключенном состоянии (переключатель). */
.checkbox:not(checked) + label:after {
  content: '';
  position: absolute;
  top: -2px;
  left: 2px;
  width: 22px;
  height: 22px;
  border-radius: 10px;
  background: #FFF;
  box-shadow: 0 2px 5px rgba(0,0,0,.3);
  transition: all .2s; /* анимация, чтобы чекбокс переключался плавно */
}
/* Меняем фон чекбокса, когда он включен. */
.checkbox:checked + label:before {
  background: #9FD468;
}
/* Сдвигаем переключатель чекбокса, когда он включен. */
.checkbox:checked + label:after {
  left: 26px;
}
/* Показываем получение фокуса. */
.checkbox:focus + label:before {
  box-shadow: 0 0 0 3px rgba(255,255,0,.5);
}

  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
  <script>
$(function() {
    var data = [
        [50, 500, 25],
        [1, 6, 1],
        [0, 6, 1],
        [0, 500, 5]
    ];

    function out() {
        var x = $('[name="xradio"]:checked').index('[name="xradio"]') || 0;
        x = [30, 50, 100][x];
        var p = $(".opt .amount");
        var p1 = +p[0].value;
        var min = 1;
        if (p1 > 100 && p1 < 175) min = 2;
        /*  */
        $(".slider").eq(1).slider("option", {
            "value": Math.max(p[1].value, min),
            "min": min
        });
        var y = p[1].value * 900;
        var z = p[2].value * 1800;
        var w = p[3].value * 10;
        $(".res").html(p1 * x + y + z + w)
    }
    $(".opt").each(function(i, el) {
        var d = data[i],
            am = $(".amount", el),
            sl = $(".slider", el),
            c = $('[type="checkbox"]',
                el);
        sl.slider({
            min: d[0],
            max: d[1],
            step: d[2],
            slide: function(event, ui) {
                am.val(ui.value)
            },
            change: function(event, ui) {
                am.val(ui.value)
            },
            stop: out
        });
        sl.slider("option", "value", d[0]);
        if (c.length) c.on("click", function() {
            !this.checked && sl.slider("option", "value", 0);
            out()
        })
    });
    $('[name="xradio"]').on("click", out)
});
  </script>
</head>

<body>

<div class="radio">
<label><input type="radio" name="xradio" value="40" checked>RADIO1</label>
<label><input type="radio" name="xradio" value="50">RADIO2</label>
<label><input type="radio" name="xradio" value="100">RADIO3</label></div>


<div class="opt">
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="opt">
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="opt">
  <input type="checkbox" id="checkbox1" class="checkbox">
  <label for="checkbox1">Я переключаю 1 чекбокс</label>
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="opt">
  <input type="checkbox" id="checkbox2" class="checkbox">
  <label for="checkbox2">Я переключаю 2 чекбокс</label>
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="res">0</div>
</body>
</html>

fos 26.08.2016 22:40

Спасибо, Великий мастер! :)

fos 30.08.2016 20:29

Я так и неугомонился с этой затеей.. уже раза 4 нападал на простой казалось бы чекбокс... Но, как всегда - либо не пашет скрипт полностью, либо чекбокс появляется, но в сумму не липнет :(

В общем нужно между чекбоксом:
<label for="checkbox1">Я переключаю 1 чекбокс</label>
и
<label for="checkbox2">Я переключаю 2 чекбокс</label>

Вставить чекбокс
<label for="checkbox3">Я переключаю 3 чекбокс</label>
и придать ему значение (4500), не засовывая в его содержимое слайдеры или еще что-либо.. тупо checked = +4500 к $(".res").html(p1 * x + y + z + w + q) к примеру через var q

пытался делать так:
<div class="opt">
  <input type="checkbox" id="checkbox1" class="checkbox">
  <label for="checkbox1">Я переключаю 1 чекбокс</label>
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>
<div class="opt">
<input type="checkbox" name="xcheck" value="4500" id="checkbox3" class="checkbox">
<label for="checkbox3">Я переключаю чекбокс за 4500</label>
</div>
<div class="opt">
  <input type="checkbox" id="checkbox2" class="checkbox">
  <label for="checkbox2">Я переключаю 2 чекбокс</label>
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>
-------
$(".res").html(p1 * x + y + z + w + q)
------
$(".opt").each(function(i, el) {
        var d = data[i],
         var q = $('[name="xcheck"]:checked').index('[name="xcheck"]') ,
            am = $(".amount", el),
            sl = $(".slider", el),
            c = $('[type="checkbox"]',
                el);
        sl.slider({
            min: d[0],
            max: d[1],
            step: d[2],
            slide: function(event, ui) {
                am.val(ui.value)
            },
            change: function(event, ui) {
                am.val(ui.value)
            },
            stop: out
        });
        sl.slider("option", "value", d[0]);
        if (c.length) c.on("click", function() {
            !this.checked && sl.slider("option", "value", 0);
            out()
        })
    });


колдовал и все ломаю.. в общем как обычно :(

рони 30.08.2016 21:01

fos,
добавлен класс .opt3
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  body {
  font-family: sans-serif;
  font-size: 12px;
}

.amount{
  font-size: 22px;
  font-weight: bold;
  border:none;
  color: #ff5555;
  background: none;

}
.slider{
   width: 300px;
   margin: 20px;
}
.radio {
display: inline;
}
.opt{
  margin: 30px 0;
}

.opt [type="checkbox"] + label ~ *{
   display: none;
}
.opt :checked + label ~ *{
  display:  block;
}

.opt3 [type="checkbox"] + label ~ *{
   display: none;
}
.opt3 :checked + label ~ *{
  display:  block;
}
/* Cначала обозначаем стили для IE8 и более старых версий
т.е. здесь мы немного облагораживаем стандартный чекбокс. */
.checkbox {
  vertical-align: top;
  margin: 0 3px 0 0;
  width: 17px;
  height: 17px;
}
/* Это для всех браузеров, кроме совсем старых, которые не поддерживают
селекторы с плюсом. Показываем, что label кликабелен. */
.checkbox + label {
  cursor: pointer;
}

/* Далее идет оформление чекбокса в современных браузерах, а также IE9 и выше.
Благодаря тому, что старые браузеры не поддерживают селекторы :not и :checked,
в них все нижеследующие стили не сработают. */

/* Прячем оригинальный чекбокс. */
.checkbox:not(checked) {
  position: absolute;
  opacity: 0;
}
.checkbox:not(checked) + label {
  position: relative; /* будем позиционировать псевдочекбокс относительно label */
  padding: 0 0 0 60px; /* оставляем слева от label место под псевдочекбокс */
}
/* Оформление первой части чекбокса в выключенном состоянии (фон). */
.checkbox:not(checked) + label:before {
  content: '';
  position: absolute;
  top: -4px;
  left: 0;
  width: 50px;
  height: 26px;
  border-radius: 13px;
  background: #CDD1DA;
  box-shadow: inset 0 2px 3px rgba(0,0,0,.2);
}
/* Оформление второй части чекбокса в выключенном состоянии (переключатель). */
.checkbox:not(checked) + label:after {
  content: '';
  position: absolute;
  top: -2px;
  left: 2px;
  width: 22px;
  height: 22px;
  border-radius: 10px;
  background: #FFF;
  box-shadow: 0 2px 5px rgba(0,0,0,.3);
  transition: all .2s; /* анимация, чтобы чекбокс переключался плавно */
}
/* Меняем фон чекбокса, когда он включен. */
.checkbox:checked + label:before {
  background: #9FD468;
}
/* Сдвигаем переключатель чекбокса, когда он включен. */
.checkbox:checked + label:after {
  left: 26px;
}
/* Показываем получение фокуса. */
.checkbox:focus + label:before {
  box-shadow: 0 0 0 3px rgba(255,255,0,.5);
}

  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
  <script>
$(function() {
    var data = [
        [50, 500, 25],
        [1, 6, 1],
        [0, 6, 1],
        [0, 500, 5]
    ];

    function out() {
        var x = $('[name="xradio"]:checked').index('[name="xradio"]') || 0;
        x = [30, 50, 100][x];
        var p = $(".opt .amount");
        var p1 = +p[0].value;
        var min = 1;
        if (p1 > 100 && p1 < 175) min = 2;
        /*  */
        $(".slider").eq(1).slider("option", {
            "value": Math.max(p[1].value, min),
            "min": min
        });
        var y = p[1].value * 900;
        var z = p[2].value * 1800;
        var w = p[3].value * 10;
        var q = $('#checkbox3').is(":checked")? 4500 : 0;
        $(".res").html(p1 * x + y + z + w + q)
    }
    $(".opt").each(function(i, el) {
        var d = data[i],
            am = $(".amount", el),
            sl = $(".slider", el),
            c = $('[type="checkbox"]',
                el);
            sl.slider({
            min: d[0],
            max: d[1],
            step: d[2],
            slide: function(event, ui) {
                am.val(ui.value)
            },
            change: function(event, ui) {
                am.val(ui.value)
            },
            stop: out
        });
        sl.slider("option", "value", d[0]);
        if (c.length) c.on("click", function() {
            !this.checked && sl.slider("option", "value", 0);
            out()
        })
    });
    $('[name="xradio"], #checkbox3').on("click", out);
    out()
});
  </script>
</head>

<body>

<div class="radio">
<label><input type="radio" name="xradio" value="40" checked>RADIO1</label>
<label><input type="radio" name="xradio" value="50">RADIO2</label>
<label><input type="radio" name="xradio" value="100">RADIO3</label></div>


<div class="opt">
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="opt">
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="opt">
  <input type="checkbox" id="checkbox1" class="checkbox">
  <label for="checkbox1">Я переключаю 1 чекбокс</label>
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>
<div class="opt3">
  <input type="checkbox" id="checkbox3" class="checkbox">
  <label for="checkbox3">Я переключаю 3 чекбокс</label>
</div>
<div class="opt">
  <input type="checkbox" id="checkbox2" class="checkbox">
  <label for="checkbox2">Я переключаю 2 чекбокс</label>
  <div class="slider"></div>
  <input type="text" class="amount" readonly>
</div>

<div class="res">0</div>
</body>
</html>

fos 30.08.2016 21:15

:blink: :dance: :dance: :thanks: :thanks: :thanks: :thanks: :thanks: :thanks: :thanks: :thanks: :thanks: :thanks:

Слов нет.. Спасибище, профессор!!!!


Часовой пояс GMT +3, время: 06:34.