javascript - 根据选中的单选按钮显示幻灯片

标签 javascript

我有一个 slider ,里面有 6 张幻灯片。我的目标是,如果选中单选按钮 id="male",则仅显示前 3 张幻灯片;如果当前选中 id="female"按钮,则仅显示最后 3 张幻灯片。我尝试将数组拼接成两半并根据选中的按钮设置幻灯片索引,但没有帮助。这是我的 HTML 代码:

   function skinSlider() {
        let slideIndex = 1,
          female = document.getElementById('female'),
          male = document.getElementById('male'),
          skinSlider = document.getElementsByClassName('skin')[0],
          skinSliderItem = document.getElementsByClassName('skin-color'),
          prev = skinSlider.querySelector('.prev'),
          next = skinSlider.querySelector('.next');

        showSlides(slideIndex);

        function plusSlides(n) {
          showSlides(slideIndex += n);
        }

        prev.addEventListener('click', () => {
          plusSlides(-1);
        });

        next.addEventListener('click', () => {
          plusSlides(1);
        });

        function showSlides(n) {
          // if (female.checked && slideIndex < 4) {
          //   slideIndex = 4;
          // }
          if (n > skinSliderItem.length) {
            slideIndex = 1;
          }
          if (n < 1) {
            slideIndex = skinSliderItem.length;
          }

          for (let i = 0; i < skinSliderItem.length; i++) {
            skinSliderItem[i].style.display = 'none';
          }

          skinSliderItem[slideIndex - 1].style.display = 'block';

          let personSkin = document.getElementById('person-skin');
          personSkin.style.background = `url('./img/skin/skin-${slideIndex}.png') center no-repeat`;
          personSkin.style.backgroundSize = 'cover';
        }
      };
<div class="radio">
      <input value="male" id="male" name="sex" type="radio">
      <label for="sex">Male</label>
      <input value="female" id="female" checked name="sex" type="radio">
      <label for="sex">Female</label>
     </div>
     <div class="custom-style">
	<div class="style-text">
	 Choose skin color
	</div>
	<div class="skin">
	<div class="prev">
	 <i class="flaticon-left-arrow"></i>
	</div>
	<div class="skin-color skin-color-1"></div>
	<div class="skin-color skin-color-2"></div>
	<div class="skin-color skin-color-3"></div>
	<div class="skin-color skin-color-4"></div>
	<div class="skin-color skin-color-5"></div>
	<div class="skin-color skin-color-6"></div>
	<div class="next">
	 <i class="flaticon-right-arrow"></i>
	</div>
      </div>

   

如有任何帮助,我们将不胜感激。

最佳答案

我认为这大致可以满足您的需求。不幸的是, slider 在向右移动时会“回绕”,而在向左移动时则简单地停在下限处。但我会将其作为对您的额外挑战。 :-)

  function skinSlider() {
    let slideIndex = 1,
      female = document.getElementById('female'),
      male = document.getElementById('male'),
      skinSlider = document.getElementsByClassName('skin')[0],
      skinSliderItem = document.getElementsByClassName('skin-color'),
      prev = skinSlider.querySelector('.prev'),
      next = skinSlider.querySelector('.next');

    showSlides(slideIndex);

    function plusSlides(n) {
      showSlides(slideIndex += n);
    }

    prev.addEventListener('click', () => {
      plusSlides(-1);
    });

    next.addEventListener('click', () => {
      plusSlides(1);
    });
    
    female.addEventListener('click', () => {
      showSlides(slideIndex);
    });
    
    male.addEventListener('click', () => {
      showSlides(slideIndex);
    });

    function showSlides(n) {
      if (slideIndex > skinSliderItem.length) {
        slideIndex = 1;
      }
      
      if (slideIndex < 1) {
        slideIndex = skinSliderItem.length;
      }
      
      if (female.checked && slideIndex < 4) {
        slideIndex = 4;
      } else if (male.checked && slideIndex > 3) {
        slideIndex = 1;
      }

      for (let i = 0; i < skinSliderItem.length; i++) {
        skinSliderItem[i].style.display = 'none';
      }
      
      skinSliderItem[slideIndex - 1].style.display = 'block';
    }
  };
  
  skinSlider();
 <div class="radio">
  <input value="male" id="male" name="sex" type="radio">
  <label for="sex">Male</label>
  <input value="female" id="female" checked name="sex" type="radio">
  <label for="sex">Female</label>
 </div>
 <div class="custom-style">
<div class="style-text">
 Choose skin color
</div>
<div class="skin">
<div class="prev">
 &lt;
</div>
<div class="skin-color skin-color-1">1</div>
<div class="skin-color skin-color-2">2</div>
<div class="skin-color skin-color-3">3</div>
<div class="skin-color skin-color-4">4</div>
<div class="skin-color skin-color-5">5</div>
<div class="skin-color skin-color-6">6</div>
<div class="next">
 &gt;
</div>
  </div>

顺便说一句,标签元素的 for 属性应使用关联输入的 ID,而不是复选框组的名称。

关于javascript - 根据选中的单选按钮显示幻灯片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57222117/

相关文章:

javascript - Python BeautifulSoup 抓取具有保护的网页

javascript - 随机播放 jQuery 选择

javascript - 模板助手中的 Meteor QuickForm 异常 : Error: Recipes is not in the window scope

javascript - 如何从使用 addEventListener 添加的事件的元素中删除类?

javascript - 如何捕获 fetch 的 then() 中的 json 文本

javascript - 单击链接时关闭 Canvas 外移动菜单(JS)

javascript - 甲骨文顶点 : Color the values in column of tabular form

javascript - 拼接数组不重新渲染表格行Vuejs

javascript - 计数 tbody 介于两个之间 `theads`

php - 设置 JQuery 选择不执行任何操作