插眼记录
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<style>
body {
/* 让页面足够长,能产生滚动效果 */
margin: 0;
padding: 0;
}
.box {
width: 100%;
height: 300px;
background-color: #4CAF50;
transition: width 0.3s linear, border-radius 0.3s linear;
/* 动画过渡 */
margin: 100px auto;
}
.content {
width: 100%;
text-align: center;
line-height: 300px;
color: white;
font-size: 24px;
border-radius: 10px;
}
.container {
display: flex;
flex-direction: column;
gap: 20px;
margin: 30px 100px;
}
.item {
opacity: 0;
transform: translateY(30px);
transition: opacity 1s ease, transform 1s ease;
background-color: #4CAF50;
color: white;
padding: 140px;
border-radius: 5px;
text-align: center;
font-size: 20px;
margin-bottom: 20px;
}
.item2 {
opacity: 0;
transform: translateX(-100px);
transition: opacity 1s ease, transform 1s ease;
background-color: #4CAF50;
color: white;
padding: 140px;
border-radius: 5px;
text-align: center;
font-size: 20px;
}
.item2,
.item3 {
flex: 1;
margin-bottom: 20px;
}
.item3 {
opacity: 0;
transform: translateX(100px);
transition: opacity 1s ease, transform 1s ease;
background-color: #4CAF50;
color: white;
padding: 140px;
border-radius: 5px;
text-align: center;
font-size: 20px;
}
.item.visible {
opacity: 1;
transform: translateY(0);
}
.item2.visible,
.item3.visible {
opacity: 1;
transform: translateX(0);
}
</style>
<body>
<div class="container">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="box">
<div class="content">Scroll me!</div>
</div>
<div style="display: flex;justify-content: space-between;gap:0 20px;">
<div class="item2">Item 3</div>
<div class="item3">Item 4</div>
</div>
<div class="item">Item 5</div>
<div class="item">Item 6</div>
<div style="display: flex;justify-content: space-between;gap:0 20px;">
<div class="item2">Item 7</div>
<div class="item3">Item 8</div>
</div>
<div class="item">Item 9</div>
<div class="item">Item 10</div>
</div>
</body>
<script>
const observerFun = () => {
return new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
const element = entry.target;
const isVisible = entry.isIntersecting;
if (isVisible && !element.classList.contains('visible')) {
// 当元素进入视图且没有 visible 类时,添加 visible 类
element.classList.add('visible');
} else if (!isVisible && element.classList.contains('visible')) {
// 当元素离开视图且有 visible 类时,移除 visible 类
element.classList.remove('visible');
}
});
}, {
// threshold: 0.5, // 默认是0
});
}
const observer3=observerFun()
// 获取所有item元素并观察它们
const items = document.querySelectorAll('.item, .item2, .item3');
items.forEach(item => {
observer3.observe(item);
});
// observer.disconnect();停止观察,放在销毁的生命周期中
const box = document.querySelector('.box');
const maxScroll = 900; // 控制效果变化的最大滚动距离
const maxRadius = 40; // 最大圆角半径(50%)
const minWidth = 85; // 最小宽度(50%)
const scrollThreshold = 120; // 滚动位置的阈值
// 处理滚动效果
const handleScroll = () => {
const scrollPosition = window.scrollY; // 获取当前的滚动位置
console.log(scrollPosition)
// 只有在滚动位置大于阈值时才进行更新
if (scrollPosition >= scrollThreshold) {
const scrollPercentage = Math.min((scrollPosition - scrollThreshold) / maxScroll, 1); // 控制比例不超过 1
const borderRadius = maxRadius * scrollPercentage; // 根据比例计算圆角
const width = Math.max(100 - (scrollPercentage * (100 - minWidth)), minWidth); // 根据比例计算宽度
box.style.borderRadius = `${borderRadius}px`;
box.style.width = `${width}%`;
} else {
// 如果滚动回到阈值以下,恢复初始状态
box.style.borderRadius = '0px';
box.style.width = '100%';
}
};
// 为滚动事件绑定监听器
window.addEventListener('scroll', handleScroll);
// 移除滚动事件监听
// const removeScrollListener = () => {
// window.removeEventListener('scroll', handleScroll);
// };
</script>
</html>
本文来自博客园,作者:最帅爸爸,转载请注明原文链接:https://www.cnblogs.com/zsbb
浙公网安备 33010602011771号