最近的项目有做到一个功能 类似跑马灯或者公告栏那种
有文字 也有列表的 所以 写了两种
第一种公告栏文字是用的js
第二种图文类型是用的css
两种方法 记录一下
第一种 纯文字滚动
其实也是根据js去计算dom的宽度 通过js去给css赋值
<div class="div1"><div class="div2"><a :href="i.link" v-for="(i,j) in disArr" :key="j" target="_blank" class="tagName" :ref="'tagName' + j" style="margin-right: 118px;"><div style="color: #fff;margin-right: 10px;"><img src="~@/assets/home/s_icon.png" style="width: 32px;margin-right: 20px;">{{i.title}}</div></a></div></div>
let width = 0;
let els = this.disArr;
console.log(this.disArr,'dis');
let _this = this;
for(var i = 0 ; i < els.length;i++){let tag = _this.$refs['tagName' + i];width+= tag[0].offsetWidth+118;// console.log(tag,'tag');
}
// console.log(width,'width');
document.styleSheets[0].insertRule("@keyframes anima" +"{" +"0%{transform: translateX(100%);}" +"100%{transform: translateX(-"+ width +"px);" +"}"
)
.div1 {width: 100%;height: 63px;line-height: 63px;background: linear-gradient(90deg, #FE890C 0%, #D549F5 100%);overflow: hidden;box-sizing: border-box;
}
.div1:hover .div2{-webkit-animation-play-state: paused; /*动画暂停播放*/
}
.div2 {white-space: nowrap;display: flex;color: #fff;font-size: 20px;font-family: "Black";animation: 10s anima linear infinite normal;cursor: pointer;
}
因为文字内容无法确定 如果是固定的话是不需要js的 在css里直接给一个固定值就可以了
第二种 图片文字
<div class="wrap"><div class="list"><div class="my-list" v-for="(item,index) in sendVal" :key='index'><div class="my-uname"><a-col :span="6"><img :src="require(`../assets/home/${item.url}.png`)" alt="" class="winner_icon"></a-col><a-col :span="9" class="w_name">{{item.account}}</a-col><a-col :span="9" class="w_gusdt" style="text-align: right;">{{item.roll}}</a-col></div></div></div></div>
* {
margin: 0;padding: 0;}.wrap {width: 100%;height: 100px;overflow: hidden;position: relative;padding-left: 3480px;}.list {list-style: none;width: 6960px;height: 100px;position: absolute;top: 0px; /*right:0px;向右*/left: 0px; /*向左*/animation: mymove 34.8s 1s infinite linear;display: flex;align-items: center;.my-list{margin:0 12px;display: inline-block;font-size: 24px;line-height: 50px;padding: 20px 16px; width: 324px;border-radius: 20px;border: 1px solid #7C8097;.my-uname{color: #FFFFFF;font-size: 14px;.winner_icon{width: 56px;}.w_name{font-weight: 500;}.w_gusdt{color: #665DF5;font-family: 'Roman';}.winner_icon{object-fit: contain;width: 56px;height: 56px;}}}}@keyframes mymove {from {left: 0px;}to {left: -100%;}}.list:hover {animation-play-state: paused;cursor: pointer;}
css的这种方法我自己摸索出来的 要做到完全无缝相接 例如一行需要展示10条数据 那么我们需要把这10条数据先重复一遍 就是一行20条 这样滚动起来才会达到无缝的效果 一个box的宽度例如是324px 那么加上margin的宽度 一共是348 10个box就是3480 20个就是6960px 还有一个地方的属性我没有弄明白 就是padding-left这个一定要加上 如果不加上 就达不到完全无缝滚动的效果
现在的滚动效果是向左滚动 如果是希望达到向右滚动的效果 那么就把css里的属性改一下就可以了
@keyframes mymove {from {right: 0px;}to {right: -100%;}
}