List Smooth Autoscroll

This plugin has a new version. You can check it here

  • https://member.beaverhero.com/list-smooth-autoscroll-v2/
  • pass: 0403

List smooth autoscroll 1

List smooth autoscroll 2

#1. Install code

First, click Gear icon on Page where you want to use List Smooth Autoscroll

List smooth autoscroll 3

Click Advanced > Paste this code

<!-- @tuanphan - Smooth Autoscroll List -->
<style>
:root {
    --tp-slide-width: 300px;
    --tp-media-aspect-ratio: 3 / 4;
    --tp-gap: 40px;
    --tp-animation-duration: 90s;
    --tp-border-radius: 8px;
    --tp-title-size: 1.2rem;
    --tp-description-size: 0.9rem;
    --tp-button-size: 0.8rem;
    --tp-button-color: #2a3517;
    --tp-container-padding: 2rem 0;
    --tp-content-padding-top: 15px;
    --tp-content-align: left;
    --tp-title-margin: 0 0 4px 0;
    --tp-description-margin: 0 0 10px 0;
    --tp-button-padding: 10px 20px;
    --tp-button-border-radius: 30px;
    --tp-button-border: 2px;
}
section[id*="smooth-autoscroll-list"]{padding-left:0!important;padding-right:0!important}body:not(.sqs-edit-mode-active) section[id*="smooth-autoscroll-list"] .user-items-list{display:none!important}.tp-slider-container{width:100%;overflow:hidden;padding:var(--tp-container-padding);box-sizing:border-box;-webkit-mask-image:linear-gradient(to right,transparent,black 5%,black 95%,transparent);mask-image:linear-gradient(to right,transparent,black 5%,black 95%,transparent)}.tp-slider-track{display:flex;gap:var(--tp-gap);padding-left:var(--tp-gap);box-sizing:content-box;animation:tp-scroll var(--tp-animation-duration) linear infinite;width:fit-content}.tp-slider-container:hover .tp-slider-track{animation-play-state:paused}@keyframes tp-scroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}.tp-slide{width:var(--tp-slide-width);flex-shrink:0;display:flex;flex-direction:column}.tp-slide-media{width:100%;aspect-ratio:var(--tp-media-aspect-ratio)}.tp-slide-media img{width:100%;height:100%;object-fit:cover;border-radius:var(--tp-border-radius);display:block}.tp-slide-content{padding-top:var(--tp-content-padding-top);text-align:var(--tp-content-align)}.tp-title{font-size:var(--tp-title-size);margin:var(--tp-title-margin)}.tp-description{font-size:var(--tp-description-size);margin:var(--tp-description-margin);white-space:pre-wrap}.tp-button{display:inline-block;font-size:var(--tp-button-size);padding:var(--tp-button-padding);background-color:#fff0;color:var(--tp-button-color);border:var(--tp-button-border) solid var(--tp-button-color);border-radius:var(--tp-button-border-radius);text-decoration:none;transition:background-color 0.2s ease,color 0.2s ease;text-transform:uppercase}.tp-button:hover{background-color:var(--tp-button-color)}
</style>
<script>
document.addEventListener('DOMContentLoaded',function(){const allListSections=document.querySelectorAll('section[id*="smooth-autoscroll-list"]');allListSections.forEach(listSection=>{const slidesData=[];listSection.querySelectorAll('.list-item').forEach(item=>{const img=item.querySelector('img.list-image');const title=item.querySelector('.list-item-content__title');const descriptionContainer=item.querySelector('.list-item-content__description');const button=item.querySelector('a.list-item-content__button');if(title&&descriptionContainer&&button){const allParagraphs=descriptionContainer.querySelectorAll('p');let descriptionText='';allParagraphs.forEach((p,index)=>{descriptionText+=p.textContent.trim();if(index<allParagraphs.length-1){descriptionText+='\n\n'}});const slideData={titleText:title.textContent.trim(),descriptionText:descriptionText,buttonText:button.textContent.trim(),buttonLink:button.getAttribute('href')||'#'};if(img){slideData.src=img.getAttribute('data-src');slideData.alt=img.alt||title.textContent.trim()}
slidesData.push(slideData)}});if(slidesData.length===0)return;const contentWrapper=listSection.querySelector('.content-wrapper');if(!contentWrapper)return;contentWrapper.style.maxWidth='none';const originalList=contentWrapper.querySelector('.user-items-list');if(originalList){originalList.style.display='none'}
const sliderContainer=document.createElement('div');sliderContainer.className='tp-slider-container';const sliderTrack=document.createElement('div');sliderTrack.className='tp-slider-track';const createSlideElement=(data)=>{const slide=document.createElement('div');slide.className='tp-slide';if(data.src){const media=document.createElement('div');media.className='tp-slide-media';const image=document.createElement('img');image.src=data.src;image.alt=data.alt;media.appendChild(image);slide.appendChild(media)}
const content=document.createElement('div');content.className='tp-slide-content';const titleEl=document.createElement('h3');titleEl.className='tp-title';titleEl.textContent=data.titleText;const descriptionEl=document.createElement('p');descriptionEl.className='tp-description';descriptionEl.textContent=data.descriptionText;const buttonEl=document.createElement('a');buttonEl.className='tp-button';buttonEl.href=data.buttonLink;buttonEl.textContent=data.buttonText;content.appendChild(titleEl);content.appendChild(descriptionEl);content.appendChild(buttonEl);slide.appendChild(content);return slide};slidesData.forEach(data=>sliderTrack.appendChild(createSlideElement(data)));slidesData.forEach(data=>sliderTrack.appendChild(createSlideElement(data)));slidesData.forEach(data=>sliderTrack.appendChild(createSlideElement(data)));slidesData.forEach(data=>sliderTrack.appendChild(createSlideElement(data)));slidesData.forEach(data=>sliderTrack.appendChild(createSlideElement(data)));slidesData.forEach(data=>sliderTrack.appendChild(createSlideElement(data)));slidesData.forEach(data=>sliderTrack.appendChild(createSlideElement(data)));slidesData.forEach(data=>sliderTrack.appendChild(createSlideElement(data)));slidesData.forEach(data=>sliderTrack.appendChild(createSlideElement(data)));slidesData.forEach(data=>sliderTrack.appendChild(createSlideElement(data)));sliderContainer.appendChild(sliderTrack);const contentDiv=listSection.querySelector('.content');if(contentDiv){contentDiv.appendChild(sliderContainer)}else{contentWrapper.appendChild(sliderContainer)}})})
</script>

List smooth autoscroll 4

#2. Usage

#2.1. First, add a Section > Choose People > Choose Section with (i) icon

List smooth autoscroll 5

#2.2. Make sure you choose Simple List

List smooth autoscroll 6

#2.3. Next, hover on top right of section > Click Edit Section

List smooth autoscroll 7

Click Format > Enter this text: smooth-autoscroll-list

smooth-autoscroll-list

List smooth autoscroll 8

#2.4. Make sure these options always enabled. With Image, you can enable or disable, depending on your needs.

Note:

  • You can enter nothing on title, body, button, but must enable these options
  • If you enabled these, and small button still appears, you can see #3.3 code

List auto smooth scroll fix

#3. Customize

All style options here

List smooth autoscroll 9

#3.1. To remove button, you can use this under plugin code

<style>
a.tp-button {
    display: none !important;
}
</style>

#3.2. To make image show original size, use this under plugin code

<style>
.tp-slide-media img {
    object-fit: contain !important;
}
</style>

#3.3. If you see this small button under text

List auto smooth scroll fix2

You can use this under main code

<style>
section[id*="smooth-autoscroll-list"] .tp-button[href="#"] {
    display: none;
}
</style>

List auto smooth scroll fix3

#3.4. Mobile: Tap (once) > Pause scroll > After 3 seconds > Scroll again

Add this under main code

<!-- Mobile Tap - Pause - Scroll after X seconds -->
<script>
document.addEventListener("DOMContentLoaded",(function(){setTimeout((function(){document.querySelectorAll(".tp-slider-track").forEach((function(t){let e=null;function n(){t.style.animationPlayState="running"}function i(){e&&clearTimeout(e),t.style.animationPlayState="paused",e=setTimeout((function(){n()}),3e3)}t.addEventListener("touchstart",(function(t){i()}),{passive:!0}),t.addEventListener("click",(function(t){i()})),t.addEventListener("touchmove",(function(t){e&&(clearTimeout(e),e=setTimeout((function(){n()}),3e3))}),{passive:!0})}))}),100)}));
</script>

#3.5. Mobile: Tap (once) > Pause Scroll > Tap (twice) > Scroll again

You will need to replace all code in #1 to this new code

<!-- @tuanphan - Smooth Autoscroll List -->
<style>
:root {
    --tp-slide-width: 300px;
    --tp-media-aspect-ratio: 3 / 4;
    --tp-gap: 40px;
    --tp-animation-duration: 90s;
    --tp-border-radius: 8px;
    --tp-title-size: 1.2rem;
    --tp-description-size: 0.9rem;
    --tp-button-size: 0.8rem;
    --tp-button-color: #2a3517;
    --tp-container-padding: 2rem 0;
    --tp-content-padding-top: 15px;
    --tp-content-align: left;
    --tp-title-margin: 0 0 4px 0;
    --tp-description-margin: 0 0 10px 0;
    --tp-button-padding: 10px 20px;
    --tp-button-border-radius: 30px;
    --tp-button-border: 2px;
}
section[id*="smooth-autoscroll-list"]{padding-left:0!important;padding-right:0!important}body:not(.sqs-edit-mode-active) section[id*="smooth-autoscroll-list"] .user-items-list{display:none!important}.tp-slider-container{width:100%;overflow:hidden;padding:var(--tp-container-padding);box-sizing:border-box;-webkit-mask-image:linear-gradient(to right,transparent,black 5%,black 95%,transparent);mask-image:linear-gradient(to right,transparent,black 5%,black 95%,transparent)}.tp-slider-track{display:flex;gap:var(--tp-gap);padding-left:var(--tp-gap);box-sizing:content-box;animation:tp-scroll var(--tp-animation-duration) linear infinite;width:fit-content}.tp-slider-track.tp-paused{animation-play-state:paused!important}@keyframes tp-scroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}.tp-slide{width:var(--tp-slide-width);flex-shrink:0;display:flex;flex-direction:column}.tp-slide-media{width:100%;aspect-ratio:var(--tp-media-aspect-ratio)}.tp-slide-media img{width:100%;height:100%;object-fit:cover;border-radius:var(--tp-border-radius);display:block}.tp-slide-content{padding-top:var(--tp-content-padding-top);text-align:var(--tp-content-align)}.tp-title{font-size:var(--tp-title-size);margin:var(--tp-title-margin)}.tp-description{font-size:var(--tp-description-size);margin:var(--tp-description-margin);white-space:pre-wrap}.tp-button{display:inline-block;font-size:var(--tp-button-size);padding:var(--tp-button-padding);background-color:#fff0;color:var(--tp-button-color);border:var(--tp-button-border) solid var(--tp-button-color);border-radius:var(--tp-button-border-radius);text-decoration:none;transition:background-color 0.2s ease,color 0.2s ease;text-transform:uppercase}.tp-button:hover{background-color:var(--tp-button-color)}@media(hover:hover){.tp-slider-container:hover .tp-slider-track:not(.tp-paused){animation-play-state:paused}}
</style>
<script>
document.addEventListener('DOMContentLoaded',function(){const allListSections=document.querySelectorAll('section[id*="smooth-autoscroll-list"]');allListSections.forEach(listSection=>{const slidesData=[];listSection.querySelectorAll('.list-item').forEach(item=>{const img=item.querySelector('img.list-image');const title=item.querySelector('.list-item-content__title');const descriptionContainer=item.querySelector('.list-item-content__description');const button=item.querySelector('a.list-item-content__button');if(title&&descriptionContainer&&button){const allParagraphs=descriptionContainer.querySelectorAll('p');let descriptionText='';allParagraphs.forEach((p,index)=>{descriptionText+=p.textContent.trim();if(index<allParagraphs.length-1){descriptionText+='\n\n'}});const slideData={titleText:title.textContent.trim(),descriptionText:descriptionText,buttonText:button.textContent.trim(),buttonLink:button.getAttribute('href')||'#'};if(img){slideData.src=img.getAttribute('data-src');slideData.alt=img.alt||title.textContent.trim()}slidesData.push(slideData)}});if(slidesData.length===0)return;const contentWrapper=listSection.querySelector('.content-wrapper');if(!contentWrapper)return;contentWrapper.style.maxWidth='none';const originalList=contentWrapper.querySelector('.user-items-list');if(originalList){originalList.style.display='none'}const sliderContainer=document.createElement('div');sliderContainer.className='tp-slider-container';const sliderTrack=document.createElement('div');sliderTrack.className='tp-slider-track';const createSlideElement=(data)=>{const slide=document.createElement('div');slide.className='tp-slide';if(data.src){const media=document.createElement('div');media.className='tp-slide-media';const image=document.createElement('img');image.src=data.src;image.alt=data.alt;media.appendChild(image);slide.appendChild(media)}const content=document.createElement('div');content.className='tp-slide-content';const titleEl=document.createElement('h3');titleEl.className='tp-title';titleEl.textContent=data.titleText;const descriptionEl=document.createElement('p');descriptionEl.className='tp-description';descriptionEl.textContent=data.descriptionText;const buttonEl=document.createElement('a');buttonEl.className='tp-button';buttonEl.href=data.buttonLink;buttonEl.textContent=data.buttonText;content.appendChild(titleEl);content.appendChild(descriptionEl);content.appendChild(buttonEl);slide.appendChild(content);return slide};for(let i=0;i<10;i++){slidesData.forEach(data=>sliderTrack.appendChild(createSlideElement(data)))}sliderContainer.appendChild(sliderTrack);const contentDiv=listSection.querySelector('.content');if(contentDiv){contentDiv.appendChild(sliderContainer)}else{contentWrapper.appendChild(sliderContainer)}let touchStartX=0;let touchStartY=0;let isTap=false;sliderContainer.addEventListener('touchstart',function(e){touchStartX=e.touches[0].clientX;touchStartY=e.touches[0].clientY;isTap=true},{passive:true});sliderContainer.addEventListener('touchmove',function(e){const deltaX=Math.abs(e.touches[0].clientX-touchStartX);const deltaY=Math.abs(e.touches[0].clientY-touchStartY);if(deltaX>10||deltaY>10){isTap=false}},{passive:true});sliderContainer.addEventListener('touchend',function(e){if(isTap&&!e.target.closest('.tp-button')){sliderTrack.classList.toggle('tp-paused')}},{passive:true});sliderContainer.addEventListener('click',function(e){if(e.target.closest('.tp-button'))return;if(!('ontouchstart' in window)){sliderTrack.classList.toggle('tp-paused')}})})})
</script>

#3.6. To reverse the movement of a scroll from left to right, you can use this code under main code

<style>
section[id="smooth-autoscroll-list02"] .tp-slider-track {
    animation-direction: reverse !important;
}
</style>

Note:

  • change smooth-autoscroll-list02 with word you entered in Anchor Link

#3.7. To disable autoscroll on Mobile only, use this under main code

<!-- Disable scroll on mobile -->
<script>
const isMobile = window.matchMedia('(max-width: 767px)').matches;
const repeatCount = isMobile ? 1 : 10;

for(let i=0; i < repeatCount; i++){
    slidesData.forEach(data => sliderTrack.appendChild(createSlideElement(data)))
}
</script>
<style>
@media (max-width: 767px) {
    .tp-slider-container {
        -webkit-mask-image: none;
        mask-image: none;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        scroll-snap-type: x mandatory;
    }
    
    .tp-slider-track {
        animation: none !important;
    }
    
    .tp-slide {
        scroll-snap-align: start;
    }
}
</style>

#3.8. To disable autoscroll on both desktop – mobile, you can add this under main code

<style>
@media (max-width: 3000px) {
    .tp-slider-container {
        -webkit-mask-image: none;
        mask-image: none;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        scroll-snap-type: x mandatory;
    }
    
    .tp-slider-track {
        animation: none !important;
    }
    
    .tp-slide {
        scroll-snap-align: start;
    }
}
</style>
<script>
const isMobile = window.matchMedia('(max-width: 3000px)').matches;
if(isMobile) {
    sliderTrack.innerHTML = '';
    slidesData.forEach(data => sliderTrack.appendChild(createSlideElement(data)));
}
</script>

 

#4. Support

Email me if you need support/install

Note: If you need additional options that require tweaking the main code, I will charge an extra fee.

 

Buy me a coffee