You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将老虎机效果中的文本元素替换为图片

如何将老虎机效果中的文本元素替换为图片

嘿,这个需求其实很好解决~你之前直接插HTML显示成文本,是因为原来的代码用了textContent来设置内容,它会把所有内容都当成纯文本解析,不会渲染HTML。咱们只需要改两处地方就能换成图片,我一步步给你讲:

第一步:把数字数组换成你的图片路径

原来的items数组存的是1-12的字符串,现在直接替换成你要用到的图片URL就行,比如本地的img1.jpg或者在线图片链接:

const items = [
  'img1.jpg',
  'img2.jpg',
  'img3.jpg',
  'img4.jpg',
  'img5.jpg',
  'img6.jpg',
  'img7.jpg',
  'img8.jpg',
  'img9.jpg',
  'img10.jpg',
  'img11.jpg',
  'img12.jpg',
];

第二步:修改盒子内容的渲染逻辑

原来的代码是给盒子设置textContent,现在我们要改成:如果是初始的❓就保留文本,否则创建<img>元素插入到盒子里,还要确保图片能填满老虎机的盒子。找到创建box的那段代码,替换掉box.textContent = pool[i];的部分:

for (let i = pool.length - 1; i >= 0; i--) {
  const box = document.createElement('div');
  box.classList.add('box');
  box.style.width = door.clientWidth + 'px';
  box.style.height = door.clientHeight + 'px';
  
  // 这里是修改的核心:根据内容类型渲染文本或图片
  if (pool[i] === '❓') {
    box.textContent = pool[i];
  } else {
    const img = document.createElement('img');
    img.src = pool[i];
    // 设置图片样式,让它填满整个老虎机盒子
    img.style.width = '100%';
    img.style.height = '100%';
    img.style.objectFit = 'cover'; // 保持图片比例,不会拉伸变形
    box.appendChild(img);
  }
  
  boxesClone.appendChild(box);
}

(可选)优化CSS让图片显示更完美

如果你的老虎机盒子有固定尺寸,建议给.box加个overflow: hidden;,避免图片超出边界:

.box {
  /* 原来的样式保持不变,新增下面这行 */
  overflow: hidden;
}

修改后的完整代码

(function () {
  // 替换成你的图片路径
  const items = [
    'img1.jpg',
    'img2.jpg',
    'img3.jpg',    
    'img4.jpg',
    'img5.jpg',
    'img6.jpg',
    'img7.jpg',
    'img8.jpg',
    'img9.jpg',
    'img10.jpg',
    'img11.jpg',
    'img12.jpg',
  ];
  const doors = document.querySelectorAll('.door');
  
  document.querySelector('#spinner').addEventListener('click', spin);
  document.querySelector('#reseter').addEventListener('click', init);

  function init(firstInit = true, groups = 1, duration = 1) {
    for (const door of doors) {
      if (firstInit) {
        door.dataset.spinned = '0';
      } else if (door.dataset.spinned === '1') {
        return;
      }

      const boxes = door.querySelector('.boxes');
      const boxesClone = boxes.cloneNode(false);
      const pool = ['❓'];

      if (!firstInit) {
        const arr = [];
        for (let n = 0; n < (groups > 0 ? groups : 1); n++) {
          arr.push(...items);
        }
        pool.push(...shuffle(arr));

        boxesClone.addEventListener(
          'transitionstart',
          function () {
            door.dataset.spinned = '1';
            this.querySelectorAll('.box').forEach((box) => {
              box.style.filter = 'blur(1px)';
            });
          },
          { once: true }
        );

        boxesClone.addEventListener(
          'transitionend',
          function () {
            this.querySelectorAll('.box').forEach((box, index) => {
              box.style.filter = 'blur(0)';
              if (index > 0) this.removeChild(box);
            });
          },
          { once: true }
        );
      }

      for (let i = pool.length - 1; i >= 0; i--) {
        const box = document.createElement('div');
        box.classList.add('box');
        box.style.width = door.clientWidth + 'px';
        box.style.height = door.clientHeight + 'px';
        
        // 渲染图片或文本的逻辑
        if (pool[i] === '❓') {
          box.textContent = pool[i];
        } else {
          const img = document.createElement('img');
          img.src = pool[i];
          img.style.width = '100%';
          img.style.height = '100%';
          img.style.objectFit = 'cover';
          box.appendChild(img);
        }
        
        boxesClone.appendChild(box);
      }
      boxesClone.style.transitionDuration = `${duration > 0 ? duration : 1}s`;
      boxesClone.style.transform = `translateY(-${door.clientHeight * (pool.length - 1)}px)`;
      door.replaceChild(boxesClone, boxes);
    }
  }

  async function spin() {
    init(false, 1, 2);
    
    for (const door of doors) {
      const boxes = door.querySelector('.boxes');
      const duration = parseInt(boxes.style.transitionDuration);
      boxes.style.transform = 'translateY(0)';
      await new Promise((resolve) => setTimeout(resolve, duration * 100));
    }
  }

  function shuffle([...arr]) {
    let m = arr.length;
    while (m) {
      const i = Math.floor(Math.random() * m--);
      [arr[m], arr[i]] = [arr[i], arr[m]];
    }
    return arr;
  }

  init();
})();

这样改完之后,老虎机滚动的就会是你设置的图片了~如果连初始的❓也想换成图片,只需要把pool = ['❓']改成pool = ['default-question.jpg'],然后去掉渲染逻辑里的if判断,统一用图片渲染就行。

备注:内容来源于stack exchange,提问作者Doctor Chickles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:08:01