tab切换
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>tab栏切换</title>
<style>
* {
margin: 0;
padding: 0;
}
.tab {
width: 590px;
height: 340px;
margin: 20px;
border: 1px solid #e4e4e4;
}
.tab-nav {
width: 100%;
height: 60px;
line-height: 60px;
display: flex;
justify-content: space-between;
}
.tab-nav h3 {
font-size: 24px;
font-weight: normal;
margin-left: 20px;
}
.tab-nav ul {
list-style: none;
display: flex;
justify-content: flex-end;
}
.tab-nav ul li {
margin: 0 20px;
font-size: 14px;
}
.tab-nav ul li a {
text-decoration: none;
border-bottom: 2px solid transparent;
color: #333;
}
.tab-nav ul li a.active {
border-color: #e1251b;
color: #e1251b;
}
.tab-content {
padding: 0 16px;
}
.tab-content .item {
display: none;
}
.tab-content .item.active {
display: block;
}
</style>
</head>
<body>
<div class="tab">
<div class="tab-nav">
<h3>每日特价</h3>
<ul>
<li><a class="active" href="javascript:;" data-id="0">精选</a></li>
<li><a href="javascript:;" data-id="1">美食</a></li>
<li><a href="javascript:;" data-id="2">百货</a></li>
<li><a href="javascript:;" data-id="3">个护</a></li>
<li><a href="javascript:;" data-id="4">预告</a></li>
</ul>
</div>
<div class="tab-content">
<div class="item active"><img src="./images/tab00.png" alt="" /></div>
<div class="item"><img src="./images/tab01.png" alt="" /></div>
<div class="item"><img src="./images/tab02.png" alt="" /></div>
<div class="item"><img src="./images/tab03.png" alt="" /></div>
<div class="item"><img src="./images/tab04.png" alt="" /></div>
</div>
</div>
</body>
<script>
const ul = document.querySelector('.tab-nav ul')
ul.addEventListener('click', function (e) {
if (e.target.tagName === 'A') {
document.querySelector('.tab-nav .active').classList.remove('active')
e.target.classList.add('active')
const id = +e.target.dataset.id;
document.querySelector('.tab-content .active').classList.remove('active')
document.querySelector(`.tab-content .item:nth-child(${id + 1})`).classList.add('active')
}
})
</script>
</html>
学生信息表案例
<!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>学生信息管理</title>
<link rel="stylesheet" href="css/index.css" />
</head>
<body>
<h1>新增学员</h1>
<form class="info" autocomplete="off">
姓名:<input type="text" class="uname" name="uname" />
年龄:<input type="text" class="age" name="age" />
性别:
<select name="gender" class="gender">
<option value="男">男</option>
<option value="女">女</option>
</select>
薪资:<input type="text" class="salary" name="salary" />
就业城市:<select name="city" class="city">
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="广州">广州</option>
<option value="深圳">深圳</option>
<option value="曹县">曹县</option>
</select>
<button class="add">录入</button>
</form>
<h1>就业榜</h1>
<div style="text-align: center;">
共有数据<span>0</span>条
</div>
<table>
<thead>
<tr>
<th>学号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>薪资</th>
<th>就业城市</th>
<th>操作</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<script>
const initData = [
{
stuId: 1001,
uname: '欧阳霸天',
age: 19,
gender: '男',
salary: '20000',
city: '上海',
}
]
arr = JSON.parse(localStorage.getItem('data')) || []
const tbody = document.querySelector('tbody')
function render() {
const trArr = arr.map(function (ele, index) {
return `
<tr>
<td>${ele.stuId}</td>
<td>${ele.uname}</td>
<td>${ele.age}</td>
<td>${ele.gender}</td>
<td>${ele.salary}</td>
<td>${ele.city}</td>
<td>
<a href="javascript: " data-id="${index}">删除</a>
</td>
</tr>
`
})
tbody.innerHTML = trArr.join('')
const tiaoshu = document.querySelector('div span')
tiaoshu.innerHTML = trArr.length
}
const uname = document.querySelector('.uname')
const age = document.querySelector('.age')
const gender = document.querySelector('.gender')
const salary = document.querySelector('.salary')
const city = document.querySelector('.city')
const info = document.querySelector('.info')
const nameItems = document.querySelectorAll('[name]')
let num = 0
info.addEventListener('submit', function (e) {
num++;
e.preventDefault()
for (let i = 0; i < nameItems.length; i++) {
if (nameItems[i].value === '') {
return alert('输入不能为空')
}
}
arr.push({
stuId: num,
uname: uname.value,
age: age.value,
gender: gender.value,
salary: salary.value,
city: city.value,
});
render()
this.reset()
localStorage.setItem('data', JSON.stringify(arr))
})
tbody.addEventListener('click', function (e) {
if (e.target.tagName === 'A') {
if (confirm('您确定要删除吗')) {
arr.splice(e.target.dataset.id, 1)
localStorage.setItem('data', JSON.stringify(arr))
render()
}
}
})
</script>
</body>
</html>
倒计时
function getCountTime() {
countdown.style.backgroundColor = getRandomColor()
const now = +new Date()
const date = new Date()
const last = +new Date(date.toLocaleDateString() + ' 18:30:00')
const count = (last - now) / 1000
let h = parseInt(count / 60 / 60 % 24)
h = h < 10 ? '0' + h : h
let m = parseInt(count / 60 % 60)
m = m < 10 ? '0' + m : m
let s = parseInt(count % 60)
s = s < 10 ? '0' + s : s
console.log(h, m, s)
document.querySelector('#hour').innerHTML = h
document.querySelector('#minutes').innerHTML = m
document.querySelector('#scond').innerHTML = s
}
getCountTime()
setInterval(getCountTime, 1000)
电梯导航
(function () {
const xtxElevator = document.querySelector('.xtx-elevator')
const xtx_entry = document.querySelector('.xtx_entry')
window.addEventListener('scroll', function () {
if (document.documentElement.scrollTop >= xtx_entry.offsetTop) {
xtxElevator.style.opacity = 1
}
else {
xtxElevator.style.opacity = 0
}
})
const backTop = document.querySelector('#backTop');
backTop.addEventListener('click', () => {
document.documentElement.scrollTop = 0
})
})();
(function () {
const xtxElevatorList = document.querySelector('.xtx-elevator-list')
xtxElevatorList.addEventListener('click', (e) => {
if (e.target.tagName === 'A' && e.target.dataset.name) {
const old = document.querySelector('.xtx-elevator-list .active')
if (old) {
old.classList.remove('active')
}
e.target.classList.add('active')
const box = document.querySelector('.xtx_goods_' + e.target.dataset.name)
document.documentElement.scrollTop = box.offsetTop
}
})
})();
(function () {
const xtxNew = document.querySelector('.xtx_goods_new')
const xtxPopular = document.querySelector('.xtx_goods_popular')
const xtxBrand = document.querySelector('.xtx_goods_brand')
const xtxTopic = document.querySelector('.xtx_goods_topic')
window.addEventListener('scroll', function () {
const old = document.querySelector('.xtx-elevator-list .active')
const n = document.documentElement.scrollTop
if (old) {
old.classList.remove('active')
}
if (n >= xtxTopic.offsetTop) {
document.querySelector('[data-name="topic"]').classList.add('active')
}
else if (n >= xtxBrand.offsetTop) {
document.querySelector('[data-name="brand"]').classList.add('active')
}
else if (n >= xtxPopular.offsetTop) {
document.querySelector('[data-name="popular"]').classList.add('active')
}
else if (n >= xtxNew.offsetTop) {
document.querySelector('[data-name="new"]').classList.add('active')
}
})
})();
放大镜效果
const layer = document.querySelector('.layer')
middle.addEventListener('mouseenter', function () {
layer.style.display = 'block'
})
middle.addEventListener('mouseleave', function () {
layer.style.display = 'none'
})
middle.addEventListener('mousemove', function(e){
let x = e.pageX - middle.getBoundingClientRect().left
let y = e.pageY - middle.getBoundingClientRect().top - document.documentElement.scrollTop
if (x >= 0 && x <= 400 && y >= 0 && y <= 400) {
let mx = 0, my = 0
if (x < 100) mx = 0
if (x >= 100 && x <= 300) mx = x - 100
if (x > 300) mx = 200
if (y < 100) my = 0
if (y >= 100 && y <= 300) my = y - 100
if (y > 300) my = 200
layer.style.left = mx + 'px'
layer.style.top = my + 'px'
large.style.backgroundPositionX = -2 * mx + 'px'
large.style.backgroundPositionY = -2 * my + 'px'
}
})
防抖节流
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
.box {
width: 500px;
height: 500px;
background-color: #ccc;
color: #fff;
text-align: center;
font-size: 100px;
}
</style>
</head>
<body>
<div class="box"></div>
<script>
const box = document.querySelector('.box')
let i = 0
function mouseMove(){
box.innerHTML = ++i
}
function debounce(fn, t){
let timeId;
return function(){
if (timeId) clearTimeout(timeId)
timeId = setTimeout(() => {
fn()
}, t);
}
}
box.addEventListener('mousemove', throttle(mouseMove, 500))
function throttle(fn, t){
let timeId = null;
return function(){
if(!timeId){
timeId = setTimeout(function(){
fn()
timeId = null
},t)
}
}
}
</script>
</body>
</html>
利用api改进案例渲染写法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.list {
width: 990px;
margin: 100px auto 0;
}
.item {
padding: 15px;
transition: all .5s;
display: flex;
border-top: 1px solid #e4e4e4;
}
.item:nth-child(4n) {
margin-left: 0;
}
.item:hover {
cursor: pointer;
background-color: #f5f5f5;
}
.item img {
width: 80px;
height: 80px;
margin-right: 10px;
}
.item .name {
font-size: 18px;
margin-right: 10px;
color: #333;
flex: 2;
}
.item .name .tag {
display: block;
padding: 2px;
font-size: 12px;
color: #999;
}
.item .price,
.item .sub-total {
font-size: 18px;
color: firebrick;
flex: 1;
}
.item .price::before,
.item .sub-total::before,
.amount::before {
content: "¥";
font-size: 12px;
}
.item .spec {
flex: 2;
color: #888;
font-size: 14px;
}
.item .count {
flex: 1;
color: #aaa;
}
.total {
width: 990px;
margin: 0 auto;
display: flex;
justify-content: flex-end;
border-top: 1px solid #e4e4e4;
padding: 20px;
}
.total .amount {
font-size: 18px;
color: firebrick;
font-weight: bold;
margin-right: 50px;
}
</style>
</head>
<body>
<div class="list">
<!-- <div class="item">
<img src="https://yanxuan-item.nosdn.127.net/84a59ff9c58a77032564e61f716846d6.jpg" alt="">
<p class="name">称心如意手摇咖啡磨豆机咖啡豆研磨机 <span class="tag">【赠品】10优惠券</span></p>
<p class="spec">白色/10寸</p>
<p class="price">289.90</p>
<p class="count">x2</p>
<p class="sub-total">579.80</p>
</div> -->
</div>
<div class="total">
<div>合计:<span class="amount">1000.00</span></div>
</div>
<script>
const goodsList = [
{
id: '4001172',
name: '称心如意手摇咖啡磨豆机咖啡豆研磨机',
price: 289.9,
picture: 'https://yanxuan-item.nosdn.127.net/84a59ff9c58a77032564e61f716846d6.jpg',
count: 2,
spec: { color: '白色' }
},
{
id: '4001009',
name: '竹制干泡茶盘正方形沥水茶台品茶盘',
price: 109.8,
picture: 'https://yanxuan-item.nosdn.127.net/2d942d6bc94f1e230763e1a5a3b379e1.png',
count: 3,
spec: { size: '40cm*40cm', color: '黑色' }
},
{
id: '4001874',
name: '古法温酒汝瓷酒具套装白酒杯莲花温酒器',
price: 488,
picture: 'https://yanxuan-item.nosdn.127.net/44e51622800e4fceb6bee8e616da85fd.png',
count: 1,
spec: { color: '青色', sum: '一大四小' }
},
{
id: '4001649',
name: '大师监制龙泉青瓷茶叶罐',
price: 139,
picture: 'https://yanxuan-item.nosdn.127.net/4356c9fc150753775fe56b465314f1eb.png',
count: 1,
spec: { size: '小号', color: '紫色' },
gift: '50g茶叶,清洗球'
}
]
const list = document.querySelector('.list')
// let sum = 0;
list.innerHTML = goodsList.map(({id,name,price,picture,count,spec,gift})=>{
// sum += price * count
let giftStr = ''
//赠品问题 若为空则不显示赠品
if(gift !== undefined){
giftStr = gift.split(',').map(item => {
return `<span class="tag">【赠品】${item}</span>`
}).join('')
}else{
giftStr = ''
}
return `
<div class="item" id="${id}">
<img src="${picture}" alt="">
<p class="name">${name}
${giftStr}
</p>
<p class="spec">${Object.values(spec).join('/')}</p>
<p class="price">${price.toFixed(2)}</p>
<p class="count">x${count}</p>
<p class="sub-total">${(count * price).toFixed(2)}</p>
</div>
`
}).join('')
const amount = document.querySelector('.amount')
// amount.innerHTML = sum.toFixed(2)
//使用reduce方法求和
const total = goodsList.reduce((prev,item)=> prev + (item.price * item.count *100)/100,0)
amount.innerHTML = total.toFixed(2)
//处理小数的一种方法(0.1*10 + 0.2*10)/10
</script>
</body>
</html>