微件

微件:ScrollText

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献2025年10月15日 (三) 21:17的版本 (创建页面,内容为“<style> .scroll-text { position: relative; overflow: hidden; display: flex; align-items: center; justify-content: center; } .scroll-text .scroll-text-content { word-wrap: break-word; word-break: break-all; position: relative; width: 100%; text-align: center; } .scroll-text.has-scroll { align-items: flex-start; } .scroll-text.has-scroll .scroll-text-content { text-align: center; } .scroll-text .scroll-text-content.enable-scroll { a…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

<style> .scroll-text {

 position: relative;
 overflow: hidden;
 display: flex;
 align-items: center;
 justify-content: center;

}

.scroll-text .scroll-text-content {

 word-wrap: break-word;
 word-break: break-all;
 position: relative;
 width: 100%;
 text-align: center; 

}

.scroll-text.has-scroll {

 align-items: flex-start;

}

.scroll-text.has-scroll .scroll-text-content {

 text-align: center;

}

.scroll-text .scroll-text-content.enable-scroll {

 animation: scrollText linear infinite;

}

.scroll-text .scroll-text-content.enable-scroll:hover {

 animation-play-state: paused;

}

@keyframes scrollText-default {

 0% { 
   transform: translateY(0); 
 }
 100% { 
   transform: translateY(calc(-100% + 110px));
 }

} </style>

<script> (function() {

 function initScroll() {
   // 使用 class 选择器获取所有滚动文本容器
   var wrappers = document.querySelectorAll('.scroll-text');
   
   if (!wrappers.length) {
     setTimeout(initScroll, 100);
     return;
   }
   
   // 遍历每个容器并初始化
   wrappers.forEach(function(wrapper, index) {
     var content = wrapper.querySelector('.scroll-text-content');
     if (!content || content.classList.contains('scroll-initialized')) {
       return;
     }
     
     // 标记已初始化,避免重复处理
     content.classList.add('scroll-initialized');
     
     var text = content.textContent || content.innerText;
     var charCount = text.replace(/\s+/g, ).length;
     var threshold = parseInt(content.getAttribute('data-threshold')) || 50;
     var speed = parseFloat(content.getAttribute('data-speed')) || 10;
     
     if (charCount > threshold) {
       // 为父容器添加标识类,表示需要滚动
       wrapper.classList.add('has-scroll');
       
       // 为每个实例创建唯一的动画名称
       var animationName = 'scrollText-' + index + '-' + Date.now();
       content.classList.add('enable-scroll');
       
       // 等待DOM更新后计算实际高度
       setTimeout(function() {
         var contentHeight = content.scrollHeight;
         var wrapperHeight = wrapper.offsetHeight;
         var scrollDistance = contentHeight - wrapperHeight;
         
         // 动态设置滚动距离
         if (scrollDistance > 0) {
           // 为当前实例创建独立的动画样式
           var styleId = 'scroll-text-animation-' + index;
           var existingStyle = document.getElementById(styleId);
           if (existingStyle) {
             existingStyle.remove();
           }
           
           var style = document.createElement('style');
           style.id = styleId;
           style.textContent = `
             @keyframes ${animationName} {
               0% { 
                 transform: translateY(0); 
               }
               100% { 
                 transform: translateY(-${scrollDistance}px); 
               }
             }
           `;
           document.head.appendChild(style);
           
           // 计算动画时长并应用动画
           var duration = Math.max(speed, charCount / 8);
           content.style.animationName = animationName;
           content.style.animationDuration = duration + 's';
         } else {
           // 如果实际上不需要滚动,移除滚动类
           wrapper.classList.remove('has-scroll');
           content.classList.remove('enable-scroll');
         }
       }, 10);
     } else {
       // 字符数未达到阈值,确保没有滚动类
       wrapper.classList.remove('has-scroll');
     }
   });
 }
 
 if (document.readyState === 'loading') {
   document.addEventListener('DOMContentLoaded', initScroll);
 } else {
   initScroll();
 }

})(); </script>