A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不就发个帖 初级黑马   /  2019-1-13 21:02  /  1351 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

就业班开始,开始学习了JavaScript基础,后来学习了JQ跟JS高级的知识,觉得还是有点难度的。老师上课讲的例题都能听懂,回顾的时候也都能理解,但是到自己写的时候,就懵了。可能还是因为练的不够,但是好像自己又很懒,没有更多的去看视频练习什么的,所以要检讨一下,周末有空的时候 还是要找一些练习看一看练一练,尤其是现在学习了新的知识,之前的知识更不能忘了。对自己的要求应该是按照老师上课的视频能全部照着做起来,自己也会再做一份笔记,当做是巩固知识。
但是经过测试之后才发现,其实并不够,还是需要多敲几遍代码,这样印象就自然而然的加深了,也就不需要刻意去记了。还有英文单词,也一定需要记忆跟默写,发现还是很有必要的,比如测试的时候一个规定背景图像是否固定或者随着页面的其余部分滚动的单词:background-attachment,我就怎么都想不起来了,自己也刻意去记了好几遍,到默写的时候还是忘了,所以,默写还是必要的。也有可能我的记忆方式不对,学习方式不对,需要自己去调整一下。比如还有第一题,让选择属于基本包装类型的数据类型,上课听完老师介绍说明的以后,就忘了,也没有去回顾,还有几个理论知识,可能上课听讲都一点走神,一点印象都没有。通过这次测试,确实找到了不少问题,以后上课注意。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
接下来分享一个用js原生实现的轮播图的代码:
首先封装一个动画animate的方法:
// var timerId = null;
// 封装动画的函数
function animate(element, target) {
   // 通过判断,保证页面上只有一个定时器在执行动画
  if (element.timerId) {
    clearInterval(element.timerId);
    element.timerId = null;
  }

  element.timerId = setInterval(function () {
    // 步进  每次移动的距离
    var step = 10;
    // 盒子当前的位置
    var current = element.offsetLeft;
    // 当从400 到 800  执行动画
    // 当从800 到 400  不执行动画

    // 判断如果当前位置 > 目标位置 此时的step  要小于0
    if (current > target) {
      step = - Math.abs(step);
    }

    // Math.abs(current - target)   <= Math.abs(step)
    if (Math.abs(current - target)   <= Math.abs(step)) {
      // 让定时器停止
      clearInterval(element.timerId);
      // 让盒子到target的位置
      element.style.left = target + 'px';
      return;
    }
    // 移动盒子
    current += step;
    element.style.left = current + 'px';
  }, 5);
}
接着开始写轮播的代码:
// 获取元素
var box = my$('box');
var screen = box.children[0];
var ul = screen.children[0];
var ol = screen.children[1];


// 箭头 arrow
var arr = my$('arr');
var arrLeft = my$('left');
var arrRight = my$('right');

// 图片的宽度
var imgWidth = screen.offsetWidth;

// 1 动态生成序号
// 页面上总共有多少张图片    5 没有克隆的li
var count = ul.children.length;
for (var i = 0; i < count; i++) {
   var li = document.createElement('li');
   ol.appendChild(li);
   setInnerText(li, i + 1);
   // 2 点击序号 动画的方式 切换图片
   li.onclick = liClick;

   // 让当前li记录他的索引
   // 设置标签的自定义属性
   li.setAttribute('index', i);
}
function liClick() {
   // 2.1 取消其它li的高亮显示,让当前li高亮显示
   for (var i = 0; i < ol.children.length; i++) {
     var li = ol.children;
     li.className = '';
   }
   // 让当前li高亮显示
   this.className = 'current';
   // 2.2 点击序号,动画的方式切换到当前点击的图片位置

   // 获取自定义属性
   var liIndex = parseInt(this.getAttribute('index'));
   //var liIndex = parseInt(this.innerText);
   animate(ul, -liIndex * imgWidth);

   // 全局变量index  和 li中的index保持一致
   index = liIndex;
}
// 让序号1高亮显示
ol.children[0].className = 'current';


// 3 鼠标放到盒子上显示箭头
box.onmouseenter = function () {
   arr.style.display = 'block';
   // 清除定时器
   clearInterval(timerId);
}

box.onmouseleave = function () {
   arr.style.display = 'none';
   // 重新开启定时器
   timerId = setInterval(function () {
     arrRight.click();
   }, 2000);
}
// 4 实现上一张和下一张的功能
// 下一张

var index = 0; // 第一张图片的索引
arrRight.onclick = function () {
   // 判断是否是克隆的第一张图片,如果是克隆的第一张图片,此时修改ul的坐标,显示真正的第一张图片
   if (index === count) {
     ul.style.left = '0px';
     index = 0;
   }
   //
   // 总共有5张图片,但是还有一张克隆的图片  克隆的图片的索引是5
   // 4 < 5
   index++;
   if (index < count) {
       // animate(ul, -index * imgWidth);
       // //
       // 获取图片对应的序号,让序号点击
       ol.children[index].click();
   } else {
     //如果是最后一张图片 以动画的方式,移动到克隆的第一张图片
     animate(ul, -index * imgWidth);
     // 取消所有序号的高亮显示,让第一序号高亮显示
     for (var i = 0; i < ol.children.length; i++) {
       var li = ol.children;
       li.className = '';
     }
     ol.children[0].className = 'current';
   }
}
// 上一张
arrLeft.onclick = function () {
   // 如果当前是第一张图片,此时要偷偷的切换到最后一张图片的位置(克隆的第一张图片)
   if (index === 0) {
     index = count;
     ul.style.left = - index * imgWidth + 'px';
   }

   index--;
   ol.children[index].click();

   // // 如果不是第一张的话 index--
   // if (index > 0) {
   //   index--;
   //   // animate(ul, -index * imgWidth);
   //   ol.children[index].click();
   // }
}

// 无缝滚动
// 获取ul中的第一个li
var firstLi = ul.children[0];
// 克隆li  cloneNode()  复制节点  
// 参数  true  复制节点中的内容
//       false  只复制当前节点,不复制里面的内容
var cloneLi = firstLi.cloneNode(true);
ul.appendChild(cloneLi);


// 5 自动切换图片
var timerId = setInterval(function () {
   // 切换到下一张图片
   arrRight.click();
}, 2000);

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马