За последние 24 часа нас посетили 22882 программиста и 1261 робот. Сейчас ищут 702 программиста ...

Как поправить правильный счёт процентов в слайдере?

Тема в разделе "JavaScript и AJAX", создана пользователем Dimon2x, 19 окт 2019.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Сделал простой слайдер, если листать следующий слайдер, то показываются проценты (количество просмотреных слайдов) и отображается с глюками.

    Если пролисать до последнего слайда, покажет 100% и если сделать шаг назад, то останется это же количество и если потом опять нажать вперёд, то покажет не все проценты, при просмотре всех слайдов.

    И если промотать на первый слайд, то покажет 17%, а по идеи должно быть 0.

    Я взял всё количество слайдов "allQuestion", узнал текущий слайд "openSlide.dataset.numberQuestion" и из этого посчитал проценты


    потыкать https://plnkr.co/edit/NtonRXiOYtQi42cw2aD3?p=preview

    HTML:
    1.     .next-question {
    2.         border: 1px solid;
    3.         margin-bottom: 20px;
    4.  
    5.         width: 400px;
    6.         height: 400px;
    7.         text-align: center;
    8.         vertical-align: middle;
    9.     }
    10.  
    11.     .open {
    12.         display: block;
    13.     }
    14.  
    15. <div></div>
    16. <div style="" class="next-question open" data-number-question="1">
    17.     Слайд 1            
    18. </div>
    19.  
    20. <div style="display: none;" class="next-question" data-number-question="2">
    21.     Слайд 2          
    22. </div>
    23.  
    24. <div style="display: none;" class="next-question" data-number-question="3">
    25.     Слайд 3          
    26. </div>
    27.  
    28. <div style="display: none;" class="next-question" data-number-question="4">
    29.     Слайд 4          
    30. </div>
    31.  
    32. <div style="display: none;" class="next-question" data-number-question="5">
    33.     Слайд 5          
    34. </div>
    35.  
    36. <div style="display: none;" class="next-question" data-number-question="6">
    37.     Слайд 6          
    38. </div>
    39. <div></div>
    40.  
    41.  
    42. <button class="quiz-buttons__button_prev">Назад</button>
    43. <button class="quiz-buttons__button_next-text">Вперёд</button>
    44. <br><br>
    45. <span class="percent">0%</span> <span>просмотрено</span>
    46.  
    47.  
    48.  
    49.  
    50.     var allQuestion = document.querySelectorAll('.next-question');
    51.     var percent = document.querySelector('.percent');
    52.     var nextQuestion = document.querySelector('.quiz-buttons__button_next-text');
    53.     var prevQuestion = document.querySelector('.quiz-buttons__button_prev');
    54.  
    55.     var allQuestion = document.querySelectorAll('.next-question');
    56.    
    57.     function closeQuestion() {
    58.         allQuestion.forEach(function (question, i) {
    59.             question.style.display = 'none';
    60.         })
    61.     }
    62.  
    63.     function openClose(element) {
    64.         var openSlide = document.querySelector('.open');
    65.         if (element == 'nextElementSibling') {
    66.             var nextElement = openSlide.nextElementSibling;
    67.         } else {
    68.             var nextElement = openSlide.previousElementSibling;
    69.         }
    70.        
    71.        
    72.         //проценты
    73.         percent.innerHTML = (openSlide.dataset.numberQuestion / allQuestion.length * 100).toFixed() + '%';
    74.  
    75.         numberQuestion = openSlide.dataset.numberQuestion;
    76.        
    77.         if (nextElement.hasAttribute('data-number-question')) {
    78.             closeQuestion();
    79.  
    80.             openSlide.classList.remove('open');
    81.             nextElement.style.display = 'block';
    82.             nextElement.classList.add('open');
    83.         }
    84.  
    85.  
    86.  
    87.     }
    88.  
    89.  
    90.     nextQuestion.addEventListener('click', function (e) {
    91.         openClose('nextElementSibling');
    92.     });
    93.  
    94.  
    95.     prevQuestion.addEventListener('click', function (e) {
    96.         openClose('previousElementSibling');
    97.     });
    98.  
     
  2. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
  3. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    У тебя же указан и задействован первый элемент, data-number-question="1" как активный.

    При загрузке страницы никаких процессов пересчета не происходит, а только при клике на следующий и предыдущий слайд.

    Ты сам написал по дефолту 0%.

    Вернемся к нашим баранам...
    Максимальное число слайдов 6.
    Текущий слайд всегда 1.
    100 * текущий / всего = 16,66

    Как ты хочешь чтобы было 0%, если ты уже видишь первый слайд? Убери тогда его.. надеюсь понял )


    Код (Javascript):
    1.    var allQuestion = document.querySelectorAll('.next-question');
    2.     var percent = document.querySelector('.percent');
    3.     var nextQuestion = document.querySelector('.quiz-buttons__button_next-text');
    4.     var prevQuestion = document.querySelector('.quiz-buttons__button_prev');
    5.  
    6.  
    7.  
    8.     function set_percent ( min, max )
    9.     {
    10.        var min = parseInt( min ),
    11.            max = parseInt( max )
    12.  
    13.        var min = min <= 0 ? 1 : min;
    14.  
    15.        percent.innerHTML = ( 100 * min / max ).toFixed(2) + '%';
    16.     }
    17.  
    18.     //- Дефолт
    19.     set_percent( 1, allQuestion.length );
    20.  
    21.  
    22.     function closeQuestion()
    23.     {
    24.         allQuestion.forEach(function (question, i)
    25.         {
    26.             question.style.display = 'none';
    27.         });
    28.     }
    29.  
    30.     function openClose(element)
    31.     {
    32.         var openSlide = document.querySelector('.open');
    33.  
    34.         if (element == 'nextElementSibling')
    35.         {
    36.             var nextElement = openSlide.nextElementSibling;
    37.         }
    38.         else
    39.         {
    40.             var nextElement = openSlide.previousElementSibling;
    41.         }
    42.  
    43.         if (nextElement.hasAttribute('data-number-question'))
    44.         {
    45.             closeQuestion();
    46.  
    47.             //- Проценты
    48.             set_percent( nextElement.dataset.numberQuestion, allQuestion.length );
    49.  
    50.             openSlide.classList.remove('open');
    51.             nextElement.style.display = 'block';
    52.             nextElement.classList.add('open');
    53.         }
    54.  
    55.  
    56.  
    57.     }
    58.  
    59.  
    60.     nextQuestion.addEventListener('click', function (e)
    61.     {
    62.         openClose('nextElementSibling');
    63.     });
    64.  
    65.  
    66.     prevQuestion.addEventListener('click', function (e)
    67.     {
    68.         openClose('previousElementSibling');
    69.     });
    Проверяй)))
     
    #3 lastdays, 21 окт 2019
    Последнее редактирование: 21 окт 2019
    Dimon2x нравится это.