TWEEN动画、JQUERY、ES6 — 2、轮播图-渐隐渐现版本

2023-05-16

分析

目录

编译并压缩less(需要先npm安装less)

banner.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <!--development-->
    <!--<link rel="stylesheet/less" href="css/banner.less">
    <script src="js/less-2.5.3.min.js"></script>-->

    <!--production-->
    <link rel="stylesheet" href="css/banner.min.css">
</head>
<body>
<div class="container" id="container">
    <!--WRAPPER:控制轮播图切换的区域-->
    <ul class="wrapper">
        <!--<li class="slide">
            <img src="" data-img="img/banner1.jpg" alt="">
        </li>-->
    </ul>
    <!--FOCUS:控制焦点-->
    <ul class="focusBox clearfix">
        <!--<li class="select"></li>
        <li></li>
        <li></li>
        <li class="last"></li>-->
    </ul>
    <!--ARROW:控制切换的箭头-->
    <a href="javascript:;" class="arrow arrowLeft"></a>
    <a href="javascript:;" class="arrow arrowRight"></a>
</div>

<!--IMPORT JS-->
<script src="js/utils.min.js"></script>
<script src="js/animate.min.js"></script>
<script src="js/banner.js"></script>
</body>
</html>
复制代码

banner.less

@import "reset";

/*--BANNER--*/
.container {
  position: relative;
  margin: 20px auto;
  width: 1000px;
  height: 300px;
  overflow: hidden;
  text-align: center;

  .wrapper {
    position: relative;
    height: 300px;
    background: url("../img/default.gif") no-repeat center center #EEE;

    .slide {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;

      //=>init style
      opacity: 0;
      filter: alpha(opacity=0);
      z-index: 0;

      img {
        display: none;
        width: 100%;
        height: 100%;
      }
    }
  }

  .focusBox {
    position: relative;
    top: -40px;
    z-index: 999;
    display: inline-block;
    padding: 4px 8px;
    height: 12px;
    background: rgba(0, 0, 0, .2);
    border-radius: 12px;

    li {
      float: left;
      margin-right: 10px;
      width: 12px;
      height: 12px;
      border-radius: 50%;
      background: #FFF;
      cursor: pointer;

      &.last {
        margin-right: 0;
      }

      &.select {
        background: #DB192A;
      }
    }
  }

  .arrow {
    display: none;
    position: absolute;
    top: 50%;
    z-index: 999;
    margin-top: -30px;
    width: 30px;
    height: 60px;
    background: url("../img/pre.png") no-repeat;
    opacity: 0.3;
    filter: alpha(opacity=30);

    &:hover {
      opacity: 1;
      filter: alpha(opacity=100);
    }

    &.arrowLeft {
      left: 0;
      background-position: 0 0;
    }

    &.arrowRight {
      right: 0;
      background-position: -48px 0;
    }
  }
}
复制代码

reset.less

body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, button, input, textarea, th, td {
  margin: 0;
  padding: 0
}

body {
  font-size: 12px;
  font-style: normal;
  font-family: "\5FAE\8F6F\96C5\9ED1", Helvetica, sans-serif
}

small {
  font-size: 12px
}

h1 {
  font-size: 18px
}

h2 {
  font-size: 16px
}

h3 {
  font-size: 14px
}

h4, h5, h6 {
  font-size: 100%
}

ul, ol {
  list-style: none
}

a {
  text-decoration: none;
  background-color: transparent
}

a:hover, a:active {
  outline-width: 0;
  text-decoration: none
}

table {
  border-collapse: collapse;
  border-spacing: 0
}

hr {
  border: 0;
  height: 1px
}

img {
  border-style: none
}

img:not([src]) {
  display: none
}

svg:not(:root) {
  overflow: hidden
}

html {
  -webkit-touch-callout: none;
  -webkit-text-size-adjust: 100%
}

input, textarea, button, a {
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)
}

article, aside, details, figcaption, figure, footer, header, main, menu, nav, section, summary {
  display: block
}

audio, canvas, progress, video {
  display: inline-block
}

audio:not([controls]), video:not([controls]) {
  display: none;
  height: 0
}

progress {
  vertical-align: baseline
}

mark {
  background-color: #ff0;
  color: #000
}

sub, sup {
  position: relative;
  font-size: 75%;
  line-height: 0;
  vertical-align: baseline
}

sub {
  bottom: -0.25em
}

sup {
  top: -0.5em
}

button, input, select, textarea {
  font-size: 100%;
  outline: 0
}

button, input {
  overflow: visible
}

button, select {
  text-transform: none
}

textarea {
  overflow: auto
}

button, html [type="button"], [type="reset"], [type="submit"] {
  -webkit-appearance: button
}

button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner {
  border-style: none;
  padding: 0
}

button:-moz-focusring, [type="button"]:-moz-focusring, [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring {
  outline: 1px dotted ButtonText
}

[type="checkbox"], [type="radio"] {
  box-sizing: border-box;
  padding: 0
}

[type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button {
  height: auto
}

[type="search"] {
  -webkit-appearance: textfield;
  outline-offset: -2px
}

[type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration {
  -webkit-appearance: none
}

::-webkit-input-placeholder {
  color: inherit;
  opacity: .54
}

::-webkit-file-upload-button {
  -webkit-appearance: button;
  font: inherit
}

.clearfix:after {
  display: block;
  height: 0;
  content: "";
  clear: both
}
复制代码

banner.json

[
  {
    "id": 1,
    "img": "img/banner1.jpg",
    "desc": "海,你好",
    "link": "http://www.baidu.cn/"
  },
  {
    "id": 2,
    "img": "img/banner2.jpg",
    "desc": "梦想起飞",
    "link": "http://www.baidu.cn/"
  },
  {
    "id": 3,
    "img": "img/banner3.jpg",
    "desc": "把握未来,掌握先机",
    "link": "http://www.baidu.cn/"
  },
  {
    "id": 4,
    "img": "img/banner4.jpg",
    "desc": "好好学习",
    "link": "http://www.baidu.cn/"
  }
]
复制代码

banner.js

// var bannerRender = (function () {


//     return {
//         init: function () {

//         }
//     }
// })();

// bannerRender.init();





var bannerRender = (function () {
    var container = document.getElementById('container'),
        wrapper = utils.getElementsByClassName('wrapper', container)[0],
        focusBox = utils.getElementsByClassName('focusBox', container)[0],
        arrow = utils.children(container, 'a'),
        arrowLeft = arrow[0],
        arrowRight = arrow[1];
    var bannerData = null,
        wrapperList = null,
        focusList = null,
        wrapperImgList = null;

    //=>1、ajax获取数据
    function queryData() {
        var xhr = new XMLHttpRequest();
        xhr.open('get', 'json/banner.json', false);
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                bannerData = utils.toJSON(xhr.responseText);
            }
        };
        xhr.send(null);
    }

    //=>2、绑定数据
    function bindData() {
        if (!bannerData) return;
        var str = ``,
            strFocus = ``;
        for (var i = 0; i < bannerData.length; i++) {
            var item = bannerData[i];
            str += `<li class="slide">
                <img src="" data-img="${item.img}" alt="">
            </li>`;

            strFocus += `<li class="${i === bannerData.length - 1 ? 'last' : ''}"></li>`;
        }
        wrapper.innerHTML = str;
        focusBox.innerHTML = strFocus;

        //=>5、数据绑定完需要获取所有的LI以及IMG,后面会用到
        wrapperList = wrapper.getElementsByTagName('li');
        focusList = focusBox.getElementsByTagName('li');
        wrapperImgList = wrapper.getElementsByTagName('img');
    }

    //=>6、设置默认展示
    function initDefault(index) {
        index = index || 0;
        utils.css(wrapperList[index], {
            opacity: 1,
            zIndex: 1
        });
        focusList[index].className += ' select';//=>一定是加等于(因为部分LI有自己的原有样式)
    }

    //=>8、图片延迟加载
    function computed() {
        if (!wrapperImgList) return;
        for (var i = 0; i < wrapperImgList.length; i++) {
            var curImg = wrapperImgList[i];
            if (curImg.isLoad) continue;
            lazyImg(curImg);
        }
    }

    function lazyImg(curImg) {
        curImg.isLoad = true;
        var tempImg = new Image;//创建一个临时
        tempImg.onload = function () {
            curImg.src = this.src;
            curImg.style.display = 'block';
            tempImg = null;
        };
        tempImg.src = curImg.getAttribute('data-img');
    }

    //=>10、实现轮播图的自动切换
    var step = 0,//->记录当前展示的是第几个SLIDE(索引)
        prevStep = 0,//->记录上一个展示的SLIDE索引
        autoInterval = 2000,//->自动切换的时间因子
        autoTimer = null,//->自动切换的定时器
        count = 0;//->总共的SLIDE数量

    
    function autoMove() {
        step++;
        if (step === count) {
            step = 0;
        }
        change();
    }

    //=>轮播图公共切换方法
    function change() {
        if (step === prevStep) return;
        var curSlide = wrapperList[step],
            preSlide = wrapperList[prevStep];

        //->当前展示的SLIDE层级变为1 & 上一个展示的SLIDE层级变为0
        utils.css(curSlide, 'zIndex', 1);
        utils.css(preSlide, 'zIndex', 0);

        //->让当前展示的SLIDE透明度从0~1(动画)
        animate({
            curEle: curSlide,
            target: {opacity: 1},
            duration: 200,
            callBack: function () {
                //=>上一个SLIDE隐藏(透明度为0)
                utils.css(preSlide, 'opacity', 0);
            }
        });

        //->当前展示的这一个SLIDE就是下一次切换的上一次SLIDE
        prevStep = step;

        //=>14、切换的时候要执行selectFocus让其焦点对齐
        selectFocus();
    }

    //=>13、焦点对齐的方法(这里用的是循环所有的焦点给当前索引加样式);还有种方式:可以用清除上一个焦点样式给当前焦点加样式
    function selectFocus() {
        for (var i = 0; i < focusList.length; i++) {
            var item = focusList[i];
            if (i === focusList.length - 1) {//最后一个焦点有last做特殊处理
                item.className = i === step ? 'last select' : 'last';
                continue;
            }
            item.className = i === step ? 'select' : '';
        }
    }

    //=>15、鼠标划入划出BANNER区域控制自动切换的暂停和开始 用onmouseout和onmouseover有问题,后面会写
    function bindMouseEvent() {
        container.onmouseenter = function () {
            clearInterval(autoTimer);
            arrowLeft.style.display = arrowRight.style.display = 'block';//鼠标滑进来左右箭头显示
        };
        container.onmouseleave = function () {
            autoTimer = setInterval(autoMove, autoInterval);
            arrowLeft.style.display = arrowRight.style.display = 'none';//鼠标离开左右箭头隐藏
        };
    }

    //=>16、滑过焦点实现切换
    function bindFocus() {
        for (var i = 0; i < focusList.length; i++) {
            focusList[i].myIndex = i;
            focusList[i].onmouseenter = function () {
                step = this.myIndex;
                change();
            }
        }
    }

    //=>17、点击左右按钮切换
    function bindArrow() {
        arrowLeft.onclick = function () {
            step--;
            if (step < 0) {
                step = count - 1;
            }
            change();
        };
        arrowRight.onclick = autoMove;
    }

    return {
        init: function () {
            // 9、执行computed延迟加载
            // setTimeout(computed,500);//可以看延迟加载效果
            window.onload = computed;//=>当页面加载完成后做图片的延迟加载(放在上面也无所谓,因为事件绑定是异步编程:写在上面,也是需要等下面的代码都加载完成,页面才加载完成,才会触发LOAD事件)
            // 3、执行queryData()
            queryData();
            // 4、执行bindData()
            bindData();
            // 7、执行
            initDefault(step);

            //=>实现轮播图的切换
            count = bannerData.length;//11、获取总共的SLIDE数量
            autoTimer = setInterval(autoMove, autoInterval);//12、执行autoMove

            //=>18、其它切换方式
            bindMouseEvent();
            bindFocus();
            bindArrow();
        }
    }
})();
bannerRender.init();
复制代码

其余文件同之前封装的库(动画库animate和dom库utils)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TWEEN动画、JQUERY、ES6 — 2、轮播图-渐隐渐现版本 的相关文章

  • 禁用输入中的空格,并允许后退箭头?

    我试图禁用用户名文本字段中的空格 但是我的代码也禁用后退箭头 有什么办法也允许后退箭头吗 function var txt input UserName var func function txt val txt val replace s
  • 使用 parsley.js 支持每个字段多个自定义错误消息

    我正在尝试使用 parsley js 验证一个简单的表单 并且我对 parsley js 非常初学者 我想使用 window ParsleyValidator addValidator 方法在一个自定义验证方法中显示多个错误消息 所以我尝试
  • 在 javascript 中访问 ajax POST 响应

    我正在从 javascript 函数发出 ajax POST 请求 function UpdateMetrics ajax type POST url MyHandler ashx Param1 value1 data contentTyp
  • 使用JQuery检查元素是否有边框?

    所以我正在玩 el css 尝试确定元素是否有边框 我用 css border style solid 设置边框 这是可行的 但实际上它设置了 4 种单独的样式 border right style border left style bo
  • 使用 javascript 将 html 文本渲染为位图,无需服务器端代码

    我需要使用 javascript 代码来转换 html 中的文章 帖子 以便最终用户以位图的形式查看 有没有办法在没有服务器端代码的情况下做到这一点 example p testing text here p 您可以使用例如html2can
  • 如何获取传单标记簇中点击事件的图块?

    这是我的代码 function onMapClick e e originalEvent defaultPrevented true var orig e originalEvent console log orig target map
  • 如何在每个组件完成加载后在 Angular 2 中运行 jquery 函数

    我已经尝试了所有生命周期挂钩 但无法实现所需的结果 我需要的结果是触发一个函数 该函数在加载每个元素 组件 后初始化用于单个页面上不同元素的许多 jquery 插件 假设你有这个结构 主页 滑块 小部件 产品旋转器 ETC 这些元素中的每一
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • 限制 jQuery id 字符串吗?

    简而言之 我的问题是字符串在 jQuery 中作为可搜索 id 或可搜索内容有什么限制 更新 我得到了 ID 部分 但不是为什么我什至无法使用该字符串搜索 html 内容 对于任何愿意告诉我一个正则表达式来将模式从 MM dd yy HH
  • Jquery 两个字段的时间差(以小时为单位)

    我的表单中有两个字段 用户可以在其中选择输入时间 start time end time 我想在更改这些字段时重新计算另一个字段的值 我想做的是获取两次之间的小时数 例如 如果我的开始时间为 5 30 结束时间为 7 50 我想将结果 2
  • 如何设置视频文件的预览,从输入类型='文件'中选择

    在我的模块之一中 我需要从 input type file 浏览视频 之后我需要在开始上传之前显示选定的视频 我使用基本的 HTML 标签来显示 但它不起作用 这是代码 document on change file multi video
  • JSON 数据中的 jQGrid celledit 显示 URL 未设置警报

    我需要从服务器加载 JSON 并且希望用户能够单击并编辑该值 但是当他们编辑时 它不应该调用服务器 我的意思是我不会立即更新 所以我不想编辑网址 所以我尝试了 ClientArray 但它仍然显示 Url is not set 警报框 但是
  • 如何找到div的第一个直接子元素

    这应该很容易 但我做不到 我有一个 id 为 LeftScrollableDiv 的 div 元素 我试图找到它下面的第一个子元素 LeftScrollableDiv first child div table table div 但结果为
  • `attr('checked', false)` 不适用于 IE6

    正如标题所说 我无法获取 attr checked false 在 IE6 上工作 我正在克隆一些 HTML 然后在将新克隆的 HTML 分配给元素之前 我会运行它并取消选中新克隆部分中的所有复选框 这在除 IE 6 之外的所有浏览器中都可
  • Jquery获取选中的复选框

    您好 我想获取页面中选定复选框的列表 实际上我真正需要的是获取复选框旁边的元素的文本 该元素是一个 html 元素 li 代码如下 但它不起作用 这是我当前的 jQuery document ready function target cl
  • 点击加载谷歌地图

    我想在单击链接后显示 Google 地图 我已经尝试过以下方法 当点击链接时 然后 Insert div与 id 链接后map 使用 jQuery 方法 getScript 加载 Google Maps API 添加谷歌地图到div带身份证
  • 简单的 jQuery(scrollTo 和 animate)在 IE 中不起作用

    我刚刚注意到一些简单的 jQuery 无法在移动版 IE9 和 IE10 上运行 我有一些版权链接和简单的滑动接触形式 它使用animate 我还结合使用scrollTo 插件和jQuery 我尝试了不同的版本 仍然没有解决 也许我错过了一
  • JQuery UI Selectable 插件:当 div 溢出时使滚动条不可选择

    我有一个 div 设置为overflow auto 该 div 的内容是可选择的 使用 jQuery UI 当 div 溢出并出现滚动条时 滚动条本身变为可选择状态 因此滚动效果不佳 在 FF Chrome 中 我可以滚动 div 但我得到
  • 覆盖 jQuery 验证 MVC4 中的默认设置

    要覆盖查询验证插件 请在文件 http docs jquery com Plugins Validation validate toptions 推荐的方式是 selector validate invalidHandler functio
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u

随机推荐

  • java 网站用户在线和客服聊天

    注 xff1a 本文来源于 java 网站用户在线和客服聊天 这是应用到项目中的一个例子 实现原理是将信息存储到Application域里面 然后使用Struts2 Action 用json格式的数据进行前后台交互 截图 xff1a 前台用
  • Linux中文乱码问题终极解决方法

    方法一 xff1a 修改 root bash profile文件 xff0c 增加export LANG 61 zh CN GB18030 该文件在用户目录下 xff0c 对于其他用户 xff0c 也必须相应修改该文件 使用该方法时putt
  • C#将Excel数据表导入SQL数据库的两种方法(转)

    最近用写个winform程序想用excel 文件导入数据库中 xff0c 网上寻求办法 xff0c 找到了这个经过尝试可以使用 方法一 实现在c 中可高效的将excel数据导入到sqlserver数据库中 很多人通过循环来拼接sql xff
  • 最难学的10大编程语言排行榜,Java只排第三,第一出乎意料

    2018年12月的TIOBE编程语言排行榜已经出炉 xff0c Python重回前三 xff0c Go语言跌出前十 xff0c Visual Basic NET涨幅明显 xff0c 保持第五名 TIOBE排行榜是根据互联网上有经验的程序员
  • 网络安全设计方案

    IDC网络系统安全实施方案 1 吉通上海 IDC网络安全功能需求 1 1 吉通上海公司对于网络安全和系统可靠性的总体设想 xff08 1 xff09 网络要求有充分的安全措施 xff0c 以保障网络服务的可用性和网络信息的完整性 要把网络安
  • Altium_Designer-怎么将“原理图的更改”更新到“pcb图”?

    打开原理图 xff0c 直击菜单栏 gt gt Design xff0c 选择第一项 xff0c gt gt Update PCB Document 在弹出的对话框里面选择执行更改即可将原理图更新到工程下面对应的PCB 也可以先点生效更改看
  • Permutations II

    Given a collection of numbers that might contain duplicates return all possible unique permutations For example 1 1 2 ha
  • 【沧海拾昧】C# .Net 基本控件介绍

    C0201 沧海茫茫千钟粟 xff0c 且拾吾昧一微尘 沧海拾昧集 64 CuPhoenix 阅前敬告 沧海拾昧集仅做个人学习笔记之用 xff0c 所述内容不专业不严谨不成体系 如有问题必是本集记录有谬 xff0c 切勿深究 写在前面 本文
  • Super Ugly Number

    Write a program to find the nth super ugly number Super ugly numbers are positive numbers whose all prime factors are in
  • DirectUI中模态对话框和菜单的原理

    经常有人问关于模态对话框和系统菜单内部实现原理方面的问题 xff0c 因为系统通过API隐藏了太多细节 xff0c 这2个问题确实令初学者甚至是有经验的开发者困扰 xff0c 下面是我个人的一些经验总结 先说模态对话框 xff0c 外部看模
  • AD16PCB如何快速删除走线

    工具 xff08 Tools xff09 取消布线 xff08 Un Route xff09 全部 xff08 AII xff09 ad pcb画图 xff0c 如果想整体去掉一条线 xff0c 只要是连接在一起的 xff0c 不管在哪一层
  • 如何正确的选择云数据库?

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 本文由云 43 社区发表 作者 xff1a 数据库 江湖传说在选择和使用云数据库过程中 10个人有9个会遇到以下问题 xff1a 数据库正常使用过程中莫名卡顿 经常遭遇主从
  • C和C++的区别

    C 43 43 几乎完全兼容了C xff0c 但增加的特性差不多比整个C语言还多 C是一种简单的语言 它真正提供的只有有宏 指针 结构 数组和函数 xff1b 而C 43 43 还有私有和保护型成员 函数重载 缺省参数 构造和析构函数 自定
  • Pixhawk 添加超声波定高

    记录一下自己在Pixhawk上添加超声波模块进行定高的过程 xff1a 硬件 xff1a Pixhawk2 4 8 xff08 APM3 5固件 xff09 STM32开发板 几块钱一个的超声波模块 软件 xff1a Mission Pla
  • 使用VNC远程登录Linux主机

    一 安装 tigervnc yum install tigervnc server 这是服务端软件 yum install tigervnc 这是客户端软件 xff0c 安装完后 xff0c 程序在 应用程序 gt Internet gt
  • 重读 JVM

    秋招开始了 xff0c 前面由于做别的事耽误了半个月 xff0c 以前学的东西不用就很容易忘记 所以 xff0c 这次重新阅读 深入理解 JVM 虚拟机 时 xff0c 想做一个记录 将碎片的知识整合 xff0c 方便自己以后阅读 xff0
  • MA5680T跨板聚合

    跨板聚合可以提高上行带宽 xff0c 又可以给上行做冗余在出现单板故障时保持正常通信 MA5680T 0 19 0 与0 20 0做跨板聚合命令 xff1a link aggregation 0 19 0 0 20 0 egress ing
  • Deep Learning for Computer Vision with Python.

    Welcome back This is the fourth post in the deep learning development environment configuration series which accompany m
  • xargs

    功能说明 xff1a 向其他命令传递命令行参数的一个过滤器 xff0c 能够将管道或者标准输入传递的数据转换成xargs命令后跟随的命令的命令行参数 选项说明 xff1a n 指定每行的最大参数量 xff0c 可以将标准输入的文本划分为多行
  • TWEEN动画、JQUERY、ES6 — 2、轮播图-渐隐渐现版本

    分析 目录 编译并压缩less xff08 需要先npm安装less xff09 banner html lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 span cl