Widziałem kod w Internecie i próbowałem zmienić rozmiar koła zgodnie z rozmiarem ekranu, próbowałem umieścić cały kod JS w instrukcji if i funkcji, którą widziałem na stronie internetowej, zadziałało, ale musi odświeżyć stronę po przeskalowaniu, czy można zmienić rozmiar kółek wraz ze zmianą rozmiaru ekranu? Kod dostałem z: https://codepen.io/Yago/pen/WNbxjYw

/**
 * index.js
 * - All our useful JS goes here, awesome!
 Maruf-Al Bashir Reza
 */


function myFunction(x) {
  if (x.matches) { // If media query matches
    
      $(document).ready(function($) {
  function animateElements() {
    $('.progressbar').each(function() {
      var elementPos = $(this).offset().top;
      var topOfWindow = $(window).scrollTop();
      var percent = $(this).find('.circle').attr('data-percent');
      var percentage = parseInt(percent, 10) / parseInt(100, 10);
      var animate = $(this).data('animate');
      if (elementPos < topOfWindow + $(window).height() - 30 && !animate) {
        $(this).data('animate', true);
        $(this).find('.circle').circleProgress({
          startAngle: -Math.PI / 2,
          value: percent / 100,
          thickness: 4,
          lincCape:'round',
          emptyFill:'#d4d4d4',
          fill: {
            color: '#1F88E9'
          },
            
          size:80
        })
      }
    });
  }

  // Show animated elements
  animateElements();
  $(window).scroll(animateElements);
});

  } else {
    
      $(document).ready(function($) {
    function animateElements() {
    $('.progressbar').each(function() {
      var elementPos = $(this).offset().top;
      var topOfWindow = $(window).scrollTop();
      var percent = $(this).find('.circle').attr('data-percent');
      var percentage = parseInt(percent, 10) / parseInt(100, 10);
      var animate = $(this).data('animate');
      if (elementPos < topOfWindow + $(window).height() - 30 && !animate) {
        $(this).data('animate', true);
        $(this).find('.circle').circleProgress({
          startAngle: -Math.PI / 2,
          value: percent / 100,
          thickness: 4,
          lincCape:'round',
          emptyFill:'#d4d4d4',
          fill: {
            color: '#1F88E9'
          },
            
          size:150
        })
      }
    });
  }

  // Show animated elements
  animateElements();
  $(window).scroll(animateElements);
});

  }
}

var x = window.matchMedia("(max-width: 700px)")
myFunction(x) // Call listener function at run time
x.addListener(myFunction)
/**
 * index.scss
 * - Add any styles you want here!
 */

body {
  background: #f5f5f5;
}

.progressbar {
  display: inline-block;
  width: 100px;
  margin: 25px;
}

.circle {
  width: 100%;
  margin: 0 auto;
  margin-top: 10px;
  display: inline-block;
  position: relative;
  text-align: center;
}

.circle canvas {
  vertical-align: middle;
}

.circle div {
  position: absolute;
  top: 30px;
  left: 0;
  width: 100%;
  text-align: center;
  line-height: 40px;
  font-size: 20px;
}

.circle strong i {
  font-style: normal;
  font-size: 0.6em;
  font-weight: normal;
}

.circle span {
  display: block;
  color: #aaa;
  margin-top: 12px;
}
<!DOCTYPE html>
<html lang="en">

<head>

  <!--  Meta  -->
  <meta charset="UTF-8" />
  <title>My New Pen!</title>

  <!--  Styles  -->
  <link rel="stylesheet" href="styles/index.processed.css">
</head>

<body>
  <h1 style="margin:auto;text-align:center;color:skyblue;">Circle Progressbar When Scroll</h1>
  <div style="width:100%;height:800px;">↓ Scroll down ↓</div>

  <h3>Title (Placeholder)</h3>

  <div class="progressbar" data-animate="false">
    <div class="circle" data-percent="100">
      <div></div>
      <p>Testing</p>
    </div>
  </div>
  <div class="progressbar" data-animate="false">
    <div class="circle" data-percent="30.5">
      <div></div>
      <p>Testing</p>
    </div>
  </div>
  <div class="progressbar" data-animate="false">
    <div class="circle" data-percent="77">
      <div></div>
      <p>Testing</p>
    </div>
  </div>
  <div class="progressbar" data-animate="false">
    <div class="circle" data-percent="49">
      <div></div>
      <p>Testing</p>
    </div>
  </div>
  <div style="width:100%;height:500px;"></div>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
  <script src="https://rawgit.com/kottenator/jquery-circle-progress/1.2.1/dist/circle-progress.js"></script>
  <script src="scripts/index.js"></script>
</body>

</html>
0
Rd_x 3 kwiecień 2020, 15:58

4 odpowiedzi

Najlepsza odpowiedź

Nie będę się koncentrował na jakości, @mplungjan wykonał lepszą robotę z jakością, ale Twoim problemem jest to, że musisz dodać detektor zdarzenia zmiany rozmiaru, a także unieważnić animację true po zakończeniu animacji, aby warunek mógł zostać ponownie uruchomiony zmień rozmiar kręgów, zauważysz, że będzie to ponownie animowane za każdym razem, gdy zmienisz rozmiar strony.

/**
 * index.js
 * - All our useful JS goes here, awesome!
 Maruf-Al Bashir Reza
 */

function myFunction(x) {
  
  let size = 150;
  if (x.matches) {
    // If media query matches
    size = 80;
  }

    function animateElements() {
      $(".progressbar").each(function () {
        var elementPos = $(this).offset().top;
        var topOfWindow = $(window).scrollTop();
        var percent = $(this).find(".circle").attr("data-percent");
        var percentage = parseInt(percent, 10) / parseInt(100, 10);
        var animate = $(this).data("animate");
        if (elementPos < topOfWindow + $(window).height() - 30 && !animate) {
          $(this).data("animate", true);
          $(this)
            .find(".circle")
            .circleProgress({
              startAngle: -Math.PI / 2,
              value: percent / 100,
              thickness: 4,
              lincCape: "round",
              emptyFill: "#d4d4d4",
              fill: {
                color: "#1F88E9",
              },

              size: size,
            });
          $(this).data("animate", false);
        }
      });
    }

    // Show animated elements
    animateElements();
    $(window).scroll(animateElements);
}

var x = window.matchMedia("(max-width: 700px)");
myFunction(x);

$(window).on("resize", function (e) {
  var x = window.matchMedia("(max-width: 700px)");
  myFunction(x); // Call listener function at run time
});
/**
 * index.scss
 * - Add any styles you want here!
 */

body {
  background: #f5f5f5;
}

.progressbar {
  display: inline-block;
  width: 100px;
  margin: 25px;
}

.circle {
  width: 100%;
  margin: 0 auto;
  margin-top: 10px;
  display: inline-block;
  position: relative;
  text-align: center;
}

.circle canvas {
  vertical-align: middle;
}

.circle div {
  position: absolute;
  top: 30px;
  left: 0;
  width: 100%;
  text-align: center;
  line-height: 40px;
  font-size: 20px;
}

.circle strong i {
  font-style: normal;
  font-size: 0.6em;
  font-weight: normal;
}

.circle span {
  display: block;
  color: #aaa;
  margin-top: 12px;
}
<!DOCTYPE html>
<html lang="en">

<head>

  <!--  Meta  -->
  <meta charset="UTF-8" />
  <title>My New Pen!</title>

  <!--  Styles  -->
  <link rel="stylesheet" href="styles/index.processed.css">
</head>

<body>
  <h1 style="margin:auto;text-align:center;color:skyblue;">Circle Progressbar When Scroll</h1>
  <div style="width:100%;height:800px;">↓ Scroll down ↓</div>

  <h3>Title (Placeholder)</h3>

  <div class="progressbar" data-animate="false">
    <div class="circle" data-percent="100">
      <div></div>
      <p>Testing</p>
    </div>
  </div>
  <div class="progressbar" data-animate="false">
    <div class="circle" data-percent="30.5">
      <div></div>
      <p>Testing</p>
    </div>
  </div>
  <div class="progressbar" data-animate="false">
    <div class="circle" data-percent="77">
      <div></div>
      <p>Testing</p>
    </div>
  </div>
  <div class="progressbar" data-animate="false">
    <div class="circle" data-percent="49">
      <div></div>
      <p>Testing</p>
    </div>
  </div>
  <div style="width:100%;height:500px;"></div>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
  <script src="https://rawgit.com/kottenator/jquery-circle-progress/1.2.1/dist/circle-progress.js"></script>
  <script src="scripts/index.js"></script>
</body>

</html>
1
ROOT 3 kwiecień 2020, 13:38

Zmieniaj rozmiar:

Kod pracujący:

function animateElements() {
  $('.progressbar').each(function() {
    var elementPos = $(this).offset().top;
    var topOfWindow = $(window).scrollTop();
    var percent = $(this).find('.circle').attr('data-percent');
    var percentage = parseInt(percent, 10) / parseInt(100, 10);
    var animate = $(this).data('animate');
    if (elementPos < topOfWindow + $(window).height() - 30 && !animate) {
      $(this).data('animate', true);
      $(this).find('.circle').circleProgress({
        startAngle: -Math.PI / 2,
        value: percent / 100,
        thickness: 4,
        lincCape: 'round',
        emptyFill: '#d4d4d4',
        fill: {
          color: '#1F88E9'
        },
        size: $(this).width() / 2
      })
      $(this).data("animate", false); // added this!
    }
  })
}

$(function() {
  // Show animated elements

  $(window).on("resize scroll", animateElements);
});
<h1 style="margin:auto;text-align:center;color:skyblue;">Circle Progressbar When Scroll</h1>
<div style="width:100%;height:800px;">↓ Scroll down ↓</div>

<h3>Title (Placeholder)</h3>

<div class="progressbar" data-animate="false">
  <div class="circle" data-percent="100">
    <div></div>
    <p>Testing</p>
  </div>
</div>
<div class="progressbar" data-animate="false">
  <div class="circle" data-percent="30.5">
    <div></div>
    <p>Testing</p>
  </div>
</div>
<div class="progressbar" data-animate="false">
  <div class="circle" data-percent="77">
    <div></div>
    <p>Testing</p>
  </div>
</div>
<div class="progressbar" data-animate="false">
  <div class="circle" data-percent="49">
    <div></div>
    <p>Testing</p>
  </div>
</div>
<div style="width:100%;height:500px;"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script src="https://rawgit.com/kottenator/jquery-circle-progress/1.2.1/dist/circle-progress.js"></script>
<script src="scripts/index.js"></script>
1
mplungjan 3 kwiecień 2020, 13:53

Możesz dodać eventListener w „resize”:

document.addEventListener("resize", handleResize);

A następnie zmień rozmiar w handleResize. Nie jestem jednak pewien, dlaczego nie używasz zapytań o media CSS zamiast javascript.

0
torquan 3 kwiecień 2020, 13:05

Dodaj to do swojego css

@media only screen and (max-width: 600px) {
  .circle {
    width: 50%;
  }
}
0
jcoleau 3 kwiecień 2020, 13:12