内置对象&内置构造函数
日期时间格式
// 创建一个当前时刻的日期时间对象
var date = new Date();
// 获取date对象中的年月日时分秒
var y = date.getFullYear();
var m = date.getMonth() + 1;
var d = date.getDate();
var h = date.getHours();
var i = date.getMinutes();
var s = date.getSeconds();
// 对个位数前面补 0
m = m < 10 ? '0' + m : m;
d = d < 10 ? '0' + d : d;
h = h < 10 ? '0' + h : h;
i = i < 10 ? '0' + i : i;
s = s < 10 ? '0' + s : s;
// 拼接日期时间的字符串
var datetimeStr = y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s;
document.write(datetimeStr);
处理为小驼峰形式
console.log(toCamelCase('get-element-by-id'));
console.log(toCamelCase('query-selector-all'));
console.log(toCamelCase('get-bounding-client-rect'));
/**
* 把 - 格式的字符串转为小驼峰风格
* @param string -风格的字符串
* @return string 小驼峰风格的字符串
*/
function toCamelCase(str) {
return str.split('-').map(function(item, index) {
// 如果是第一个元素
if (index === 0) {
return item;
}
// 首字母大写
return item[0].toUpperCase() + item.slice(1);
}).join('');
}
Math
// 取随机数,结果是小数0-1之间(顾头不顾尾,0有一定概率)
console.log(Math.random());
// 随机0-9之间的整数*10 舍一取整
console.log('随机0~9之间的整数:',Math.floor(Math.random()*10));
// 随机0-15之间的整数
console.log('随机0~15之间的整数:', Math.floor((Math.random() * 16)));
// 随机8-27之间的整数 先取0-19,再+8
console.log('随机取 8 ~ 27 之间的整数:', Math.floor(Math.random() * 20) + 8);
Array
// 定义数组
var users = [
{
name: '芳芳',
age: 18,
address: '上海'
},
{
name: '大悲',
age: 78,
address: '山洞'
},
{
name: '曹操',
age: 48,
address: '许昌'
},
{
name: '吕布',
age: 38,
address: '包头'
},
{
name: '曹丕',
age: 12,
address: '许昌'
},
{
name: '小悲',
age: 31,
address: '山洞'
}
];
console.log(users);
// forEach遍历数组
users.forEach(function(item, index) {
console.log(item, index);
});
// filter 获取用户中的成年人
var fUsers = users.filter(function(item, index) {
return item.age >= 18;
});
console.log(fUsers);
// map 从原数组提取信息,得到新数组,年龄+1岁
var mUsers = users.map(function(item, index) {
// return item.name;
item.age ++;
return item;
});
console.log(mUsers);
// every 有一个不满足添加就是false 是否所有的用户都是成年人
var res = users.every(function(item, index) {
return item.age >= 18;
});
console.log(res); //false
// some 有一个满足条件,就是true 是否有用户住在山洞
var res = users.some(function(item, index) {
return item.address === '山洞';
});
console.log(true); //true
// reduce (reduceright)计算所有元素的和(上一个元素的返回值,当前的,索引)
var nums = [100,200,300,400];
var sum = nums.reduce(function(prev, item, index) {
return prev + item;
}, 0);
console.log(sum); //1000
// users , 计算所有用户的年龄和
var ageSum = users.reduce(function(prev, item) {
return prev + item.age;
}, 0);
console.log(ageSum); //231
// users.reduceRight()
// indexOf() lastIndexOf() -1不包含 >=1就是包含(索引)
// indexOf() lastIndexOf()
console.log(nums.indexOf(400)); //3
console.log(nums.indexOf(4000)); -1
倒计时案例
// 获取一个DOM对象
var boxNode = document.getElementById('box');
// 定义数字
var num = 10;
// 调用函数 runTime
runTime();
// 定义函数
function runTime() {
// num 累减
num --;
// 设置元素中的内容
boxNode.innerHTML = num;
// 如果 nun<= 0
if (num <= 0) {
return;
}
// 开启单次定时器
setTimeout(runTime, 1000);
}
电子时钟
// 获取 id 是watch 的元素
var watch = document.getElementById('watch');
// 开启之前,先调用
getDateTime();
// 开启定时器
setInterval(getDateTime,1000)
// 定义定时器的回调函数,获取当前日期时间
function getDateTime() {
// 创建此时此刻的日期时间对象
var date = new Date();
// 从日期时间对象中获取年月日时分秒
var y = date.getFullYear();
var m = date.getMonth()+1;
var d = date.getDate();
var h = date.getHours();
var i = date.getMinutes();
var s = date.getSeconds();
// 如果个位为前面补0;
m < 10 ? '0' + m : m;
d < 10 ? '0' + d : d;
h < 10 ? '0' + h : h;
i < 10 ? '0' + i : i;
s < 10 ? '0' + s : s;
// 拼接字符串
var datetimestr = y+'-'+m+'-'+d+'-'+h+':'+i+':'+s
// 把字符串显示在元素中
watch.innerHTML = datetimestr;
}
全选和全不选
// 获取所有的checkbox元素
var inputs = document.querySelectorAll('#checkboxList input');
// 获取全选按钮元素
var selectAllBtn = document.querySelector('#btn1');
// 点击全选按钮,执行操作
selectAllBtn.onclick = function() {
// 遍历出每个复选框元素
inputs.forEach(function(input){
input.checked = true;
})
}
// 获取全不选的元素
var selectNotAllBtn = document.querySelector('#btn2');
// 点击全不选按钮,执行操作
selectNotAllBtn.onclick = function() {
// 遍历出每个复选框元素
inputs.forEach(function(input){
input.checked = false;
})
};
实现反选
// 先写自调用函数,防止作用域出错
(function() {
// 获取所有的checkbox按钮
var inputs = document.querySelectorAll('#checkboxList input');
// 获取反选按钮元素
var selectReverseBtn = document.querySelector('#btn');
// 点击反选按钮,执行操作
selectReverseBtn.onclick = function() {
// 遍历出每个复选框按钮
inputs.forEach(function(input){
/* if (input.checked) {
input.checked = false;
} else {
input.checked = true;
}*/
input.checked = !input.checked;
})
}
})();
复选框全选
// 获取元素,列表中所有复选框的集合
var checkboxs = document.querySelectorAll('#checkboxList input');
// 获取全选的复选框
var selectAllCheckbox = document.querySelector('#selectAll');
// 点击全选的复选框,执行操作
selectAllCheckbox.onclick = function() {
// 遍历出每个复选框按钮
checkboxs.forEach(function(item){
item.checked = selectAllCheckbox.checked;
})
}
春节倒计时
// 获取元素
var box = document.querySelector('#box')
// 获取目标时间的时间戳
var dstTime = (new Date(2022,1,1,0,0,0)).getTime();
// 开启之前,先调用
getDateTime();
// 开启定时器
setInterval(getDateTime,1000)
function getDateTime() {
// 计算目标日期距离当前的所差的毫秒数
var seconds = dstTime-Date.now();
// 提取时间差中所包含的整的天数
var d = Math.floor(seconds/(24*3600*1000));
// 计算去除了整天之后,剩下的毫秒数
var s = seconds-d*(24*3600*1000)
// 从s中提取整的小时数
var h = Math.floor(s/(3600*1000))
// s中去除整的小时,取剩下的
s = s-h*(3600*1000) //s -= h * (3600 * 1000);
// 从s中提取完整的分钟
var m = Math.floor(s/(60*1000))
// s中去除整的分钟
s = s-m*(60*1000)
// 计算秒数
s = Math.floor(s/1000)
box.innerHTML='距离春节还有<br>'+d+'天'+h+'小时'+m+'分钟'+s+'秒'
}
})();
随机点名器
(function(){
// 定义数组,存储要随机显示的名字
var nameList = ['刘备', '张飞', '关羽', '马超', '黄忠', '诸葛亮', '赵云', '曹操', '夏侯惇', '夏侯渊', '典韦', '许褚', '孙权', '大乔', '小乔', '周瑜']
// 获取显示文字的元素
var content = document.querySelector('#content')
// 获取开始按钮
var btn = document.querySelector('#btn')
// 定义定时器标记变量
var intervalId = null;
// 点击开始按钮
btn.onclick = function() {
// 如果定时器标记变量的值是 null,要开启定时器
if (intervalId === null) {
// 修改按钮的文字
btn.innerHTML = '停止';
// 开启定时器
intervalId = setInterval(function() {
// 随机取索引 nameList
var randIndex = Math.floor(Math.random() *nameList.length)
// 显示随机取出的姓名到 content
content.innerHTML = nameList[randIndex];
},50)
} else {
// 修改按钮的文字
btn.innerHTML = '继续';
// 停止定时器
clearInterval(intervalId);
// 重置变量 intervalId 的值
intervalId = null;
}
}
})()
classList
(function() {
// 获取所有的li元素
var lis = document.querySelectorAll('.news .item')
// 遍历lis,给其中的每个li监听click事件
lis.forEach(function(liItem) {
// 添加事件
liItem.onclick = function () {
// 判断 li 是否被选中
if (liItem.className === 'item') {
// 添加类名 active
liItem.className = 'item active';
} else {
// 去掉类名 active
liItem.className = 'item';
}
}
})
})()
className
(function() {
// 获取所有的li元素
var lis = document.querySelectorAll('.news .item')
// 遍历lis,给其中的每个li监听click事件
lis.forEach(function(liItem) {
// 是否存在类名 active
liItem.onclick = function() {
// if (liItem.className.indexOf('active') === -1) {
// // 添加 active 类名
// liItem.classList.add('active');
// } else {
// // 删除 active 类名
// liItem.classList.remove('active')
// }
liItem.classList.toggle('active');
}
})
})()
图片延迟加载
(function(){
// 获取所有的img元素
var imgItems = document.querySelectorAll('.images img');
// 调用函数,第一屏加载
loadImage();
// 监听滚动的滚动
window.onscroll = loadImage;
// 封装函数 实现加载图片
// 图片在视口上的y坐标 < 视口高度
function loadImage() {
// 遍历图片
imgItems.forEach(function(imgItem) {
// 判断图片在视口上的y坐标是否小于视口高度,如果成立,加载图片
if (imgItem.getBoundingClientRect().top < document.documentElement.clientHeight) {
// 加载图片
imgItem.src = imgItem.dataset.src;
// 设置为不透明
imgItem.style.opacity = '1';
}
})
}
})()
无缝滚动
(function(){
// 获取元素
var scrollBox = document.querySelector('#scrollBox');
// 把所有的图片再复制一份
scrollBox.innerHTML += scrollBox.innerHTML
// 开启定时器
setInterval(function(){
// 当第一组图片全部滚出scrollBox区域之后,瞬间调整位置
if (scrollBox.scrollLeft >= 2000 ) {
scrollBox.scrollLeft = '0'
}
// 修改元素的scrollLeft
scrollBox.scrollLeft += 2
},10)
})()
页面标题滚动播放
setInterval(function() {
// 剩下的字符串 + 第一个字符串
document.title = document.title.slice(1) +document.title[0]
},200)
选项卡效果
(function() {
// 获取元素
var tabTitleItems = document.querySelectorAll('.tab-title li'); // 获取选项卡标题元素
var tabContentItems = document.querySelectorAll('.tab-item'); // 获取选项卡内容元素
// 给每个选项卡标题元素,监听一个click事件
tabTitleItems.forEach(function(tabTitleItem, tabTitleIndex) {
// 给每个tabTitleItem监听事件
tabTitleItem.onclick = function() {
// 把所有的tabTitleItem和tabContentItem的active类名去掉
tabTitleItems.forEach(function(tabTitleItem, index) {
tabTitleItem.classList.remove('active');
tabContentItems[index].classList.remove('active');
});
// 给当前点击的tabTitleItem添加active类名
tabTitleItem.classList.add('active');
// 当前的 tabContentItem添加 active
tabContentItems[tabTitleIndex].classList.add('active');
};
});
})()
选项卡for
// 获取元素
var btns = document.querySelectorAll('.btn li');
var contents = document.querySelectorAll('.content li')
// 遍历btns,给每个btns监听事件
for (var i = 0;i<btns.length;i++) {
// 给每个btns元素设置一盒属性
btns[i].index = i
// 给每个btns监听事件
btns[i].onclick = function() {
// 其他所有的btn和content去掉active
for (var i=0;i<btns.length;i++) {
btns[i].classList.remove('active');
contents[i].classList.remove('active')
}
// 点击当前的btn添加类名active
this.classList.add('active');
// 当前对应的btn添加类名active
contents[this.index].classList.add('active')
}
}
鼠标无缝滚动
var scrollBox = document.querySelector('#scrollBox');
// 把所有图片的内容再复制一遍
scrollBox.innerHTML += scrollBox.innerHTML
// 开启定时器
var intervalId = setInterval(runScroll,10)
// 当鼠标悬停在scrollBox上
scrollBox.onmouseenter = function() {
// 停止定时器
clearInterval(intervalId)
}
// 当鼠标离开scrollBox
scrollBox.onmouseleave = function() {
// 再次开启定时器
intervalId = setInterval(runScroll,10)
}
// 定义定时器的回调函数
function runScroll() {
// 当第一组图片全部滚出scrollBox,瞬间调整位置
if (scrollBox.scrollLeft >= 2000) {
scrollBox.scrollLeft = '0'
}
// 修改元素的scrollLeft
scrollBox.scrollLeft += 2;
}
鼠标元素拖拽
// 获取元素
var box = document.querySelector('#box')
// 监听鼠标按键按下的事件(修改背景颜色,获取mouesemove事件的监听,相关位置
box.onmousedown = function(event) {
box.style.backgroundColor = 'pink';
// 获取鼠标在目标元素的位置
var eleLeft = event.offsetX;
var eleTop = event.offsetY;
// 监听事件移动事件
document.onmousemove = function(event) {
// 获取鼠标在视口上的位置
var vpLeft = event.clientX;
var vpTop = event.clientY;
// 计算box的目标位置
var left = vpLeft - eleLeft;
var top = vpTop - eleTop;
// 限定位置的范围
if (left < 0) {
left = 0;
} else if (left>(document.documentElement.clientWidth-box.offsetWith)) {
left = document.documentElement.clientWidth-box.offsetWith;
}
if (top < 0) {
top = 0;
}else if (top>(document.documentElement.clientHeight-box.offsetHeight)) {
top = document.documentElement.clientHeight-box.offsetHeight;
}
// 根据鼠标在视口上的位置调整box元素的位置
box.style.left = left +'px'
box.style.top = top +'px'
}
}
// 监听鼠标按键抬起的事件(恢复背景颜色,解除mousemove事件的监听
box.onmouseup = function() {
// 恢复背景颜色
box.style.backgroundColor = ''
// 解除mousemove事件的监听
document.onmousemove = null;
}
实时获取输入框的输入
// 获取输入框的元素
var banks = document.querySelector('#bankCardInput')
// 获取放大显示的元素
var resBox = document.querySelector('#res')
// 给input监听键盘按键抬起事件
banks.onkeyup = function() {
resBox.innerHTML = banks.value
}
表单验证
(function() {
// 获取元素
var inputBox = document.querySelector('#ageInput')
var spanBox = document.querySelector('#ageCheck')
// 给input监听失去焦点的事件
inputBox.onblur = function() {
// 判断用户的输入
if (this.value >= 0 && this.value <= 200) {
spanBox.innerHTML = '您的年龄可用';
spanBox.style.color = 'green'
} else {
spanBox.innerHTML = '请输入正确的年龄'
spanBox.style.color = 'red'
}
}
})()
地址联动
(function() {
// 定义省的信息
var provs = ['江苏', '浙江', '安徽', '河南', '江西'];
// 定义城市信息
var citys = [
['南京', '苏州', '无锡', '常州', '南通'],
['杭州', '宁波', '温州', '嘉兴', '绍兴'],
['合肥', '安庆', '马鞍山', '芜湖', '阜阳'],
['郑州', '洛阳', '开封', '驻马店', '南阳'],
['南昌', '九江', '赣州', '宜春', '抚州']
];
// 获取元素
var provSel = document.querySelector('#provSel')
var citySel = document.querySelector('#citySel');
// 根据省的信息,添加第一个select的下拉选项
provs.forEach(function(item, index) {
provSel.add(new Option(item, index));
})
// 给第一个select监听change事件
provSel.onchange = function() {
// 清空第二个select
citySel.length = 0;
// 获取所选的是哪个下拉选项
var index = this.value;
// 取出城市信息,第二个select添加下拉选项
citys[index].forEach(function(item) {
citySel.add(new Option(item))
})
}
// 使用代码触发change事件
provSel.onchange();
})()
键盘控制元素移动
// 获取元素
var box = document.querySelector('#box');
var tank = document.querySelector('#tank');
// 监听键盘按下的按键
document.onkeydown = function(event) {
// 判断按的是哪个按键
//console.log(event.keyCode) 37 38 39 40
switch(event.keyCode) {
case 37: //向左移动
tank.style.transfrom = 'rotate(-90deg)';
tank.style.left = Math.max(tank.offsetLeft-5,0)+'px';
break;
case 38: //向上移动
tank.style.transfrom = 'rotate(0)';
tank.style.top = Math.max(tank.offsetTop-5,0)+'px';
case 39: //向右移动
tank.style.transfrom = 'rotate(90deg)';
tank.style.left = Math.min(tank.offsetLeft+5,box.clientWidth-tank.offsetWidth)+'px';
break;
case 40: //向下移动
tank.style.transfrom = 'rotate(180deg)';
tank.style.top = Math.min(tank.offsetTop+5,555)+'px'
}
}
轮播图有效果
(function() {
// 获取最外层的包裹元素
var playBox = document.querySelector('#playBox');
// 获取包裹图片的 ul 元素
var imageWrapper = playBox.querySelector('.image-list');
// 获取所有的按钮集合
var btnItems = playBox.querySelectorAll('.btn-list li');
// 获取上一张和下一张的按钮
var prevBtn = playBox.querySelector('#prevBtn');
var nextBtn = playBox.querySelector('#nextBtn');
// 克隆第一张图片并且添加到最后面
imageWrapper.appendChild(imageWrapper.firstElementChild.cloneNode(true));
// 定义变量 标记当前按钮的索引
var currentIndex = 0;
// 定义变量,标记当前图片的索引
var currentImageIndex = 0;
// 定义变量,标记自动播放的时间间隔
var duration = 3000;
// 定义变量 记录图片的宽度
var imageWidth = 900;
// 定义变量,记录按钮的数量
var btnLen = btnItems.length;
// 定义变量,记录图片的数量
var imageLen = imageWrapper.children.length;
// 开启定时器,获取定时器标记
var intervalId = setInterval(nextImage, duration);
// 鼠标悬停在 palyBox 上,定时器暂停
playBox.onmouseenter = function() {
clearInterval(intervalId);
};
// 鼠标离开 playBox,定时器继续
playBox.onmouseleave = function() {
intervalId = setInterval(nextImage, duration);
};
// 遍历所有的按钮,监听事件
btnItems.forEach(function(btnItem, index) {
// 监听单击事件
btnItem.onclick = function() {
// 修改当前按钮的索引
currentIndex = index;
// 修改当前图片的索引
currentImageIndex = index;
// 调用函数 实现图片显示和按钮高亮
setActive();
};
});
// 监听单击事件 点击上一张按钮
prevBtn.onclick = prevImage;
// 监听单击事件 点击下一张按钮
nextBtn.onclick = nextImage;
// 监听离开页面的事件以及再次回到本页(切换到其他页面、最小化)
document.onvisibilitychange = function() {
// 如果离开本页面
if (document.visibilityState === 'hidden') {
// 暂停定时器
clearInterval(intervalId);
} else {
// 再次回调本页面,定时器重新开始
intervalId = setInterval(nextImage, duration);
}
};
// 封装函数,实现切换到下一张图片
function nextImage() {
// 当前的索引递加
currentIndex ++;
currentImageIndex ++;
// 如果按钮索引大于最大值
if (currentIndex > btnLen - 1) {
currentIndex = 0;
}
// 如果图片索引大于最大值
if (currentImageIndex > imageLen - 1) {
// 取消过渡,快速显示索引是 0 的图片
imageWrapper.style.transition = 'none';
imageWrapper.style.left = '0';
// 设置下一个图片的索引
currentImageIndex = 1;
}
// 调用函数 实现图片显示和按钮高亮
setTimeout(setActive, 0);
}
// 封装函数,实现切换到上一张图片
function prevImage() {
// 当前索引递减
currentIndex --;
currentImageIndex --;
// 如果按钮当前索引小于 0
if (currentIndex < 0) {
currentIndex = btnLen - 1;
}
// 如果图片当前索引小于 0
if (currentImageIndex < 0) {
// 取消过渡效果,快速切换位置
imageWrapper.style.transition = 'none';
imageWrapper.style.left = -(imageLen - 1) * imageWidth + 'px';
// 设置图片新的索引
currentImageIndex = imageLen - 2;
}
// 调用函数 实现图片显示和按钮高亮
setTimeout(setActive, 0);
}
// 封装函数,实现当前的图片显示以及当前的按钮高亮
function setActive() {
// 设置过渡效果
imageWrapper.style.transition = 'left .5s';
// 排他操作,所有的按钮去掉 active 类
for (var i = 0; i < btnItems.length; i ++) {
btnItems[i].classList.remove('active');
}
// 当前的按钮添加active类
btnItems[currentIndex].classList.add('active');
// 设置 imageList 的位置 left 属性
imageWrapper.style.left = -currentImageIndex * imageWidth + 'px';
}
})();
在父元素中被拖拽
// 获取元素
var box01 = document.querySelector('#box01')
var box02 = document.querySelector('#box02')
// 监听鼠标按键按下的事件(修改背景颜色,获取mouesemove事件的监听,相关位置
box02.onmousedown = function(event) {
box02.style.backgroundColor = 'pink';
// 获取鼠标在目标元素的位置
var eleLeft = event.offsetX;
var eleTop = event.offsetY;
// 监听事件移动事件
box01.onmousemove = function(event) {
// 获取鼠标在父元素上的位置
var vpLeft = event.clientX-box01.getBoundingClientRect().left;
var vpTop = event.clientY-box01.getBoundingClientRect().top;
// 计算box02的目标位置
var left = vpLeft - eleLeft;
var top = vpTop - eleTop;
// 限定位置的范围
if (left < 0) {
left = 0;
} else if (left>box01.clientWidth-box02.offsetWidth) {
left = box01.clientWidth-box02.offsetWidth;
}
if (top < 0) {
top = 0;
}else if (top>box01.clientHeight-box02.offsetHeight) {
top = box01.clientHeight-box02.offsetHeight
}
// 根据鼠标在视口上的位置调整box元素的位置
box02.style.left = left +'px'
box02.style.top = top +'px'
}
}
// 监听鼠标按键抬起的事件(恢复背景颜色,解除mousemove事件的监听
box02.onmouseup = function() {
// 恢复背景颜色
box02.style.backgroundColor = ''
// 解除mousemove事件的监听
box01.onmousemove = null;
}
导航条吸附
/* 设置吸附定位 */
position: sticky;
var pageNav = document.querySelector('#pageNav');
// 计算导航条元素与页面顶部的距离(导航条在页面上的y坐标)
var pageDst = pageNav.offsetTop;
// 监听页面滚动
window.onscroll = function() {
// 获取页面滚动的距离
var scrollDst = document.documentElement.scrollTop ||document.body.scrollTop
// 当页面滚动的距离>=导航条页面顶部的距离
if (scrollDst >= pageDst ) {
// 添加吸附效果
pageNav.classList.add('fixed-top')
// 给body添加上内边距
document.body.style.paddingTop = '40px'
} else {
// 取消吸附效果
pageNav.classList.remove('fixed-top')
// 去掉body的上内边距
document.body.style.paddingTop = '40px'
}
}