javascript - 使用 JavaScript 启用 CSS 幻灯片自动播放

标签 javascript jquery html css function

我仅使用 CSS 制作了一个简单的幻灯片,单击单选按钮时,元素的边距会发生变化,以便显示所需的幻灯片。您可以在下面的代码片段中看到它是如何工作的。我还用 JavaScript 制作了这个幻灯片自动播放。该脚本每 3 秒检查列表中的下一个单选按钮。

现在我需要帮助才能使幻灯片自动播放循环,并在手动检查任何单选按钮时停止自动播放

$(document).ready(function() {

  function autoplay() {
$("input[name=radio-button]:checked").nextAll(':radio:first').prop('checked', true);
  };
  
  setInterval(autoplay, 3000);

});
body {
margin: 0;
padding: 0;
}

.slider {
  width: 300%;
  transition: margin 1s;
  height: 100px;
}

#radio-button1:checked ~ .slider {
  margin-left: 0%;
}

#radio-button2:checked ~ .slider {
  margin-left: -100%;
}

#radio-button3:checked ~ .slider {
  margin-left: -200%;
}

.slider-item {
  float: left;
  width: 33.33%;
  height: 100%;
}
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<input type="radio" name="radio-button" id="radio-button1" checked />
<input type="radio" name="radio-button" id="radio-button2" />
<input type="radio" name="radio-button" id="radio-button3" />

<div class="slider">
  <div class="slider-item" style="background: #F00"></div>
  <div class="slider-item" style="background: #0F0"></div>
  <div class="slider-item" style="background: #00F"></div>
</div>

最佳答案

创建一个 curr 变量,在区间内递增它并使用 Modulo % 将其循环回 0:

jQuery(function($) { // DOM ready and $ alias in scope

  var curr = 0;

  function autoplay() {
    curr = ++curr % 3; // Increment and Reset to 0 when 3
    $("[name=radio-button]")[curr].checked = true;
  }

  setInterval(autoplay, 3000);

});
body {
  margin: 0;
  padding: 0;
}

.slider {
  width: 300%;
  transition: margin 1s;
  height: 100px;
}

#radio-button1:checked~.slider {
  margin-left: 0%;
}

#radio-button2:checked~.slider {
  margin-left: -100%;
}

#radio-button3:checked~.slider {
  margin-left: -200%;
}

.slider-item {
  float: left;
  width: 33.33%;
  height: 100%;
}
<input type="radio" name="radio-button" id="radio-button1" checked />
<input type="radio" name="radio-button" id="radio-button2" />
<input type="radio" name="radio-button" id="radio-button3" />

<div class="slider">
  <div class="slider-item" style="background: #F00"></div>
  <div class="slider-item" style="background: #0F0"></div>
  <div class="slider-item" style="background: #00F"></div>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

更好的方法:

  • 溢出 super 父级,这样就不会出现滚动条
  • 使用 display: flex; 而不是丑陋 float 。
  • 使用 $('.slider').each( 这样您就可以在一个页面中拥有多个 slider !
  • 创建 anim() play()stop() 函数来控制发生的情况。
  • 使用 transform:transition 制作动画,因为过渡是 GPU 加速的。而边距则不需要,并且需要回流和重新绘制。
  • 使用 curr * -100 % 为变换设置动画
  • 在需要时使用 curr %= tot(模运算符)将 curr 索引环回至 0。
  • 为什么要手动创建按钮?手动创建幻灯片并让 JS 为您创建按钮。
  • 使用setInterval,将其存储到变量itv
  • 要停止自动动画,请使用 clearInterval(itv)
  • 使用 .hover(stop, play) 在 mouseenter 上停止并在 mouseleave 上自动播放

$('.slider').each(function(slider_idx) { // Use each, so you can have multiple sliders

  let curr = 0;             // Set current index
  let itv = null;           // The interval holder
  
  const $slider = $(this);
  const $nav    = $('.slider-nav', $slider);
  const $items  = $('.slider-items', $slider);
  const $item   = $('.slider-item', $slider);
  const tot = $item.length; // How many
  const btns = [...new Array(tot)].map((_, i) => $('<input>', {
    type: 'radio',
    name: `slider-btn-${slider_idx}`,
    checked: curr == i,
    change() { // On button change event
      curr = i; // Set current index to this button index
      anim();
    }
  })[0]);
    
  function anim() {
    $items.css({transform: `translateX(-${curr*100}%)`}); // Animate
    btns[curr].checked = true; // Change nav btn state
  }

  function play() {
    itv = setInterval(() => {
      curr = ++curr % tot; // increment curr and reset to 0 if exceeds tot
      anim(); // and animate!
    }, 3000); // Do every 3sec
  }
  
  function stop() {
    clearInterval(itv);
  }

  $nav.empty().append(btns);   // Insert buttons
  $slider.hover(stop, play);   // Handle hover state
  play();                      // Start autoplay!

});
/*QuickReset*/ * {margin: 0; box-sizing: border-box;}

.slider {
  position: relative;
  height: 100px;
}

.slider-overflow {
  overflow: hidden; /* use an overflow parent! You don't want scrollbars */
  height: inherit;
}

.slider-items {
  display: flex; /* Use flex */
  flex-flow: row nowrap;
  height: inherit;
  transition: transform 1s; /* Don't use margin, use transform */
}

.slider-item {
  flex: 0 0 100%;
  height: inherit;
}

.slider-nav {
  position: absolute;
  width: 100%;
  bottom: 0;
  text-align: center;
}
<div class="slider">

  <div class="slider-overflow">
    <div class="slider-items"> <!-- This one will transition -->
      <div class="slider-item" style="background:#0bf;">curr = 0</div>
      <div class="slider-item" style="background:#fb0;">curr = 1</div>
      <div class="slider-item" style="background:#f0b;">curr = 2</div>
    </div>
  </div>
  
  <div class="slider-nav">
    <!-- JS will populate buttons here -->
  </div>
  
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

因此,DIV 元素 .slider-nav.slider-overflow 都需要位于公共(public)父级 .slider 内部 - 这样在与这些元素进行任何交互后,我们正确地停止(暂停)自动动画。

关于javascript - 使用 JavaScript 启用 CSS 幻灯片自动播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60660673/

相关文章:

javascript - Codepen modernizr.js - 404 错误

javascript - 在 Google 表格脚本中获取值时的最佳实践

JQuery/CSS - 我如何设置 imagem 全尺寸的 div

javascript - 使用 jquery 跟踪复选框事件

javascript - 如何在另一列上显示html表格的计算

javascript - 除表头外的表无法正常工作 html

javascript - 将高度设置为零后,CSS 转换失败

javascript - 在 Reactjs 中检查整个组件中的用户不活动状态

javascript - 将图像添加到 svg -> tspan 标记时遇到问题

javascript - 修复了页面重新加载后顶部导航消失的问题