ikamal7

infinite scroll shpoify

Feb 26th, 2025
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <infinite-scroll data-next="{{ next_page }}" data-page-size="{{ page_size }}" data-end-text="{{ end_text }}">
  2.   {% if page_size > 1 %}
  3.     <div class="loadingBox">
  4.       <span id="loading_1" class="loadingScroll">&nbsp</span>
  5.       <span id="loading_2" class="loadingScroll">&nbsp</span>
  6.       <span id="loading_3" class="loadingScroll">&nbsp</span>
  7.       <span id="loading_4" class="loadingScroll">&nbsp</span>
  8.       <span id="loading_5" class="loadingScroll">&nbsp</span>
  9.       <span id="loading_6" class="loadingScroll">&nbsp</span>
  10.       <span id="loading_7" class="loadingScroll">&nbsp</span>
  11.       <span id="loading_8" class="loadingScroll">&nbsp</span>
  12.     </div>
  13.   {% endif %}
  14. </infinite-scroll>
  15. <div class="scrollToTopButton">Scroll To Top</div>
  16. <style>
  17.   infinite-scroll {
  18.     position: relative;
  19.     width: 100%;
  20.     font-weight: 600;
  21.     display: flex;
  22.     align-items: center;
  23.     justify-content: center;
  24.     transition: all 0.5s ease;
  25.   }
  26.   .loadingBox {
  27.     position: relative;
  28.     width: 234px;
  29.     height: 28px;
  30.     margin: auto;
  31.   }
  32.   .loadingScroll {
  33.     position: absolute;
  34.     top: 0;
  35.     background-color: rgb(0, 0, 0);
  36.     width: 28px;
  37.     height: 28px;
  38.     animation-name: loading_animation;
  39.     -o-animation-name: loading_animation;
  40.     -ms-animation-name: loading_animation;
  41.     -webkit-animation-name: loading_animation;
  42.     -moz-animation-name: loading_animation;
  43.     animation-duration: 1.5s;
  44.     -o-animation-duration: 1.5s;
  45.     -ms-animation-duration: 1.5s;
  46.     -webkit-animation-duration: 1.5s;
  47.     -moz-animation-duration: 1.5s;
  48.     animation-iteration-count: infinite;
  49.     -o-animation-iteration-count: infinite;
  50.     -ms-animation-iteration-count: infinite;
  51.     -webkit-animation-iteration-count: infinite;
  52.     -moz-animation-iteration-count: infinite;
  53.     animation-direction: normal;
  54.     -o-animation-direction: normal;
  55.     -ms-animation-direction: normal;
  56.     -webkit-animation-direction: normal;
  57.     -moz-animation-direction: normal;
  58.     transform: scale(0.3);
  59.     -o-transform: scale(0.3);
  60.     -ms-transform: scale(0.3);
  61.     -webkit-transform: scale(0.3);
  62.     -moz-transform: scale(0.3);
  63.   }
  64.   .scrollToTopButton {
  65.     position: fixed;
  66.     bottom: 20px;
  67.     right: 149px;
  68.     background: #ececec;
  69.     padding: 5px 10px;
  70.     z-index: 1;
  71.     cursor: pointer;
  72.     border-radius: 5px;
  73.   }
  74.   #loading_1 {
  75.     left: 0;
  76.     animation-delay: 0.6s;
  77.     -o-animation-delay: 0.6s;
  78.     -ms-animation-delay: 0.6s;
  79.     -webkit-animation-delay: 0.6s;
  80.     -moz-animation-delay: 0.6s;
  81.   }
  82.   #loading_2 {
  83.     left: 29px;
  84.     animation-delay: 0.75s;
  85.     -o-animation-delay: 0.75s;
  86.     -ms-animation-delay: 0.75s;
  87.     -webkit-animation-delay: 0.75s;
  88.     -moz-animation-delay: 0.75s;
  89.   }
  90.   #loading_3 {
  91.     left: 58px;
  92.     animation-delay: 0.9s;
  93.     -o-animation-delay: 0.9s;
  94.     -ms-animation-delay: 0.9s;
  95.     -webkit-animation-delay: 0.9s;
  96.     -moz-animation-delay: 0.9s;
  97.   }
  98.   #loading_4 {
  99.     left: 88px;
  100.     animation-delay: 1.05s;
  101.     -o-animation-delay: 1.05s;
  102.     -ms-animation-delay: 1.05s;
  103.     -webkit-animation-delay: 1.05s;
  104.     -moz-animation-delay: 1.05s;
  105.   }
  106.   #loading_5 {
  107.     left: 117px;
  108.     animation-delay: 1.2s;
  109.     -o-animation-delay: 1.2s;
  110.     -ms-animation-delay: 1.2s;
  111.     -webkit-animation-delay: 1.2s;
  112.     -moz-animation-delay: 1.2s;
  113.   }
  114.   #loading_6 {
  115.     left: 146px;
  116.     animation-delay: 1.35s;
  117.     -o-animation-delay: 1.35s;
  118.     -ms-animation-delay: 1.35s;
  119.     -webkit-animation-delay: 1.35s;
  120.     -moz-animation-delay: 1.35s;
  121.   }
  122.   #loading_7 {
  123.     left: 175px;
  124.     animation-delay: 1.5s;
  125.     -o-animation-delay: 1.5s;
  126.     -ms-animation-delay: 1.5s;
  127.     -webkit-animation-delay: 1.5s;
  128.     -moz-animation-delay: 1.5s;
  129.   }
  130.   #loading_8 {
  131.     left: 205px;
  132.     animation-delay: 1.64s;
  133.     -o-animation-delay: 1.64s;
  134.     -ms-animation-delay: 1.64s;
  135.     -webkit-animation-delay: 1.64s;
  136.     -moz-animation-delay: 1.64s;
  137.   }
  138.  
  139.   /* Pristege */
  140.   [class^="pagination"], [class^="Pagination"], .pagination {
  141.     display: none !important;
  142.   }
  143.  
  144.   .js .features--show-element-staggering .ProductList--grid div.ProductItem {
  145.     visibility: visible;
  146.   }
  147.  
  148.   .js .product-card[reveal-on-scroll="true"] {
  149.     opacity: 1;
  150.   }
  151.  
  152.   @keyframes loading_animation {
  153.     0% {
  154.       transform: scale(1);
  155.       background-color: rgb(0, 0, 0);
  156.     }
  157.     100% {
  158.       transform: scale(0.3);
  159.       background-color: rgb(255, 255, 255);
  160.     }
  161.   }
  162.   @-o-keyframes loading_animation {
  163.     0% {
  164.       -o-transform: scale(1);
  165.       background-color: rgb(0, 0, 0);
  166.     }
  167.     100% {
  168.       -o-transform: scale(0.3);
  169.       background-color: rgb(255, 255, 255);
  170.     }
  171.   }
  172.   @-ms-keyframes loading_animation {
  173.     0% {
  174.       -ms-transform: scale(1);
  175.       background-color: rgb(0, 0, 0);
  176.     }
  177.     100% {
  178.       -ms-transform: scale(0.3);
  179.       background-color: rgb(255, 255, 255);
  180.     }
  181.   }
  182.   @-webkit-keyframes loading_animation {
  183.     0% {
  184.       -webkit-transform: scale(1);
  185.       background-color: rgb(0, 0, 0);
  186.     }
  187.     100% {
  188.       -webkit-transform: scale(0.3);
  189.       background-color: rgb(255, 255, 255);
  190.     }
  191.   }
  192.   @-moz-keyframes loading_animation {
  193.     0% {
  194.       -moz-transform: scale(1);
  195.       background-color: rgb(0, 0, 0);
  196.     }
  197.     100% {
  198.       -moz-transform: scale(0.3);
  199.       background-color: rgb(255, 255, 255);
  200.     }
  201.   }
  202. </style>
  203. <script>
  204.   class InfiniteScroll extends HTMLElement {
  205.   constructor() {
  206.     super();
  207.     this.initGrid();
  208.     this.init();
  209.     this.page = 1;
  210.     this.scrollToTopBtn = document.querySelector(".scrollToTopButton");
  211.     this.scrollToTopBtn.addEventListener(
  212.       "click",
  213.       this.scrollToTopFx.bind(this)
  214.     );
  215.   }
  216.  
  217.   initGrid() {
  218.     const gridOptions = [".ProductListWrapper", "#main-collection-product-grid", "#product-grid", ".product-list"];
  219.     for (let gridName of gridOptions) {
  220.       let grid = document.querySelector(gridName);
  221.       if (grid) {
  222.         this.gridName = gridName;
  223.         this.gridContainer = grid;
  224.         break;
  225.       }
  226.     }
  227.   }
  228.  
  229.   init() {
  230.     const observer = new IntersectionObserver(this.revealItem.bind(this), {
  231.       root: null,
  232.       threshold: 0.05,
  233.     });
  234.     observer.observe(this);
  235.   }
  236.  
  237.   fetchNextPage(e) {
  238.     if (e <= this.dataset.pageSize) {
  239.       const t = `{{ shop.url }}/${this.dataset.next}`;
  240.       const i = new URL(t);
  241.       i.searchParams.set("page", e);
  242.       const r = i.href;
  243.       fetch(`${r}`, { method: "GET", headers: { "Content-Type": "text/html" } })
  244.         .then((e) => e.text())
  245.         .then((e) => {
  246.           const t = new DOMParser().parseFromString(e, "text/html");
  247.           const i = t.querySelector(this.gridName).innerHTML;
  248.           this.gridContainer.insertAdjacentHTML("beforeend", i);        
  249.         })
  250.         .catch((e) => {
  251.           console.error("Error:", e);
  252.         });
  253.     }
  254.     if (e == this.dataset.pageSize) {
  255.       this.innerHTML = `<h2>${this.dataset.endText}</h2>`;
  256.     }
  257.   }
  258.   revealItem(e, t) {
  259.     const [i] = e;
  260.     if (!i.isIntersecting) return;
  261.     if (i.target) {
  262.       this.page++;
  263.       this.fetchNextPage(this.page);
  264.     }
  265.     if (this.page == this.dataset.pageSize) {
  266.       t.unobserve(i.target);
  267.     }
  268.   }
  269.   scrollToTopFx(e) {
  270.     document.body.scrollTop = 0;
  271.     document.documentElement.scrollTop = 0;
  272.     e.currentTarget.style.display = "none";
  273.   }
  274. }
  275. customElements.define("infinite-scroll", InfiniteScroll);
  276. </script>
Add Comment
Please, Sign In to add comment