目录
一、常见网页特效
1. 案例:网页轮播图
轮播图也称为焦点图,是网页中比较常见的网页特效。
功能需求:
- 鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮。
- 点击右侧按钮一次,图片往左播放一张,以此类推,左侧按钮同理。
- 图片播放的同时,下面小圆圈模块跟随一起变化。
- 点击小圆圈,可以播放相应图片。
- 鼠标不经过轮播图,轮播图也会自动播放图片。
- 鼠标经过,轮播图模块,自动播放停止。
1.1 案例分析
1.1.1 左右按钮的显示与隐藏
// 等页面所有元素加载完后再执行js
window.addEventListener('load', function () {
//this.alert('1'); // 测试
// 1. 获取元素
var arrow_l = this.document.querySelector('.arrow-l');
var arrow_r = this.document.querySelector('.arrow-r');
var focus = document.querySelector('.focus');
// 2. 鼠标经过focus 就显示隐藏的左右按钮
focus.addEventListener('mouseenter', function () {
arrow_l.style.display = 'block';
arrow_r.style.display = 'block';
})
// 鼠标离开focus 就隐藏左右按钮
focus.addEventListener('mouseleave', function () {
arrow_l.style.display = 'none';
arrow_r.style.display = 'none';
})
})
1.1.2 动态生成小圆圈
// 3. 动态生成小圆圈,有几张图片我们就生成几个小圆圈
var ul = focus.querySelector('ul');
var ol = focus.querySelector('.circle');
// console.log(ul.children.length); test
for (var i = 0; i < ul.children.length; i++) {
// 创建一个小li
var li = this.document.createElement('li');
// 把小li插入到ol里面
ol.appendChild(li);
}
// 把ol的第一个小li设置类名为 current
ol.children[0].className = 'current';
1.1.3 小圆圈的排他思想
排他思想的口诀: 干掉所有人,留下我自己
// 4. 小圆圈的排他思想 我们可以直接生成小圆圈的同时直接绑定点击事件
li.addEventListener('click', function () {
// 干掉所有人 把所有的小li 清除 current 类名
for (var i = 0; i < ol.children.length; i++) {
ol.children[i].className = ' ';
}
// 留下我自己 当前的小li 设置current 类名
this.className = 'current';
})
把这段代码写到上一段代码的for循环里面
1.1.4 点击小圆圈滚动图片
html
css
js
for (var i = 0; i < ul.children.length; i++) {
// 创建一个小li
var li = this.document.createElement('li');
//记录当前小圆圈的索引号 通过自定义属性来做
li.setAttribute('index', i);
// 把小li插入到ol里面
ol.appendChild(li);
// 4. 小圆圈的排他思想 我们可以直接生成小圆圈的同时直接绑定点击事件
li.addEventListener('click', function () {
// 干掉所有人 把所有的小li 清除 current 类名
for (var i = 0; i < ol.children.length; i++) {
ol.children[i].className = ' ';
}
// 留下我自己 当前的小li 设置current 类名
this.className = 'current';
// 5. 点击小圆圈,移动图片 当然移动的是 ul
// ul 的移动距离 小圆圈的索引号 乘以 图片的宽度 注意是往左走,所以是负值
// 当我们点击了某个小li 就拿到当前小li 的索引号
var index = this.getAttribute('index');
//console.log(index); test
var focusWidth = focus.offsetWidth;
//console.log(focusWidth); test
animate(ul, -index * focusWidth);
})
}
1.1.5 点击右侧按钮一次,就让图片滚动一张
将href的值 “#” 改写成 “javascript:;” ,使其被点击后不会跳到页面最顶端
将之前在for循环内部定义的focusWidth提到外面去定义,这样在外面也可以使用了。
将第一张的图片复制一份放到最后面
// 6. 点击右侧按钮一次,就让图片滚动一张
var num = 0;
arrow_r.addEventListener('click', function () {
// alert('1'); test
// 如果走到了最后复制的一张图片,此时,我们的ul 要快速复原 left 改为 0
if (num == ul.children.length - 1) {
ul.style.left = 0;
num = 0;
}
num++;
animate(ul, -num * focusWidth);
})
1.1.6 克隆第一张图片
虽然右侧按钮的功能实现了,但我们还有代码改进的空间。
问题1: 我们的小li是直接在结构里面复制了一份,这样动态生成的小圆点也会随之增加。
问题2: 我们不知道里面到底有几张图片,在结构复制一份就写死了,能不能再自动化一些。
把之前在HTML文件里复制的第一张图片删掉。
// 6. 克隆第一张图片(li)放到ul 最后面
var first = ul.children[0].cloneNode(true);
ul.appendChild(first);
把该段代码写到上一段代码的前面。
因为在动态生成小圆圈之后再克隆了一份图片,所以小圆圈不会多一个。
1.1.7 点击右侧按钮,小圆圈跟随变化
// 7. 点击右侧按钮一次,就让图片滚动一张
var num = 0;
// circle 控制小圆圈的播放
var circle = 0;
arrow_r.addEventListener('click', function () {
// alert('1'); test
// 如果走到了最后复制的一张图片,此时,我们的ul 要快速复原 left 改为 0
if (num == ul.children.length - 1) {
ul.style.left = 0;
num = 0;
}
num++;
animate(ul, -num * focusWidth);
// 8. 点击右侧按钮,小圆圈跟随一起变化,可以再声明一个变量控制小圆圈的播放
circle++;
// 如果circle == 4 说明走到最后我们克隆的这张图片了 我们就复原为0
if (circle == ol.children.length) {
circle = 0;
}
// 先清除其余小圆圈的current类名
for (var i = 0; i < ol.children.length; i++) {
ol.children[i].className = '';
}
// 留下当前的小圆圈的current类名
ol.children[circle].className = 'current';
})
小bug
1.当我们点击第三个小圆圈会显示第3张图片,然后点击右侧按钮,图片却显示第2张。这是因为我们播放下一张是由num控制的,而num这一个变量和之前做的点击小圆圈事件没有任何关系,所以它们就出现差异。
// 4. 小圆圈的排他思想 我们可以直接生成小圆圈的同时直接绑定点击事件
li.addEventListener('click', function ()