原生JS实现 ‘Tab栏切换’,‘手风琴’,‘轮播图’效果

1.小天使跟随鼠标效果

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    body {
      margin: 0;
      padding: 0;
      height: 5000px;
      background-image: linear-gradient(0deg, purple, yellowgreen);
    }

    #box {
      position: fixed;
      left: 0;
      top: 0;
    }
  </style>
</head>

<body>
  <img src="./images/angel.gif" alt="小天使" id="box">
  <script>
    // 获取小天使,因为他要移动
    var box = document.querySelector("#box");
    // 获取 body 因为要绑定事件
    var body = document.querySelector("body");

    body.addEventListener("mousemove", function (event) {
      // 获取鼠标坐标值,根据浏览器可视区域获取鼠标坐标值
      var x = event.clientX;
      var y = event.clientY;
      // console.log(x,y);
      // 把坐标值赋值给小天使 top left 样式中.
      box.style.left = x + "px";
      box.style.top = y + "px";
    });

    // 小结:
    //      1. 查找元素
    //      2. 事件绑定,addEventListener
    //      3. 事件对象,获取鼠标坐标值
    //      4. 样式固定定位
    //      5. style 属性修改样式
  </script>
</body>

</html>

效果:

2.Tab栏切换

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }
    ul{
      list-style: none;
    }
    .wrapper{
      width: 100px;
      height: 475px;
      /* margin: 0 auto; */
      margin-top: 100px;
    }
    .tab {
      border: 1px solid #ddd;
      border-bottom: 0;
      height: 36px;
      width: 320px;
    }
    .tab li{
      position: relative;
      float: left;
      width: 80px;
      height: 34px;
      line-height: 34px;
      text-align: center;
      cursor: pointer;
      border-top: 4px solid #fff;
    }
    .tab span {

    }

    .products {
      width: 1002px;
      border: 1px solid #ddd;
      height: 476px;
    }

    .products .main{
      float: left;
      display: none;
    }

    .products .main.selected{
      display: block;
    }
    .tab li.active{
      border-color: red;
      border-bottom: 0;
    }

  </style>
</head>
<body>
  <div class="wrapper">
    <!-- tab栏选项卡部分 -->
    <ul class="tab">
      <!-- 给每一个 li 添加索引值的自定义属性,目的为了切换对应的分区 -->
      <li data-index="0" class="tab-item active">国际大牌</li>
      <li data-index="1" class="tab-item">国妆名牌</li>
      <li data-index="2" class="tab-item">清洁用品</li>
      <li data-index="3" class="tab-item">男士精品</li>
    </ul>
    <!-- tab栏内容部分 -->
    <div class="products">
        <div class="main selected">
            <a href="###"><img src="images/guojidapai.jpg"  /></a>
        </div>
        <div class="main">
            <a href="###"><img src="images/guozhuangmingpin.jpg"  /></a>
        </div>
        <div class="main">
            <a href="###"><img src="images/qingjieyongpin.jpg"  /></a>
        </div>
        <div class="main">
            <a href="###"><img src="images/nanshijingpin.jpg"  /></a>
        </div>
    </div>
  </div>

  <script>
    window.addEventListener("load", function(){
      // 1.查找元素
      // All 查找全部元素
      var tabItems = document.querySelectorAll(‘.tab-item‘);
      var mains = document.querySelectorAll(‘.main‘);

      // 2. 添加事件,涉及到多个元素,所以我们需要遍历添加
      for(var i=0; i<tabItems.length; i++){
        // 2.1 给所有元素添加鼠标移入事件
        tabItems[i].addEventListener("mouseover", function(){
          // 3.1 切换选项卡
          // 3.1.1 排除所有
          for(var i=0; i<tabItems.length; i++){
            // 1.1 把所有选项卡的active类名先清除掉
            tabItems[i].classList.remove(‘active‘);
          }
          // 3.1.2 确立当前,给当前点击的元素添加active类名
          this.classList.add("active");

          // 3.2 切换商品
          // 3.2.1 切换所有商品的类名
          for(var i=0; i<mains.length; i++){
            // 移出类名,隐藏所有盒子
            mains[i].classList.remove("selected");
          }
          // 3.2.2 确立一个,怎么把选项卡和商品对应起来
          // 1 获取当前li标签存放的自定义索引值
          var index = this.dataset.index;
          console.log(index);
          // 根据索引值给第几个 商品分区添加selected类名,添加类名盒子就可以显示
          mains[index].classList.add("selected");
        })
      }
    })
  </script>
</body>
</html>

效果:

3. 手风琴效果

<!DOCTYPE html>
<html>

<head lang="en">
  <meta charset="UTF-8">
  <title></title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    /* 去掉li标签自带的样式 点 */
    ul {
      list-style: none;
    }

    .wrap {
      width: 1000px;
      margin: 50px auto;
    }

    .slider {
      width: 1000px;
      height: 400px;
      border: 1px solid red;
      overflow: hidden;
    }

    .slider li {
      width: 200px;
      height: 400px;
      float: left;
      cursor: pointer;
      /* 过渡属性 */
      transition: all .4s;
    }
  </style>

  <script>
    /*
      需求:
        1.动态的给所有的li,添加背景图片
        2.鼠标移入,让当前变宽,让其他变窄
        3.鼠标移入,恢复原状
    */
    // 浏览器加载事件   当浏览器资源加载完毕后自动执行。
    window.addEventListener("load", function () {
      // 查找元素 所有li标签   伪数组
      var lis = document.querySelectorAll(".slider li");
      // for循环遍历 让所有li标签都可以作用到
      for (var i = 0; i < lis.length; i++) {
        // 给每一个li标签的绑定一个鼠标移入的事件
        lis[i].addEventListener("mouseover", function () {
          // 排他事件  1.1 排除其他
          for (var i = 0; i < lis.length; i++) {
            // 让li标签的宽度变成50像素
            lis[i].style.width = (1000 - 800) / 4 + "px";
          }
          // 排他事件  1.2 确立当前  鼠标移入的那一个li标签变成800像素
          this.style.width = 800 + "px";
        })
        // 给li标签添加一个鼠标移出的事件
        lis[i].addEventListener("mouseout", function () {
          // for循环遍历
          for (var i = 0; i < lis.length; i++) {
            // 当鼠标移出的时候让所有li标签的宽度都变成200像素
            lis[i].style.width = 200 + "px";
          }
        });
      }
    })
  </script>
</head>

<body>
  <div class="wrap">
    <ul id="slider" class="slider">
      <li>
        <img src="./images/mi1.jpg" >
      </li>
      <li>
        <img src="./images/mi2.jpg" >
      </li>
      <li>
        <img src="./images/mi3.jpg" >
      </li>
      <li>
        <img src="./images/mi4.jpg" >
      </li>
      <li>
        <img src="./images/mi5.jpg" >
      </li>
    </ul>
  </div>
</body>

</html>

效果:

4.轮播图效果

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }
    ul {
      list-style: none;
    }
    .slider{
      width: 730px;
      height: 454px;
      padding: 8px;
      border: 1px solid green;
      margin: 100px auto;
    }

    .inner{
      position: relative;
      overflow: hidden;
      height: 454px;
    }

    .imglist{
      width: 700%;
      position: absolute;
      left: 0;
      transition: all .4s;
    }
    .imglist img{
      width: 730px;
    }
    li {
      float: left;
    }
    .list {
      position: absolute;
      bottom: 20px;
      left: 50%;
      transform: translateX(-50%);
    }
    .list i{
      width: 20px;
      height: 20px;
      border-radius: 50%;
      background-color: #fff;
      color: #333;
      float: left;
      font-style: normal;
      line-height: 20px;
      font-size: 14px;
      text-align: center;
      margin-right: 10px;
      cursor: pointer;
    }
    .list i:last-child{
      margin-right: 0;
    }
    .list i.current{
      background-color: lightcoral;
      color: #fff;
    }

    .arrow {
      position: absolute;
      width: 100%;
      top: 50%;
      margin-top: -30px;
    }

    .arrow-left,
    .arrow-right{
      width: 30px;
      height: 60px;
      position: absolute;
      font: 20px/60px "consolas";
      color: #fff;
      background-color: rgba(0,0,0, .3);
      text-align: center;
      cursor: pointer;
    }
    .arrow-right{
      right: 0;
    }

  </style>
</head>

<body>
  <div class="slider" id="slider">
    <div class="inner" id="inner">
      <ul class="imglist" id="imglist">
        <li><a href="#"><img src="images/1.jpg" ></a></li>
        <li><a href="#"><img src="images/2.jpg" ></a></li>
        <li><a href="#"><img src="images/3.jpg" ></a></li>
      </ul>
      <div class="list">
        <i class="current">1</i>
        <i>2</i>
        <i>3</i>
      </div>
      <dv class="arrow">
        <span class="arrow-left">&lt;</span>
        <span class="arrow-right">&gt;</span>
      </dv>
    </div>
  </div>

  <script>
    /*
      需求:
        1 点击序号
          能切换序号
          能切换图片
        2 点击左箭头
          能切换序号
          能切换图片
        3 点击右箭头
          能切换序号
          能切换图片
        4 自动播放功能
          能切换序号
          能切换图片
        5 鼠标移入停止播放功能
        6 鼠标移出还原自动播放功能
     */

     // 1 查找元素
     // 查找全部小圆点
     var dots = document.querySelectorAll(‘.list i‘);
     var arrowLeft = document.querySelector(".arrow-left");
     var arrowRight = document.querySelector(".arrow-right");
     var slider = document.querySelector(".slider");
     var imgList = document.querySelector(".imgList");
     var inner = document.querySelector(".inner");
     var styleObj = window.getComputedStyle(inner);
     var imgWidth = parseInt(styleObj.width);
     console.log(imgWidth);

     var index = 0;
     //点击序号切换序号和图片
     for(var i=0; i<dots.length; i++){
       // 把当前循环的i直接设置到元素的data-index自定义属性上
       dots[i].dataset.index = i;
       dots[i].addEventListener("click", function(){
         // 1.1能切换序号 - 排他思想
         // 排除所有
         for(var i=0; i<dots.length; i++){
           dots[i].classList.remove(‘current‘);
         }
         // 确立当前
         this.classList.add(‘current‘);
         // 切换图片
         // 获取当前点击小圆点的自定义索引值
         var index = this.dataset.index;
         // 计算ul要移动数据,赋值给left
         imglist.style.left = -1 * imgWidth * index + "px";
         console.log(imglist.style.left);
       });
     }

     /*
      点击左箭头切换序号和图片
      */
      arrowLeft.addEventListener(‘click‘, function(){
        // 注意索引值的边界,如果索引值为0,点击的时候变成最后圆点的索引值
        if(index===0){
          index = dots.length -1;
        }else {
          // 其他情况下索引值减少
          index--;
        }
        console.log(index);
        // 1.1 能切换序号
        for(var i=0; i<dots.length; i++){
          dots[i].classList.remove(‘current‘);
        }
        // 根据索引值,给第几个小圆点添加样式
        dots[index].classList.add(‘current‘);
        // 1.2 能切换图片
        imglist.style.left = -1 * imgWidth * index + ‘px‘;
      });

      function rightMove(){
         // index边界判断
         if(index === dots.length -1){
          index = 0;
        }else{
          index++;
        }
        // 小圆点处理
        for(var i=0; i<dots.length; i++){
          dots[i].classList.remove(‘current‘);
        }
        dots[index].classList.add(‘current‘);
        // 换图片
        imglist.style.left = -1 * imgWidth * index + "px";
      }

      arrowRight.addEventListener(‘click‘, rightMove);

      // 自动播放的功能
      var timer = setInterval(rightMove, 2000);

      // 鼠标移入分区,清除定时器
      slider.addEventListener("mouseover", function(){
        clearInterval(timer);
      });

      // 鼠标移出分区,继续启动定时器
      slider.addEventListener(‘mouseout‘, function(){
        timer = setInterval(rightMove, 2000);
      })
  </script>
</body>

</html>

效果:

原文地址:https://www.cnblogs.com/sauronblog/p/11518823.html

时间: 2024-10-14 05:13:12

原生JS实现 ‘Tab栏切换’,‘手风琴’,‘轮播图’效果的相关文章

告别组件之教你使用原生js和css写移动端轮播图

在工作中由于项目需要要写一个轮播图,本想使用组件直接调用实现快速开发,但是一想到自己经常使用组件但是让自己手写的话确实一点都不会. 一个不会手写组件的前端程序员不是一个好程序员!于是打算自己手写一个. 老规矩,首先看一下最终效果,这个最终可以实现定时自动播放,触摸滑动,手动修改下面横条效果等功能. 项目中使用到的HTML代码如下 <div class="banner"> <ul class="clearfix"> <li><

使用原生js实现轮播图效果

知乎原文 我的博客 微信公众号这几天在逛网站的时候,发现很多网站都有轮播图这个效果,所以我就仿照小米的官网用原生js写了一个轮播图效果,希望大家喜欢.这是我发布在github上的最后实现的效果:https://heternally.github.io/... 下面我简单跟大家说一下我实现该效果的过程,如果有什么错误的地方,欢迎大家说出来,以方便大家互相学习. 我相信前面简单的html+css大家应该都会,我这里就不说了,简单给大家展示一下代码: HTML部分 <div id="wrap&q

js实现轮播图效果(附源码)--原生js的应用

1.js实现轮播图效果 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="Author" content="奇客艺术"> <meta name="keyword" content="关键字"> <meta name=

JS学习笔记--轮播图效果

希望通过自己的学习收获哪怕收获一点点,进步一点点都是值得的,加油吧!!! 本章知识点:index this for if else 下边我分享下通过老师教的方式写的轮播图,基础知识实现: 1.css代码 <style> ul, ol { padding:0; margin:0; } li { list-style:none; } #box { width:600px; height:350px; border:10px solid #ccc; margin:0 auto; position:r

Html5如何快速在页面中写出多个轮播图效果

我们在做项目的过程中,有时候客户需求要求你在同一个页面中,写几个不同样式的轮播图效果,那么如何快速实现呢?(要知道若果你每个轮播图都要用原生javascript写的话,会很麻烦,代码也不够简洁) 这里我们就可以借助插件来实现这一功能,swiper.js就是一个专门处理轮播图效果的js库,下面举例来说明: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"&g

花瓣网轮播图效果

没有加上定时器效果,仅仅能手动进行图片的切换 效果图: index.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN""> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>index</title> &

AngularJS:实现轮播图效果

要实现这个功能,可以https://github.com/sroze/ngInfiniteScroll这个第三方控件实现的.实现步骤如下: 1. 下载ng-infinite-scroll.js程序http://sroze.github.io/ngInfiniteScroll/ 目前版本是1.0.0 2. 如果你是用的jQuery2.0以上版本,还需要修改ng-infinite-scroll.js程序,将所有的将所有的$window.xxx改为$(window).xxx, elem.xxx改为$(

实现比较简单的轮播图效果

实现简单的轮播图效果. 废话不多说,我们开始. HTML和CSS较为简单,不在这里做赘述.简单的给大家一个HTML代码. <div class="carousel"> <div id="goLeft"></div> <ul> <li><img src="" /></li> <li><img src="" /></l

模仿轮播图效果

<!doctype html><html lang="zh"><head> <meta charset="UTF-8"> <title>手写轮播图效果</title> <style> #imgsDiv{position: relative;height: 400px;} .picDiv{ position: absolute; top:0; left:0; width:100%; h