纵向抽奖滚动效果代码

网上参考了一篇文章是横向滚动,现在实现了一篇纵向滚动的抽奖

// HomePage.js
function HomePage() {
let s = null;

useEffect(() => {
  s = new Scroll({
      eleID: "roulette-container-1",
      scrollID: "item-case-goods-1",
      // targetID: "roulette-container-1-open",
      pageSize: 3,
  })
}, []);

const onStart = () => {
  s.start(Math.floor(Math.random()*5)+1);

}

return (
  <div className='index'>
    <div className="roulette-container" id="roulette-container-1">
      <ul id="item-case-goods-1" className="item-case-goods">
          <li className="item-small-case restricted" data-id="1">
              <img className="content-img" src={img1Src} alt="" />
          </li>
          <li className="item-small-case restricted" data-id="2">
              <img className="content-img" src={img2Src} alt="" />
          </li>
          <li className="item-small-case restricted" data-id="3">
              <img className="content-img" src={img3Src} alt="" />
          </li>
          <li className="item-small-case restricted" data-id="4">
              <img className="content-img" src={img4Src} alt="" />
          </li>
      </ul>
    </div>
    <div>
        <Button className='start-btn' onClick={onStart}>开始</Button>
    </div>
  </div>
)
}

// HomePage.scss
.content-img{
    width: 500px;
    height: 500px;
    margin: auto;
    display: block;
}
.start-btn {
    width: 300px;
    border: 2px solid red;
    color: red;
    background: white;
    margin-top: 50px;
}

.item-case-open {
    animation: mymove 1s infinite linear;
}


.roulette-container {
    position: relative;
    height: 502px;
    overflow: auto;
    
}

.roulette-container-open {
    border: 1px solid #00FF00;
    position: absolute;
    top: 0;
    width: 100%;
    height: 502px;
}

.item-case-goods {
    word-break: keep-all;
    white-space: nowrap;
    padding: 0px;
    margin: 0px;
    width: 100%;
    /*will-change: transform;*/
}

// Scroll.js
var Scroll = function ({
     eleID,
      scrollID,
      targetID = null,
      pageSize = 10,
      field = 'id',
      duration = 5,
  }) {
      this._targetElement = null;
      this._element = document.getElementById(eleID);
      this._scrollElement = document.getElementById(scrollID);
      if (targetID) this._targetElement = document.getElementById(targetID);
      this._size = pageSize;
      this._len = 0;
      this._ids = {};
      this._field = field;
      this._duration = duration;
      this._itemWidth = 0;
      this._itemHeight = 0;
      this.init();
      return this;
  }
Scroll.prototype.init = function () {
  if (this._targetElement) {
      this._targetElement.style.position = 'absolute';
      this._targetElement.style['z-index'] = 100000;
  }
  this._scrollElement.style['will-change'] = 'transform';
  this._scrollElement.style.position = 'absolute';
  this._scrollElement.style.transform = 'translateX(0%)';
  this._scrollElement.style['z-index'] = 9999;

  // this._scrollElement.style['-webkit-transition'] = transition;
  // this._scrollElement.style['-moz-transition'] = transition;
  // this._scrollElement.style['-ms-transition'] = transition;
  // this._scrollElement.style['-o-transition'] = transition;
  // this._scrollElement.style['transition'] = transition;
  this.createNoneElement();
  let list = Array.from(this._scrollElement.children);
  this._len = list.length;
  this._itemHeight = this._scrollElement.children[0].clientHeight;
  console.log(this._itemHeight)
  list.forEach((item, index) => {
      this._ids[item.dataset[this._field]] = index;
  })
  for (var i = 0; i < this._size; i++) {
      this._scrollElement.innerHTML += this._scrollElement.innerHTML;
  }
}

Scroll.prototype.createNoneElement = function () {
  let child = document.createElement(this._scrollElement.children[0].tagName);
  child.classList.value = this._scrollElement.children[0].classList.value;
  console.log("tagName", this._scrollElement.children[0].classList.value)
  Array.from(this._scrollElement.children[0].style).forEach((item, index) => {
      child.style[item] = this._scrollElement.children[0].style[item]
  })
  child.innerHTML = '<div class="content-img" style="display: flex;justify-content: center;align-items: center;">很遗憾<br/>你今天不能吃饭</div>';
  this._scrollElement.append(child);
}

Scroll.prototype.start = function (winId) {
  let n = this._ids[winId] ? this._ids[winId] : this._ids[undefined],
  y =((this._size - 1) * this._len + Number(n)) * this._itemHeight;
  this._scrollElement.style.transform = 'translateY(0%)';
  this._scrollElement.style['transition-duration'] = '0ms';
  let handle = setTimeout(() => {
      this._scrollElement.style['transition-duration'] = this._duration + 's';
      this._scrollElement.style.transform = 'translateY(-' + y + 'px)';
      clearTimeout(handle);
  })
}

export default Scroll

参考链接
js实现抽奖滚动效果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值