css实现文字滚动

css实现文字滚动

css实现简单的文字横向滚动效果

使用marquee标签当然也可以实现,但是marquee标签已经被淘汰了,一些属性和浏览器不可用

HTML

<!-- css变量说明:--gap:文字段之间的间隔(默认20px),--time:滚动一段文字的时间(默认3s) -->
<div class="z-text-roll z-is-roll"  style="--gap: 20px;--time: 3s;">
    <span data-text="要滚动的文字要滚动的文字要滚动的文字"></span>
</div>

CSS

.z-text-roll {
    /* 最大宽度 */
    width: 100%;
    /* 不允许换行 */
    white-space: nowrap;
    /* 超出隐藏 */
    overflow: hidden;
    position: relative;
    --gap: 20px;
    --time: 3s;
}
.z-text-roll>span {
    position: relative;
    display: inline-block;
}
.z-text-roll>span::before {
    content: attr(data-text);
    position: relative;
    left: 0;
}
.z-text-roll.z-is-roll>span::before {
    --index:0;
    animation: z-text-anim var(--time) linear infinite;
}
.z-text-roll.z-is-roll>span::after {
    content: attr(data-text);
    position: absolute;
    left: calc(100% + var(--gap));
    --index:1;
    animation: z-text-anim var(--time) linear infinite;
}

@keyframes z-text-anim {
    0% {
        /* --index 为第几个文本 */
        left: calc((100% + var(--gap)) * var(--index));
    }
    100% {
        left: calc((100% + var(--gap)) * (var(--index) - 1));
    }
}
/* 更多 */
.z-text-roll>span>font {
    display: none;
}
.z-text-roll.z-is-roll>span>font {
    display: inline-block;
    position: absolute;
    left: calc((100% + var(--gap)) * 2);
    --index:2;
    animation: z-text-anim var(--time) linear infinite;
}
.z-text-roll.z-is-roll>span>font>span {
    margin-right: var(--gap);
}

文字宽度没有超出容器的问题

如果文字宽度没有超出容器宽度,你可以发现上面的样式将会发送错误

期望继续滚动

如果你想文字的宽度小于容器宽度也继续滚动,你可以多添加几份同样的文字,以让文字的总宽度超出容器的宽度,或者增加一段文字和下一段的文字的间隔--gap: 50px

<div class="z-text-roll z-is-roll" style="--gap: 50px">
    <span data-text="要滚动的文字要滚动的文字要滚动的文字">
        <font>
            <span>要滚动的文字要滚动的文字要滚动的文字</span>
            <span>要滚动的文字要滚动的文字要滚动的文字</span>
            <span>要滚动的文字要滚动的文字要滚动的文字</span>
            <span>要滚动的文字要滚动的文字要滚动的文字</span>
        </font>
    </span>
</div>

利用js判断是否需要滚动

如果你想文字宽度超出容器宽度才开启滚动,你可以使用js进行判断,动态添加classz-is-roll

function initRoll(){
    // 您需要注意这个选择器,需要选中.z-text-roll元素
    let rollBox = document.querySelector('div.z-text-roll')
    let textWidth = rollBox.querySelector(':scope > span').clientWidth
    if(rollBox.clientWidth < textWidth){
        rollBox.classList.add('z-is-roll')
    }else{
        rollBox.classList.remove('z-is-roll')
    }
}
initRoll()

如果你使用vue等框架,需要等待组件渲染完成再调用判断,否则拿不到正确的宽度

// 例如Vue3
onMounted(() => {
    initRoll()
})

如果你绑定的动态的文字,需要监听文字改变,并等待渲染完成的时候重新判断宽度

// 例如Vue3
const text = ref('要滚动的文字')
watch(text, ()=>{
    // 等待渲染完成
    setTimeout(() => {
        initRoll()
    }, 0);
})

如果你的容器宽度是不固定的,你还需要在宽度变化的时候重新判断宽度

dome地址

https://dome.yyzhu.vip/text-roll

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值