原生CSS实现文字无限轮播的通用方法

文字轮播在生活中很常见,各个超市及实体店门头通常会有文字轮播的广告牌,本文详细介绍下实现逻辑。

场景

商店门头广告牌,需要通过横向移动的文字来展示公告(加边框是为了更好演示)。

逻辑说明

实现文字无限轮转的逻辑主要有两点:

  1. 文字水平移动
  2. 文字首尾相接 

第1点实现方法是使用CSS动画,transform: translateX(-50%),即往左平移自身的一半。

第2点实现方法,跟第1点有关。CSS动画在默认情况下播放完成后是突变的,即播放完成时位置突变到初始位置(突变是瞬间完成的,人肉眼感知不到),因此我们可以利用突变来实现文字首尾相接。

我们用两段相同的文本,当第一段文本播放完毕,开始播放第二段文本时,此时动画突变又开始重新播放第一段文字,因两段文字内容一样,所以用户无感知。

思考

目前这种实现方式是通用的吗?

这种方式其实已经解决了大部分需求,但是当文字比较少,当文字的宽度小于窗口宽度时,是有问题的,我画的轮转逻辑示意图只是其中的一种情况。

当文字的宽度小于窗口宽度时,如何实现?

 

其实道理都一样,文字轮转核心之一是需要两段相同的文本,但它是有前提的,前提是一段文本的宽度必须大于窗口的宽度。

如何达到这个前提条件?

答案是 整体复制文本直到文本的宽度大于窗口的宽度,然后再处理成两段相同的文本。

总结

文字无限轮转的要点如下:

  1. 文本宽度必须大于窗口宽度,文本宽度不够时就整体复制文本直到文本宽度大于窗口宽度
  2. 两段相同的文本
  3. 移动 50% 的距离

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>文字无限轮播</title>

    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        #wrap {
            overflow: hidden;
            position: relative;
            width: 200px;
            height: 20px;
            white-space: nowrap;
        }

        #inner {
            position: absolute;
            animation: slide 5s linear infinite;
        }

        #first{
            display: inline-block;
            border: 1px solid red;
        }

        #second{
            display: inline-block;
            border: 1px solid green;
        }

        @keyframes slide {
            0% {
                transform: translateX(0);
            }
            100% {
                transform: translateX(-50%);
            }
        }
    </style>
</head>
<body>
<div id="wrap">
    <div id="inner">
        <span id="first">本店主营拉面,刀削面,烩面,盖浇饭</span>
        <span id="second">本店主营拉面,刀削面,烩面,盖浇饭</span>
    </div>
</div>
</body>
</html>
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,关于无缝轮播,可以通过原生JS手写实现。下面是一个简单的无缝无限轮播的carousel实现,你可以参考一下: HTML部分: ```html <div class="carousel"> <ul class="carousel-list"> <li><img src="img1.jpg"></li> <li><img src="img2.jpg"></li> <li><img src="img3.jpg"></li> <li><img src="img4.jpg"></li> </ul> </div> ``` CSS部分: ```css .carousel { position: relative; overflow: hidden; width: 600px; height: 400px; } .carousel-list { position: absolute; left: 0; top: 0; width: 10000px; height: 400px; margin: 0; padding: 0; list-style: none; } .carousel-list li { float: left; width: 600px; height: 400px; margin: 0; padding: 0; } ``` JS部分: ```javascript var carousel = document.querySelector('.carousel'); var carouselList = document.querySelector('.carousel-list'); var carouselItems = document.querySelectorAll('.carousel-list li'); var carouselWidth = carousel.offsetWidth; var currentIndex = 0; // 克隆第一张图片,并放到最后 var firstItem = carouselItems[0].cloneNode(true); carouselList.appendChild(firstItem); // 点击左右按钮的事件处理函数 function handleButtonClick(event) { var target = event.target; if (target.classList.contains('prev')) { currentIndex--; if (currentIndex < 0) { currentIndex = carouselItems.length - 1; carouselList.style.left = -currentIndex * carouselWidth + 'px'; } } else if (target.classList.contains('next')) { currentIndex++; if (currentIndex >= carouselItems.length) { currentIndex = 0; carouselList.style.left = 0; } } var left = -currentIndex * carouselWidth; carouselList.style.left = left + 'px'; } // 绑定左右按钮的事件 var prevBtn = document.createElement('button'); prevBtn.classList.add('prev'); prevBtn.innerText = '上一张'; prevBtn.addEventListener('click', handleButtonClick); var nextBtn = document.createElement('button'); nextBtn.classList.add('next'); nextBtn.innerText = '下一张'; nextBtn.addEventListener('click', handleButtonClick); carousel.appendChild(prevBtn); carousel.appendChild(nextBtn); ``` 这段代码实现无限轮播,并且可以通过左右按钮控制图片的切换。你可以将这段代码复制到本地运行,看看效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山水好风光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值