【问题标题】:Random images on load in this slider此滑块中加载的随机图像
【发布时间】:2018-01-13 19:34:24
【问题描述】:

我从 codepen 获得了这个滑块,我想稍后展示一些关于它的工作,例如第一张幻灯片将是“摄影”,下一张可以是“插图”等等。

我想在每次刷新时随机选择 3 张图片(我现在有一张可以显示,但还有 2 张用 HTML 注释写成)。

这是我的代码。

let dots = 4;
let sliderElem = document.querySelector(".slider");
let dotElems = sliderElem.querySelectorAll(".slider__dot");
let indicatorElem = sliderElem.querySelector(".slider__indicator");

Array.prototype.forEach.call(dotElems, dotElem => {
	dotElem.addEventListener("click", e => {
		let currentPos = parseInt(sliderElem.getAttribute("data-pos"));
		let newPos = parseInt(dotElem.getAttribute("data-pos"));

		let newDirection = newPos > currentPos ? "right" : "left";
		let currentDirection = newPos < currentPos ? "right" : "left";

		indicatorElem.classList.remove(`slider__indicator--${currentDirection}`);
		indicatorElem.classList.add(`slider__indicator--${newDirection}`);
		sliderElem.setAttribute("data-pos", newPos);
	});
});
.slider {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
}
.slider__slides {
  position: relative;
  width: 400%;
  height: 100%;
  -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.51, 0.92, 0.24, 1);
  transition: -webkit-transform 0.3s cubic-bezier(0.51, 0.92, 0.24, 1);
  transition: transform 0.3s cubic-bezier(0.51, 0.92, 0.24, 1);
  transition: transform 0.3s cubic-bezier(0.51, 0.92, 0.24, 1), -webkit-transform 0.3s cubic-bezier(0.51, 0.92, 0.24, 1);
  will-change: transform;
}
.slider[data-pos="0"] .slider__slides {
  -webkit-transform: translateX(0%);
          transform: translateX(0%);
}
.slider[data-pos="1"] .slider__slides {
  -webkit-transform: translateX(-25%);
          transform: translateX(-25%);
}
.slider[data-pos="2"] .slider__slides {
  -webkit-transform: translateX(-50%);
          transform: translateX(-50%);
}
.slider[data-pos="3"] .slider__slides {
  -webkit-transform: translateX(-75%);
          transform: translateX(-75%);
}
.slider__slide {
  float: left;
  width: 25%;
  height: 100%;
}
.slider__slide img {
  width:50%;
  display: block;
  margin: 0 auto;
}
.slider__dots {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  position: absolute;
  bottom: 1.5em;
  left: 50%;
  -webkit-transform: translateX(-50%);
          transform: translateX(-50%);
}
.slider__dot, .slider__indicator {
  display: block;
  margin: 0 0.5em;
  width: 1em;
  height: 1em;
  background: rgba(255, 255, 255, 0.5);
  border-radius: 100px;
}
.slider__indicator {
  position: absolute;
  background: white;
  width: auto;
}
.slider__indicator--left {
  -webkit-transition: left 0.3s cubic-bezier(0.51, 0.92, 0.24, 1.15), right 0.3s 0.1s cubic-bezier(0.51, 0.92, 0.24, 1.15);
  transition: left 0.3s cubic-bezier(0.51, 0.92, 0.24, 1.15), right 0.3s 0.1s cubic-bezier(0.51, 0.92, 0.24, 1.15);
}
.slider__indicator--right {
  -webkit-transition: left 0.3s 0.1s cubic-bezier(0.51, 0.92, 0.24, 1.15), right 0.3s cubic-bezier(0.51, 0.92, 0.24, 1.15);
  transition: left 0.3s 0.1s cubic-bezier(0.51, 0.92, 0.24, 1.15), right 0.3s cubic-bezier(0.51, 0.92, 0.24, 1.15);
}
.slider[data-pos="0"] .slider__indicator {
  left: 0em;
  right: 6em;
}
.slider[data-pos="1"] .slider__indicator {
  left: 2em;
  right: 4em;
}
.slider[data-pos="2"] .slider__indicator {
  left: 4em;
  right: 2em;
}
.slider[data-pos="3"] .slider__indicator {
  left: 6em;
  right: 0em;
}

.center {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  height: 100vh;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  background: #333;
}

.slider {
  max-width: 600px;
  max-height: 400px;
  box-shadow: 0 0 20px rgba(0, 0, 0, 0.8);
}
.slider__slide:nth-child(1) {
  background: #309954;
}
.slider__slide:nth-child(2) {
  background: #FFBD3C;
}
.slider__slide:nth-child(3) {
  background: #F8593E;
}
.slider__slide:nth-child(4) {
  background: #4086FA;
}
<div class="center">
	
	<div class="slider" data-pos="0">
		<div class="slider__slides">
			<div class="slider__slide">
			  <img src="http://www.dogster.com/wp-content/uploads/2015/05/google-dog-search-2014-05.jpg">
        
        <!-- Second image that has a chance of showing upload load
        <img src="http://static4.businessinsider.com/image/569fdd9ac08a80bd448b7138/google-is-officially-a-dog-company.jpg">
      -->
      
      <!-- Third
        <img src="http://static4.businessinsider.com/image/569fdd9ac08a80bd448b7138/google-is-officially-a-dog-company.jpg">
      -->
        
        
        
        
			</div>
			<div class="slider__slide"></div>
			<div class="slider__slide"></div>
			<div class="slider__slide"></div>
		</div>
		<div class="slider__dots">
			<a href="#" class="slider__indicator"></a>
			<a href="#" class="slider__dot" data-pos="0"></a>
			<a href="#" class="slider__dot" data-pos="1"></a>
			<a href="#" class="slider__dot" data-pos="2"></a>
			<a href="#" class="slider__dot" data-pos="3"></a>
		</div>
	</div>
	
</div>

相信为了获得随机图像,我需要以这种方式将 var 保存在 javascript 中,对吗?

 var imgs = [
        'http://www.dogster.com/wp-content/uploads/2015/05/google-dog-search-2014-05.jpg',
        'http://static4.businessinsider.com/image/569fdd9ac08a80bd448b7138/google-is-officially-a-dog-company.jpg',
        'http://static4.businessinsider.com/image/569fdd9ac08a80bd448b7138/google-is-officially-a-dog-company.jpg'
    ];

要获得一个随机

var img_index = Math.floor( Math.random()*imgs.length );

但我怎么知道将其集成到 HTML 中?

【问题讨论】:

    标签: javascript html css random slider


    【解决方案1】:

    如果我正确理解您的问题,您希望在每次刷新后更改滑块的初始位置。

    使用Math.random,您的想法是正确的。

    我稍微修改了您的代码,将sliderElem.setAttribute("data-pos", Math.floor(Math.random() * dots)); 添加到您的Javascript 代码中。这将设置 Javascript 文件加载时滑块的初始位置。

    我还用您建议的图像填充了滑块组件。

    编辑

    我已更改代码以随机化第一张幻灯片上的图像。该幻灯片现在有一个id="first-slide,以便更容易找到。 如您所见,现在有一个函数getRandomImage(),它返回一个随机图像的URL。

    您可以将更多图像添加到imgs 数组中,该函数将继续从整个数组中随机选择一张。

    我还将舍入功能从 Math.floor 更改为 Math.round 以增加最后一张图片出现的机会。

    let dots = 4;
    let sliderElem = document.querySelector(".slider");
    let dotElems = sliderElem.querySelectorAll(".slider__dot");
    let indicatorElem = sliderElem.querySelector(".slider__indicator");
    
    Array.prototype.forEach.call(dotElems, dotElem => {
      dotElem.addEventListener("click", e => {
        let currentPos = parseInt(sliderElem.getAttribute("data-pos"));
        let newPos = parseInt(dotElem.getAttribute("data-pos"));
    
        let newDirection = newPos > currentPos ? "right" : "left";
        let currentDirection = newPos < currentPos ? "right" : "left";
    
        indicatorElem.classList.remove(`slider__indicator--${currentDirection}`);
        indicatorElem.classList.add(`slider__indicator--${newDirection}`);
        sliderElem.setAttribute("data-pos", newPos);
      });
    });
    
    function getRandomImage() {
      let imgs = ['http://www.dogster.com/wp-content/uploads/2015/05/google-dog-search-2014-05.jpg', 'http://static4.businessinsider.com/image/569fdd9ac08a80bd448b7138/google-is-officially-a-dog-company.jpg'];
      let pos = Math.round(Math.random() * (imgs.length - 1));
      return imgs[pos];
    }
    
    document.getElementById('first-slide').setAttribute('src', getRandomImage());
    /* Uncomment the line below to randomize slider initial position */
    // sliderElem.setAttribute("data-pos", Math.floor(Math.random() * dots));
    .slider {
      position: relative;
      width: 100%;
      height: 100%;
      overflow: hidden;
    }
    .slider__slides {
      position: relative;
      width: 400%;
      height: 100%;
      -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.51, 0.92, 0.24, 1);
      transition: -webkit-transform 0.3s cubic-bezier(0.51, 0.92, 0.24, 1);
      transition: transform 0.3s cubic-bezier(0.51, 0.92, 0.24, 1);
      transition: transform 0.3s cubic-bezier(0.51, 0.92, 0.24, 1), -webkit-transform 0.3s cubic-bezier(0.51, 0.92, 0.24, 1);
      will-change: transform;
    }
    .slider[data-pos="0"] .slider__slides {
      -webkit-transform: translateX(0%);
              transform: translateX(0%);
    }
    .slider[data-pos="1"] .slider__slides {
      -webkit-transform: translateX(-25%);
              transform: translateX(-25%);
    }
    .slider[data-pos="2"] .slider__slides {
      -webkit-transform: translateX(-50%);
              transform: translateX(-50%);
    }
    .slider[data-pos="3"] .slider__slides {
      -webkit-transform: translateX(-75%);
              transform: translateX(-75%);
    }
    .slider__slide {
      float: left;
      width: 25%;
      height: 100%;
    }
    .slider__slide img {
      width:50%;
      display: block;
      margin: 0 auto;
    }
    .slider__dots {
      display: -webkit-box;
      display: -ms-flexbox;
      display: flex;
      position: absolute;
      bottom: 1.5em;
      left: 50%;
      -webkit-transform: translateX(-50%);
              transform: translateX(-50%);
    }
    .slider__dot, .slider__indicator {
      display: block;
      margin: 0 0.5em;
      width: 1em;
      height: 1em;
      background: rgba(255, 255, 255, 0.5);
      border-radius: 100px;
    }
    .slider__indicator {
      position: absolute;
      background: white;
      width: auto;
    }
    .slider__indicator--left {
      -webkit-transition: left 0.3s cubic-bezier(0.51, 0.92, 0.24, 1.15), right 0.3s 0.1s cubic-bezier(0.51, 0.92, 0.24, 1.15);
      transition: left 0.3s cubic-bezier(0.51, 0.92, 0.24, 1.15), right 0.3s 0.1s cubic-bezier(0.51, 0.92, 0.24, 1.15);
    }
    .slider__indicator--right {
      -webkit-transition: left 0.3s 0.1s cubic-bezier(0.51, 0.92, 0.24, 1.15), right 0.3s cubic-bezier(0.51, 0.92, 0.24, 1.15);
      transition: left 0.3s 0.1s cubic-bezier(0.51, 0.92, 0.24, 1.15), right 0.3s cubic-bezier(0.51, 0.92, 0.24, 1.15);
    }
    .slider[data-pos="0"] .slider__indicator {
      left: 0em;
      right: 6em;
    }
    .slider[data-pos="1"] .slider__indicator {
      left: 2em;
      right: 4em;
    }
    .slider[data-pos="2"] .slider__indicator {
      left: 4em;
      right: 2em;
    }
    .slider[data-pos="3"] .slider__indicator {
      left: 6em;
      right: 0em;
    }
    
    .center {
      display: -webkit-box;
      display: -ms-flexbox;
      display: flex;
      height: 100vh;
      -webkit-box-pack: center;
          -ms-flex-pack: center;
              justify-content: center;
      -webkit-box-align: center;
          -ms-flex-align: center;
              align-items: center;
      background: #333;
    }
    
    .slider {
      max-width: 600px;
      max-height: 400px;
      box-shadow: 0 0 20px rgba(0, 0, 0, 0.8);
    }
    .slider__slide:nth-child(1) {
      background: #309954;
    }
    .slider__slide:nth-child(2) {
      background: #FFBD3C;
    }
    .slider__slide:nth-child(3) {
      background: #F8593E;
    }
    .slider__slide:nth-child(4) {
      background: #4086FA;
    }
    <div class="center">
      <div class="slider" data-pos="0">
        <div class="slider__slides">
          <div class="slider__slide">
            <img id="first-slide" src="http://www.dogster.com/wp-content/uploads/2015/05/google-dog-search-2014-05.jpg">
          </div>
          <div class="slider__slide">
            <img src="http://static4.businessinsider.com/image/569fdd9ac08a80bd448b7138/google-is-officially-a-dog-company.jpg">
          </div>
          <div class="slider__slide">
            <img src="http://www.dogster.com/wp-content/uploads/2015/05/google-dog-search-2014-05.jpg"></div>
          <div class="slider__slide">
            <img src="http://static4.businessinsider.com/image/569fdd9ac08a80bd448b7138/google-is-officially-a-dog-company.jpg">
          </div>
        </div>
        <div class="slider__dots">
          <a href="#" class="slider__indicator"></a>
          <a href="#" class="slider__dot" data-pos="0"></a>
          <a href="#" class="slider__dot" data-pos="1"></a>
          <a href="#" class="slider__dot" data-pos="2"></a>
          <a href="#" class="slider__dot" data-pos="3"></a>
        </div>
      </div>
    </div>

    【讨论】:

    • 感谢您的输入,实际上我想在加载时随机更改第一张幻灯片上的三张图片中的一张,不要介意其他三张幻灯片
    • @Panic 我已经修改了代码。现在它只为第一张幻灯片选择一个随机图像。有关更多信息,请参阅编辑评论
    • 非常感谢,完成了这项工作
    • @David Harillo Sánchez 有没有办法解决它在加载时不显示之前的图片?我的意思是有时我需要重新加载我的页面 3 次才能获得另一张图片,因为数学随机数很幸运,并且会出现 3 次相同的数字,这使得对于那些不知道如何处理的人来说,代码看起来像是损坏/错误有用。感谢所有的投入和努力,非常感谢!
    • @Panic 你需要使用 cookie 来做类似的事情。然后您可以存储显示给该用户的最后一个位置,当页面重新加载时,您会在数组中显示下一个图像,而不是随机显示。另一种选择是使图像数组足够大(可能是 10 张图像?)以减少连续显示同一图像两次的机会。但机会仍然存在
    猜你喜欢
    • 2019-01-31
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多