|
Математика в JS
Есть вот такая верстка
<style> body { font-family: monospace; font-size: .8rem; } main { max-width: 720px; margin: 0 auto; } section{ max-width: 480px; margin: 0px auto 0px; } .total_all { margin: 40px 0px 40px 0px; font-size: 2rem; } .summa__1 { margin: 40px 0px 0px 0px; font-size: 1.2rem; } .number_1 { padding: 0px 0px 0px 20px; } .summa__2 { margin: 40px 0px 0px 0px; font-size: 1.2rem; } .number_2 { padding: 0px 0px 0px 20px; } .summa__3 { margin: 40px 0px 0px 0px; font-size: 1.2rem; } .number_3 { padding: 0px 0px 0px 20px; } .summa__4 { margin: 40px 0px 0px 0px; font-size: 1.2rem; } .number_4 { padding: 0px 0px 0px 20px; } </style> <body> <section> <div class="total_all">32 000</div> <div class="summa__1"> <label class="container">8 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_1"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_1"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_1"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_1"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="summa__2"> <label class="container">8 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_2"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_2"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_2"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_2"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="summa__3"> <label class="container">8 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_3"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_3"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_3"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_3"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="summa__4"> <label class="container">8 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_4"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_4"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_4"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number_4"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> </section> <script> const num = parseInt(document.querySelector('.total_all').innerHTML.replace(/\s/g, '')); const summa__1 = parseInt(document.querySelector('.summa__1>.container').innerHTML.replace(/\s/g, '')); const number_1 = parseInt(document.querySelector('.number_1>.container').innerHTML.replace(/\s/g, '')); </script> </body> |
То есть у меня цифры из блока должны плюсоваться или минусоваться в зависимости от того в каком состоянии чекбокс, если он выбран то его плюсуют если не выбран то он минусуется
К примеру есть четыре блока по 2 000 в сумме 8 000 если убрать у кого то чекбокс то будет минус 2 000 И есть четыре блока по 8 000 в сумме 32 000 если убрать чекбок у блока где 8 000 то и от 32 000 сминусуется. |
суммирование выбранного
Сергей Ракипов,
если ещё изменить разметку, то код можно будет сократить. <!DOCTYPE HTML> <html> <head> <title>Untitled</title> </head> <body> <style> body { font-family: monospace; font-size: .8rem; } main { max-width: 720px; margin: 0 auto; } section { max-width: 480px; margin: 0px auto 0px; } .total_all { margin: 40px 0px 40px 0px; font-size: 2rem; } .summa { margin: 40px 0px 0px 0px; font-size: 1.2rem; } .number { padding: 0px 0px 0px 20px; } .summa>.container { margin-left: 20px; } .summa>.container input { margin-left: 15px; } </style> <body> <section> <div class="total_all"></div> <div class="summa"> <label class="container"> <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> </div> <div class="summa"> <label class="container"> <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> </div> <div class="summa"> <label class="container"> <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> </div> <div class="summa"> <label class="container"> <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> <div class="number"> <label class="container">2 000 <input type="checkbox" checked="checked"> <span class="checkmark"></span> </label> </div> </div> </section> <script> const section = document.querySelector('section'); const total = document.querySelector('.total_all'); const digits = n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ") section.addEventListener('change', function() { let num = 0; for (const div of document.querySelectorAll('.summa')) { const checked = div.querySelector('input:first-child').checked; let n = [...div.querySelectorAll('.number :checked')].reduce((n, { previousSibling }) => n + +previousSibling.data.replace(/\s/g, ''), 0) for (const el of div.querySelector(':first-child').childNodes) if (el.nodeType === 3) el.remove() div.querySelector(':first-child').prepend(digits(n)); if (checked) num += n } total.textContent = digits(num); }) let event = new Event("change"); section.dispatchEvent(event); </script> </body> </body> </html> |
Спасибо! От всего сердце спасибо.
Цитата:
|
Цитата:
<span class="num">2000...8000</span> |
рони,
А как сделать что бы когда я 8 000 убираю чекбокс что бы и у нижних 2 000 тоже убирались. А то выглядит так что 8 000 убрал а внизу чекбоксы остались |
Цитата:
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> body { font-family: monospace; font-size: .8rem; } main { max-width: 720px; margin: 0 auto; } section { max-width: 480px; margin: 0px auto 0px; } .total_all { margin: 40px 0px 40px 0px; font-size: 2rem; } .sum label { display: block; width: 150px; text-align: right; } .sum { font-size: 1.2rem; display: flex; flex-direction: column; justify-content: center; } .all .num { color: red; } </style> </head> <body> <section> <div class="total_all"></div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> <div class="sum"> <label class="all"> <span class="num"></span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> <label class="number"> <span class="num">2 000</span> <input type="checkbox" checked="checked"> </label> </div> </section> <script> const section = document.querySelector('section'); const total = document.querySelector('.total_all'); const digits = n => n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ") section.addEventListener('change', function({ target }) { let input = target.closest('input'); if (input) { let all = target.closest('.all input'); if (all) target.closest('.sum').querySelectorAll('.number input').forEach(input => (input.checked = all.checked)) else if (target.checked) target.closest('.sum').querySelector('.all input').checked = true; else target.closest('.sum').querySelector('.all input').checked = target.closest('.sum').querySelector('.number :checked') } let num = 0; for (const div of document.querySelectorAll('.sum')) { const checked = div.querySelector('.all input').checked; let n = [...div.querySelectorAll('.number')].reduce((n, label) => { let input = label.querySelector('input'); let up = +label.querySelector('.num').textContent.replace(/\s/g, ''); return input.checked ? n + up : n } , 0) div.querySelector('.all .num').textContent = digits(n); if (checked) num += n } total.textContent = digits(num); }) let event = new Event("change"); section.dispatchEvent(event); </script> </body> </html> |
рони,
Красота!!! |
рони,
А получается что если мне нужно два section на одной странице оно не будет работать, можно как то сделать что если я два section использую на оной странице они работают не зависимо. можно не section а какой то класс то есть если у них общий класс то это и будут границы работы этого скрипта |
рони,
То есть я могу сделать это, но код просто в два раза увеличится, так как я просто поменяю название переменных и классов. |
Часовой пояс GMT +3, время: 11:18. |
|