①:鼠标经过对应小盒子,左侧中等盒子显示对应中等图片
// ①:鼠标经过对应小盒子,左侧中等盒子显示对应中等图片
const small = document.querySelector('.small')
const middleImg = document.querySelector('.middle img')
const largeImg = document.querySelector('.large')
// 通过事件委托对图片进行绑定事件
small.addEventListener('mouseover', function (e) {
if (e.target.tagName === 'IMG') {
// 排他
this.querySelector('.active').classList.remove('active')
// 给li(img的父元素)添加类名
e.target.parentNode.classList.add('active')
// 将小盒子的路径给中等盒子
middleImg.src = e.target.src
// 将小盒子的路径给大盒子
largeImg.style.backgroundImage = `url(${e.target.src})`
}
})
②: 鼠标经过中盒子,右侧会显示放大镜效果的大盒子
// ②: 鼠标经过中盒子,右侧会显示放大镜效果的大盒子
// 定义显示和隐藏函数
let timeId = null
function show() {
clearTimeout(timeId)
largeImg.style.display = 'block'
}
function hidde() {
timeId = setTimeout(function () {
largeImg.style.display = 'none'
}, 200)
}
middleImg.addEventListener('mouseover', show)
middleImg.addEventListener('mouseleave', hidde)
largeImg.addEventListener('mouseover', show)
largeImg.addEventListener('mouseleave', hidde)
③: 黑色遮罩盒子跟着鼠标来移动
④: 鼠标在中等盒子上移动,大盒子的图片跟着显示对应位置
大盒子图片移动的计算方法:
- 中等盒子是 400px 大盒子 是 800px 的图片
- 中等盒子移动1px, 大盒子就应该移动2px, 只不过是负值
// ③: 黑色遮罩盒子跟着鼠标来移动
const layer = document.querySelector('.layer')
middleImg.addEventListener('mouseenter', function () {
// 鼠标进入显示黑色遮罩盒子
layer.style.display = 'block'
})
middleImg.addEventListener('mouseleave', function () {
// 鼠标移出隐藏黑色遮罩盒子
layer.style.display = 'none'
})
middleImg.addEventListener('mousemove', function (e) {
// pageX得到鼠标在页面中的坐标
// console.log(e.pageX)
// 得到middle中等盒子在页面中的坐标 middle.getBoundingClientRect()
// console.log(middleImg.getBoundingClientRect().x)
// 鼠标在middle 盒子里面的坐标 = 鼠标在页面中的坐标 - middle 中等盒子的坐标
let middleMouseX = e.pageX - middleImg.getBoundingClientRect().x
// 注意 y坐标特殊,需要减去 页面被卷去的头部
let middleMouseY =
e.pageY -
middleImg.getBoundingClientRect().y -
document.documentElement.scrollTop
// 遮罩的盒子移动
// 限定垂直方向 大于等于0 并且小于等于 400
// 限定水平方向 大于等于0 并且小于等于 400
if (
middleMouseY >= 0 &&
middleMouseY <= 400 &&
middleMouseX >= 0 &&
middleMouseX <= 400
) {
// 遮罩盒子移动的坐标:
// ■ 声明一个 mx 作为移动的距离
// ■ 水平坐标 x 如果 小于等于100 ,则移动的距离 mx 就是 0 不应该移动
// ■ 水平坐标 如果 大于等于100 并且小于300,移动的距离就是 mx - 100 (100是遮罩盒子自身宽度的一半)
// ■ 水平坐标 如果 大于等于300,移动的距离就是 mx 就是200 不应该在移动了
// ■ 其实我们发现水平移动, 就在 100 ~ 200 之间移动的
// ■ 垂直同理
let mx = 0
// 水平坐标 如果 大于等于300,移动的距离就是 mx 就是200 不应该在移动了
if (middleMouseX >= 300) {
mx = 200
} else if (middleMouseX >= 100) {
// 水平坐标 如果 大于等于100 并且小于300,移动的距离就是 mx - 100
mx = middleMouseX - 100
} else {
mx = 0
}
let my = 0
// 垂直坐标 如果 大于等于300,移动的距离就是 my 就是200 不应该在移动了
if (middleMouseY >= 300) {
my = 200
} else if (middleMouseY >= 100) {
// 垂直坐标 如果 大于等于100 并且小于300,移动的距离就是 my - 100
my = middleMouseY - 100
} else {
my = 0
}
layer.style.top = my + 'px'
layer.style.left = mx + 'px'
// ④: 鼠标在中等盒子上移动,大盒子的图片跟着显示对应位置
// - 中等盒子是 400px 大盒子 是 800px 的图片
// - 中等盒子移动1px, 大盒子就应该移动2px, 只不过是负值
largeImg.style.backgroundPositionX = -2 * mx + 'px'
largeImg.style.backgroundPositionY = -2 * my + 'px'
}
})
// ①:鼠标经过对应小盒子,左侧中等盒子显示对应中等图片
const small = document.querySelector('.small')
const middleImg = document.querySelector('.middle')
const largeImg = document.querySelector('.large')
// 通过事件委托对图片进行绑定事件
small.addEventListener('mouseover', function (e) {
if (e.target.tagName === 'IMG') {
// 排他
this.querySelector('.active').classList.remove('active')
// 给li(img的父元素)添加类名
e.target.parentNode.classList.add('active')
// 将小盒子的路径给中等盒子
middleImg.querySelector('img').src = e.target.src
// 将小盒子的路径给大盒子
largeImg.style.backgroundImage = `url(${e.target.src})`
}
})
// ②: 鼠标经过中盒子,右侧会显示放大镜效果的大盒子
// 定义显示和隐藏函数
let timeId = null
function show() {
clearTimeout(timeId)
largeImg.style.display = 'block'
}
function hidde() {
timeId = setTimeout(function () {
largeImg.style.display = 'none'
}, 200)
}
middleImg.addEventListener('mouseover', show)
middleImg.addEventListener('mouseleave', hidde)
largeImg.addEventListener('mouseover', show)
largeImg.addEventListener('mouseleave', hidde)
// ③: 黑色遮罩盒子跟着鼠标来移动
const layer = document.querySelector('.layer')
middleImg.addEventListener('mouseenter', function () {
// 鼠标进入显示黑色遮罩盒子
layer.style.display = 'block'
})
middleImg.addEventListener('mouseleave', function () {
// 鼠标移出隐藏黑色遮罩盒子
layer.style.display = 'none'
})
middleImg.addEventListener('mousemove', function (e) {
// pageX得到鼠标在页面中的坐标
// console.log(e.pageX)
// 得到middle中等盒子在页面中的坐标 middle.getBoundingClientRect()
// console.log(middleImg.getBoundingClientRect().x)
// 鼠标在middle 盒子里面的坐标 = 鼠标在页面中的坐标 - middle 中等盒子的坐标
let middleMouseX = e.pageX - middleImg.getBoundingClientRect().x
// 注意 y坐标特殊,需要减去 页面被卷去的头部
let middleMouseY =
e.pageY -
middleImg.getBoundingClientRect().y -
document.documentElement.scrollTop
// 遮罩的盒子移动
// 限定垂直方向 大于等于0 并且小于等于 400
// 限定水平方向 大于等于0 并且小于等于 400
if (
middleMouseY >= 0 &&
middleMouseY <= 400 &&
middleMouseX >= 0 &&
middleMouseX <= 400
) {
// 遮罩盒子移动的坐标:
// ■ 声明一个 mx 作为移动的距离
// ■ 水平坐标 x 如果 小于等于100 ,则移动的距离 mx 就是 0 不应该移动
// ■ 水平坐标 如果 大于等于100 并且小于300,移动的距离就是 mx - 100 (100是遮罩盒子自身宽度的一半)
// ■ 水平坐标 如果 大于等于300,移动的距离就是 mx 就是200 不应该在移动了
// ■ 其实我们发现水平移动, 就在 100 ~ 200 之间移动的
// ■ 垂直同理
let mx = 0
// 水平坐标 如果 大于等于300,移动的距离就是 mx 就是200 不应该在移动了
if (middleMouseX >= 300) {
mx = 200
} else if (middleMouseX >= 100) {
// 水平坐标 如果 大于等于100 并且小于300,移动的距离就是 mx - 100
mx = middleMouseX - 100
} else {
mx = 0
}
let my = 0
// 垂直坐标 如果 大于等于300,移动的距离就是 my 就是200 不应该在移动了
if (middleMouseY >= 300) {
my = 200
} else if (middleMouseY >= 100) {
// 垂直坐标 如果 大于等于100 并且小于300,移动的距离就是 my - 100
my = middleMouseY - 100
} else {
my = 0
}
layer.style.top = my + 'px'
layer.style.left = mx + 'px'
// ④: 鼠标在中等盒子上移动,大盒子的图片跟着显示对应位置
// - 中等盒子是 400px 大盒子 是 800px 的图片
// - 中等盒子移动1px, 大盒子就应该移动2px, 只不过是负值
largeImg.style.backgroundPositionX = -2 * mx + 'px'
largeImg.style.backgroundPositionY = -2 * my + 'px'
}
})