Javascript 如何增加/减少固定容器内滚动元素的不透明度
我正试图用一种让我发疯的变化来重现一种类似的效果 获得与BBC网站相同的效果很容易,我已经复制了它,但我想要实现的是为固定框内滚动的元素创建淡入淡出过渡;基本上,子元素应该从Javascript 如何增加/减少固定容器内滚动元素的不透明度,javascript,html,css,Javascript,Html,Css,我正试图用一种让我发疯的变化来重现一种类似的效果 获得与BBC网站相同的效果很容易,我已经复制了它,但我想要实现的是为固定框内滚动的元素创建淡入淡出过渡;基本上,子元素应该从opacity:0开始,然后在滚动的“中点”更改其不透明度直到opacity:1,然后在到达容器顶部时逐渐返回到opacity:0。 以下是我得出的结论 TL,DR: 一个简单的例子来说明我想要达到的目标 HTML 相关JS const{ 页面偏移 }=窗口 //“storyItem”是元素 //“元素”是滚动的子元素 常
opacity:0
开始,然后在滚动的“中点”更改其不透明度直到opacity:1
,然后在到达容器顶部时逐渐返回到opacity:0
。以下是我得出的结论 TL,DR: 一个简单的例子来说明我想要达到的目标 HTML 相关JS
const{
页面偏移
}=窗口
//“storyItem”是元素
//“元素”是滚动的子元素
常数{
包装纸,
元素
}=故事项;
常数{
班级名单,
偏置
}=包装;
if(classList.contains(this.fixedlementclass)){
const totalOffset=pageYOffset-offsetTop;
元素。forEach((项目)=>{
常数{
抵消,
阴蒂
}=项目
常数[开始、中间、结束]=[
抵消,
(偏置+平衡重量/2),
(偏置+倾斜高度)
]
设setOpacity=0;
如果(总偏移量<开始|总偏移量>结束){
setOpacity=0;
}否则{
setOpacity=(clientHeight*2-总偏移量)/clientHeight;
}
log(`Set opacity:${setOpacity}`);
item.style.opacity=setOpacity;
})
}
但我只是在不透明度上得到了一个奇怪的行为,从0到0.7,基本上被卡住了
<header>
<h2>JS Scroll Stories</h2>
</header>
<main id="wrapper">
<div class="js-story">
<div class="js-story-images">
<div class="images-wrapper">
<img src="https://via.placeholder.com/1440x700" />
<img src="https://via.placeholder.com/1440x700" />
<img src="https://via.placeholder.com/1440x700" />
<img src="https://via.placeholder.com/1440x700" />
<img src="https://via.placeholder.com/1440x700" />
<img src="https://via.placeholder.com/1440x700" />
</div>
</div>
<div class="js-story-elements">
<p>Pellentesque scelerisque velit tortor. Proin.</p>
<p>Quisque eget risus quis libero.</p>
<p>Duis lorem magna, molestie in.</p>
<p>Aliquam commodo convallis tellus, eu.</p>
<p>Phasellus eu gravida est, eu.</p>
<p>Ut non purus neque. Proin.</p>
</div>
</div>
</main>
div.js-story.fixed-top div.js-story-images {
position: fixed;
top: 0;
bottom: inherit;
width: 100%;
}
div.js-story div.js-story-images {
z-index: -100;
}
div.js-story div.js-story-images div.images-wrapper {
position: relative;
}
div.js-story div.js-story-images div.images-wrapper img {
position: absolute;
top: 0;
left: 0;
right: 0;
margin: 0 auto;
}
div.js-story div.js-story-elements {
width: 100%;
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
}
div.js-story div.js-story-elements:before,
div.js-story div.js-story-elements:after {
content: '';
display: block;
position: static;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: transparent;
}
div.js-story div.js-story-elements p {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
margin: 0;
opacity: 0;
position: relative;
transition: opacity 300ms ease-in;
background-color: red;
}
const {
pageYOffset
} = window
// a "storyItem" is the <div class="js-story"> element
// "elements" are the children which are scrolling
const {
wrapper,
elements
} = storyItem;
const {
classList,
offsetTop
} = wrapper;
if (classList.contains(this.fixedElementClass)) {
const totalOffset = pageYOffset - offsetTop;
elements.forEach((item) => {
const {
offsetTop,
clientHeight
} = item
const [start, middle, end] = [
offsetTop,
(offsetTop + clientHeight / 2),
(offsetTop + clientHeight)
]
let setOpacity = 0;
if (totalOffset < start || totalOffset > end) {
setOpacity = 0;
} else {
setOpacity = (clientHeight * 2 - totalOffset) / clientHeight;
}
console.log(`Set opacity: ${setOpacity}`);
item.style.opacity = setOpacity;
})
}