css实现文字在一行内自动移动

712 阅读1分钟

前言

之前在做音乐播放器的项目时,想要中间的歌曲名自动从右向左滚动,于是就实现了这个样式

具体实现

html部分

 <div class="words">
        <p>哈哈哈哈哈哈哈哈哈哈哈哈哈</p>
    </div>

css部分

.words {
    width: 150px;
    margin: auto;
    border:1px solid black ;
    
    /* 超出部分隐藏 */
    overflow: hidden; 
}

.words p {
    float: left; 
    
    /* 控制文字在一行内显示 */
    word-break: keep-all;
    white-space: nowrap;
    
    /* 添加定义好的动画,并均匀移动(linear)且不断重复(infinite) */
    animation: 10s wordsLoop linear infinite;  
}

/* 添加鼠标经过时,停止移动 */
.words p:hover {
    animation-play-state: paused;
}

/* 添加动画,表示从右到左移动距离 */
@keyframes wordsLoop { 
    0% {
        transform: translateX(100%);
    }
    100% {
        transform: translateX(-100%);

    }
}

效果图

soogif.gif

总结

实现过程中遇到这么一个问题,就是如果你整个文字长度超过了整个div设置的宽度,它是不能够实现整段文字完全从右到左直至消失的效果的。

因为translateX(100%)是相对于自身,也就是p标签而言的,但是p宽度是继承于div的,所以translateX(100%)是本质上是相对于div宽度而言的,但是当文字很长,已经超过div设置的宽度了,translateX(100%)是还是相对于p(div)宽度向左移动,所以解决办法就是需要让p不受外部div的限制,其实方法有许多,我这里是添加的浮动float

image.png