На прокрутке Анимированная панель умений не работает - PullRequest
0 голосов
/ 05 марта 2020

Я работаю со своим Портфолио, и я застрял в анимированной панели навыков. Я использую JQuery и следовал различным учебникам, но ни один из них не работает в моем проекте. У меня есть рассчитать положение прокрутки раздела и положение прокрутки окна. Я изменил родительский div и дочерний div, но результат один и тот же. Вот мой код

$(document).ready(function() {
  var skillBar = $('.skill-body');
  $(window).scroll(function() {
    var SkillLocation = $("#Education-Skill").offset().top;
    var scrollLocation = $(this).scrollTop();

    skillBar.each(function() {
      if (SkillLocation <= scrollLocation) {
        $(this).find('.inner-skill-bar').animate({
          width: $(this).attr('data-percent')
        }, 2000);
      }
    });
  });
});
.outer-skill-bar {
  height: 26px;
  width: 100%;
  border: 1px solid black;
}

.inner-skill-bar {
  height: 100%;
  width: 0%;
  background: lightcoral;
  border-right: 0.5px solid rgb(146, 136, 136);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container" id="Education-Skill">
  <div class="row">
    <div class="col-md-6 skill" id="skill">
      <div class="all-skill">

        <div class="my-skill">
          <div class="skill-head d-flex">
            <i class="fab fa-html5 fa-lg"></i>
            <p>HTML5</p>
          </div>
          <div class="skill-body d-flex" data-percent="90%">
            <div class="outer-skill-bar">
              <div class="inner-skill-bar"></div>
            </div>
            <div class="percent">
              <p class="skill-value">90%</p>
            </div>
          </div>

        </div>
        <!--my-skill-->
        <div class="my-skill">
          <div class="skill-head d-flex">
            <i class="fab fa-css3-alt fa-lg"></i>
            <p>CSS3</p>
          </div>
          <div class="skill-body d-flex" data-percent="80%">
            <div class="outer-skill-bar">
              <div class="inner-skill-bar"></div>
            </div>
            <div class="percent">
              <p class="skill-value">80%</p>
            </div>
          </div>
        </div>
        <!--my-skill-->

      </div>
      <!--all skill-->
    </div>
    <!--col-->
  </div>
  <!--row-->
</div>
<!--Container-->

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Не используйте scroll прослушиватель событий для такого рода вещей, это плохо влияет на производительность браузера.

Для этого лучше использовать Intersection Observer (IO), это было разработано для таких проблем. С помощью ввода-вывода вы можете реагировать всякий раз, когда элемент HTML пересекается с другим (или с областью просмотра)

Проверьте эту страницу , она показывает, как анимировать элемент, когда он попадает в область просмотра (прокрутите до конца)

Краткий обзор того, что вы должны сделать:

Сначала вы должны создать нового наблюдателя:

var options = {
  rootMargin: '0px',
  threshold: 1.0
}

var observer = new IntersectionObserver(callback, options);

Здесь мы определяем, что как только ваш целевой элемент становится видимым на 100% в области просмотра (порог 1), ваша функция обратного вызова выполняется. Здесь вы можете определить другой процент, 0,5 будет означать, что функция будет выполнена, когда ваш элемент станет видимым на 50%.

Затем вы должны определить, какие элементы наблюдать, в вашем случае это будут counter элементы:

var target = document.querySelector('.counter');
observer.observe(target);

Наконец, вам нужно указать, что должно произойти, когда элемент станет видимым. в окне просмотра, определив функцию обратного вызова:

var callback = function(entries, observer) { 
  entries.forEach(entry => {
    // Each entry describes an intersection change for one observed
    // here you animate the skill bar
  });
};

Если вам требуется поддержка старых браузеров, используйте официальный полифилл из w3 c.

Если вы не нужно снова запускать анимацию, когда элементы снова прокручиваются для просмотра, тогда вы также можете наблюдать элемент , как только он будет анимирован.

0 голосов
/ 05 марта 2020

Вам просто нужно немного уменьшить переменную skillPosition, чтобы она запускала анимацию, когда она появляется на вашем экране. Для этого примера я просто использовал - 100, но вы можете настроить его так, как хотите:

$(document).ready(function(){
	var skillBar = $('.skill-body');
	$(window).scroll(function(){
		var SkillLocation = $("#Education-Skill").offset().top;
		var scrollLocation = $(this).scrollTop();

		skillBar.each(function(){
			if(SkillLocation - 100 <= scrollLocation)
			{
				$(this).find('.inner-skill-bar').animate({width:$(this).attr('data-percent')}, 2000);
			}
		});
	});
});
.vertical-offset {
  width: 100%;
  height: 250px;
}

.outer-skill-bar{
	height: 26px;
	width: 100%;
	border: 1px solid black;
}
.inner-skill-bar{
	height: 100%;
	width: 0%;
	background: lightcoral;
	border-right: 0.5px solid rgb(146, 136, 136);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="vertical-offset">Scroll down...</div>
<div class="container" id="Education-Skill">
		<div class="row">
      <div class="col-md-6 skill" id="skill">
				<div class="all-skill">
        
            <div class="my-skill">
              <div class="skill-head d-flex">
                <i class="fab fa-html5 fa-lg"></i>
                <p>HTML5</p>
              </div>
              <div class="skill-body d-flex" data-percent="90%">
                <div class="outer-skill-bar">
                  <div class="inner-skill-bar"></div>
                </div>
                <div class="percent">
                  <p class="skill-value">90%</p>
                </div>
              </div>
              
            </div> <!--my-skill-->
            <div class="my-skill">
              <div class="skill-head d-flex">
                <i class="fab fa-css3-alt fa-lg"></i>
                <p>CSS3</p>
              </div>
              <div class="skill-body d-flex" data-percent="80%">
                <div class="outer-skill-bar">
                  <div class="inner-skill-bar"></div>
                </div>
                <div class="percent">
                  <p class="skill-value">80%</p>
                </div>
              </div>
            </div> <!--my-skill-->
            
          </div><!--all skill-->
        </div> <!--col-->
     </div> <!--row-->
</div> <!--Container-->
<div class="vertical-offset"></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...