Пример:
(вид немного отличается из-за стилей сайта)
HTML:
1 2 3 4 5 |
<div class="quantity_inner"> <button class="bt_minus">-</button> <input type="text" class="quantity" value="1" data-max-count="20"> <button class="bt_plus">+</button> </div> |
Где атрибут data-max-count
- максимальное значение.
jQuery:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// Убавляем кол-во по клику $('.quantity_inner .bt_minus').click(function() { let $input = $(this).parent().find('.quantity'); let count = parseInt($input.val()) - 1; count = count < 1 ? 1 : count; $input.val(count); }); // Прибавляем кол-во по клику $('.quantity_inner .bt_plus').click(function() { let $input = $(this).parent().find('.quantity'); let count = parseInt($input.val()) + 1; count = count > parseInt($input.data('max-count')) ? parseInt($input.data('max-count')) : count; $input.val(parseInt(count)); }); // Убираем все лишнее и невозможное при изменении поля $('.quantity_inner .quantity').bind("change keyup input click", function() { if (this.value.match(/[^0-9]/g)) { this.value = this.value.replace(/[^0-9]/g, ''); } if (this.value == "") { this.value = 1; } if (this.value > parseInt($(this).data('max-count'))) { this.value = parseInt($(this).data('max-count')); } }); |
Скрипт работает таким образом, что в текстовое поле input
можно вводить только цифры. Если введено некорректное значение или оно отсутствует, то в поле вставляется единица. Если введено значение больше максимального, то в поле ставится максимально возможное.
Оформление:
Во всех примерах используется jQuery приведенный выше
1 2 3 4 5 6 7 8 9 |
<div class="quantity_inner"> <button class="bt_minus"> <svg viewBox="0 0 24 24"><line x1="5" y1="12" x2="19" y2="12"></line></svg> </button> <input type="text" value="1" size="2" class="quantity" data-max-count="20" /> <button class="bt_plus"> <svg viewBox="0 0 24 24"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg> </button> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
.quantity_inner * { box-sizing: border-box; } .quantity_inner { display: flex; justify-content: center; } .quantity_inner .bt_minus, .quantity_inner .bt_plus, .quantity_inner .quantity { color: #BFE2FF; height: 40px; width: 40px; padding: 0; margin: 10px 2px; border-radius: 10px; border: 4px solid #BFE2FF; background: #337AB7; cursor: pointer; outline: 0; box-shadow: 0 2px 5px rgba(0,0,0,0.2), 0 4px 6px rgba(0,0,0,0.2); } .quantity_inner .quantity { width: 50px; text-align: center; font-size: 22px; color: #FFF; font-family:Menlo,Monaco,Consolas,"Courier New",monospace; } .quantity_inner .bt_minus svg, .quantity_inner .bt_plus svg { stroke: #BFE2FF; stroke-width: 4; transition: 0.5s; margin: 4px; } .quantity_inner .bt_minus:hover svg, .quantity_inner .bt_plus:hover svg { stroke: #FFF; } |
1 2 3 4 5 6 7 8 9 |
<div class="quantity_inner"> <button class="bt_minus"> <svg viewBox="0 0 24 24"><line x1="5" y1="12" x2="19" y2="12"></line></svg> </button> <input type="text" value="1" size="2" class="quantity" data-max-count="20" /> <button class="bt_plus"> <svg viewBox="0 0 24 24"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg> </button> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
.quantity_inner * { box-sizing: border-box; } .quantity_inner { display: inline-flex; border-radius: 26px; border: 4px solid #337AB7; } .quantity_inner .bt_minus, .quantity_inner .bt_plus, .quantity_inner .quantity { height: 40px; width: 40px; padding: 0; border: 0; margin: 0; background: transparent; cursor: pointer; outline: 0; } .quantity_inner .quantity { width: 50px; text-align: center; font-size: 30px; font-weight: bold; color: #000; font-family: Menlo,Monaco,Consolas,"Courier New",monospace; } .quantity_inner .bt_minus svg, .quantity_inner .bt_plus svg { stroke: #337AB7; stroke-width: 4; transition: 0.5s; margin: 10px; } .quantity_inner .bt_minus:hover svg, .quantity_inner .bt_plus:hover svg { stroke: #000; } |
Предыдущий вариант с кнопкой купить:
1 2 3 4 5 6 7 8 9 10 11 12 |
<div class="quantity_inner"> <button class="bt_minus"> <svg viewBox="0 0 24 24" class="feather feather-minus"><line x1="5" y1="12" x2="19" y2="12"></line></svg> </button> <input type="text" value="1" size="2" class="quantity" data-max-count="20" /> <button class="bt_plus"> <svg viewBox="0 0 24 24" class="feather feather-plus"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg> </button> <button class="bt_buy"> <svg viewBox="0 0 24 24"><circle cx="9" cy="21" r="1"></circle><circle cx="20" cy="21" r="1"></circle><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path></svg> </button> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
.quantity_inner * { box-sizing: border-box; } .quantity_inner { display: inline-flex; border-radius: 26px; border: 4px solid #337AB7; position: relative; background: #FFF; z-index: 1; } .quantity_inner .bt_minus, .quantity_inner .bt_plus, .quantity_inner .bt_buy, .quantity_inner .quantity { height: 40px; width: 40px; padding: 0; border: 0; margin: 0; background: #FFF; cursor: pointer; outline: 0; border-radius: 26px; } .quantity_inner .bt_buy { background: #337AB7; width: 90px; height: 48px; position: absolute; right: -70px; top: -4px; z-index: -1; border-radius: 0 26px 26px 0; border: 4px solid #337AB7; } .quantity_inner .quantity { width: 60px; text-align: center; font-size: 30px; font-weight: bold; color: #000; font-family: Menlo,Monaco,Consolas,"Courier New",monospace; } .quantity_inner .bt_minus svg, .quantity_inner .bt_plus svg, .quantity_inner .bt_buy svg { stroke: #337AB7; stroke-width: 4; transition: 0.5s; margin: 10px; fill: none; height: 20px; width: 20px; } .quantity_inner .bt_buy svg { stroke: #BFE2FF; position: relative; left: 6px; } .quantity_inner .bt_buy:hover svg { stroke: #FFF; } .quantity_inner .bt_minus:hover svg, .quantity_inner .bt_plus:hover svg { stroke: #000; } |
1 2 3 4 5 6 7 8 9 |
<div class="quantity_inner"> <input type="text" value="1" size="2" class="quantity" data-max-count="20" /> <button class="bt_plus"> <svg viewBox="0 0 24 24"><polyline points="18 15 12 9 6 15"></polyline></svg> </button> <button class="bt_minus"> <svg viewBox="0 0 24 24"><polyline points="6 9 12 15 18 9"></polyline></svg> </button> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
.quantity_inner * { box-sizing: border-box; } .quantity_inner { display: inline-flex; border: 4px solid #337AB7; position: relative; } .quantity_inner .bt_minus, .quantity_inner .bt_plus, .quantity_inner .quantity { height: 40px; width: 40px; padding: 0; border: 0; margin: 0; background: transparent; cursor: pointer; outline: 0; } .quantity_inner .bt_minus, .quantity_inner .bt_plus { position: absolute; height: 20px; width: 20px; right: 10px; } .quantity_inner .bt_plus { top: 2px; } .quantity_inner .bt_minus { bottom: 2px; } .quantity_inner .quantity { width: 60px; text-align: center; font-size: 30px; font-weight: bold; color: #000; margin-right: 30px; font-family: Menlo,Monaco,Consolas,"Courier New",monospace; } .quantity_inner .bt_minus svg, .quantity_inner .bt_plus svg { stroke: #337AB7; stroke-width: 4; transition: 0.5s; fill: none; } .quantity_inner .bt_minus:hover svg, .quantity_inner .bt_plus:hover svg { stroke: #000; } |
1 2 3 4 5 6 7 8 9 10 11 12 |
<div class="quantity_inner"> <input type="text" value="1" size="2" class="quantity" data-max-count="20" /> <button class="bt_plus"> <svg viewBox="0 0 24 24"><polyline points="18 15 12 9 6 15"></polyline></svg> </button> <button class="bt_minus"> <svg viewBox="0 0 24 24"><polyline points="6 9 12 15 18 9"></polyline></svg> </button> <button class="bt_buy"> <svg viewBox="0 0 24 24"><circle cx="9" cy="21" r="1"></circle><circle cx="20" cy="21" r="1"></circle><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path></svg> </button> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
.quantity_inner * { box-sizing: border-box; } .quantity_inner { display: inline-flex; border: 6px solid #BFE2FF; position: relative; border-radius: 50% 0; height: 100px; width: 120px; background: #FFF; margin-top: 30px; } .quantity_inner .bt_minus, .quantity_inner .bt_plus, .quantity_inner .quantity { height: 40px; width: 40px; padding: 0; border: 0; margin: 0; background: transparent; cursor: pointer; outline: 0; position: absolute; } .quantity_inner .bt_minus, .quantity_inner .bt_plus { height: 40px; width: 40px; right: 6px; top: 0; } .quantity_inner .bt_minus { top: 28px; } .quantity_inner .bt_buy { position: absolute; background: #337AB7; padding: 0; border: 6px solid #BFE2FF; top: -30px; left: -20px; border-radius: 50%; height: 70px; width: 70px; outline: 0; transition: 0.5s; } .quantity_inner .bt_buy:hover { cursor: pointer; border: 6px solid #337AB7; } .quantity_inner .bt_buy:hover svg { stroke: #FFF; } .quantity_inner .quantity { width: 60px; bottom: 6px; left: 6px; text-align: center; font-size: 42px; font-weight: bold; color: #000; margin-right: 30px; font-family: Menlo,Monaco,Consolas,"Courier New",monospace; } .quantity_inner .bt_minus svg, .quantity_inner .bt_plus svg { stroke: #337AB7; stroke-width: 2; transition: 0.5s; fill: none; } .quantity_inner .bt_buy svg { stroke: #BFE2FF; stroke-width: 3; transition: 0.5s; fill: none; width: 26px; height: 26БзЮБ/зЮpx; } .quantity_inner .bt_minus:hover svg, .quantity_inner .bt_plus:hover svg { stroke: #000; } |
Доброго дня с наступающим всех. Что подшаманить чтобы quantity выводилось в коде html/ Допустим догнал до 10 то 10 ка и отображается на странице. Убавил 9 стало и т.д. Или вообще подскажите как натянуть на корзину данный контент.
Понятно с учетом того что корзина обрабатывает в последствии сама.
Вас тоже с наступающим!
$input.val(count); вставляет значение в поле инпут.
Чтобы вставить его тег my-quantity, нужно например:
Если таких тегов много (как полей в примере), то по аналогии через this и find
Спасибо будем пробовать!
а как полученный результат (количество) дальше для обработки php передать?
Как обычно, у нас есть input и его value
может кому понадобится, я переписал jquery код в нативный js
Спасибо, думаю многим пригодится!
Спасибо друг!
Спасибо большое! Отлично вышло. Немного подшаманил под свой проект css и отправил в форму результат. Как там и было
Подскажите, а как можно реализовать? допустим мы дошли до цифры 3 и заново начать с цифры 1, грубо говоря зациклить ввод
Натянул на калькулятор так или иначе ваш же ползунок. https://atuin.ru/blog/oformlenie-polzunka-input-typerange/
Однако как поля для ввода 1.2 и 1.3 здесь сделать так и не понял.
Спасибо за крутой сайт! А как сделать чтобы 10-е значения можно было дописывать?
Не совсем понял, сейчас максимум 20, это стоит в атрибуте data-max-count
Ох я уж и забыл что спрашивал извиняюсь) Опять коснулось, вот такие мы... Допустим для калькулятора площади какой нибудь где вводить нужно 1,5 метра.
А если в инпуте по умолчанию стоит 0. При нажатии на + появляется 1, а после нажимаем на - должен вернуться 0. Что в скрипте нужно поменять?
1 заменить на 0
Красота, но только что получил *** от ментора за подобный подход
За какой подход?
// Убираем все лишнее и невозможное при изменении поля
Лишнее. Достаточно <input disabled...
А если нужно ввести 100 штук?
у кого +,- отправляют форму добавьте к <button> type="button"