[英]Javascript for making the element disappear and reappear after scroll
我希望一個元素在從頂部滾動后消失並重新出現。 我為此找到了 javascript,但有些不對勁。 我對 JS 不太了解,我在這里找到它,插入它,但它不能正常工作 - 它只會使元素改變 position。 我在 StackExchange 和 Internet 上找到的 javascript 的多個示例由於某種原因也不起作用。
如何使元素在向下滾動后消失並在滾動回頂部后重新出現?
我還在小屏幕上為這個元素設置了 CSS,那么我應該為小屏幕制作單獨的腳本嗎?
var prevScrollpos = window.pageYOffset; window.onscroll = function() { var currentScrollPos = window.pageYOffset; if (prevScrollpos > currentScrollPos) { document.getElementById("stub").style.top = "0"; } else { document.getElementById("stub").style.top = "150px"; } prevScrollpos = currentScrollPos; }
.stub { background-color: #577284; float: right; position: fixed; right: 0; text-transform: uppercase; font-family: 'Yanone Kaffeesatz', sans-serif; font-weight: 700; padding: 10px; border: 3px solid #ff8000; margin-right: 1em; } #stublink { color: #F3E0BE; text-decoration: none; }.stub:hover.pagenav { display: block; position: absolute; top: 100%; left: -3px; width: calc(100% + 6px); }.pagenav { background-color: #577284; display: none; text-transform: uppercase; font-size: 0.8em; font-family: 'Yanone Kaffeesatz', sans-serif; font-weight: 700; border: 3px solid #ff8000; border-top: none; padding-bottom: 10px; }.pagenav a { display: block; color: #F3E0BE; padding: 6px 0px 0px 8px; }.pagenav a:hover { box-shadow: inset 5px 0 0 0 #ff8000 } body { height: 200vh }; @media only screen and (max-width: 670px) {.stub { right: 0; left: auto; top: 0; bottom: auto; }.stub:hover.pagenav { display: block; position: absolute; top: 100%; left: -3px; } }
<body> <div class="stub" id="stub"> <div class="pagenav"> <a href="#last"> <table> <tr> <td>02.19 03.20</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#previous"> <table> <tr> <td>02.18 02.19</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#dec17"> <table> <tr> <td>12.17 04.18</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#nov17"> <table> <tr> <td>11.17 01.18</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#sep16"> <table> <tr> <td>09.16 11.17</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#sep15"> <table> <tr> <td>09.15 08.16</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#jan15"> <table> <tr> <td>01.15 03.16</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#jan14"> <table> <tr> <td>01.14 08.15</td> <td>:</td> <td class="two"></td> </tr> </table> </a> </div><a id="stublink" href=#>Pagemenu</a> </div> <script></script> </body>
更改該行 document.getElementById("stub").style.top = "0"; 對於那個 document.getElementById("stub").style.block = "block";
var prevScrollpos = window.pageYOffset; window.onscroll = function() { var currentScrollPos = window.pageYOffset; if (prevScrollpos > currentScrollPos) { document.getElementById("stub").style.display = "block"; } else { document.getElementById("stub").style.display = "none"; } prevScrollpos = currentScrollPos; }
.stub { background-color: #577284; float: right; position: fixed; right: 0; text-transform: uppercase; font-family: 'Yanone Kaffeesatz', sans-serif; font-weight: 700; padding: 10px; border: 3px solid #ff8000; margin-right: 1em; } #stublink { color: #F3E0BE; text-decoration: none; }.stub:hover.pagenav { display: block; position: absolute; top: 100%; left: -3px; width: calc(100% + 6px); }.pagenav { background-color: #577284; display: none; text-transform: uppercase; font-size: 0.8em; font-family: 'Yanone Kaffeesatz', sans-serif; font-weight: 700; border: 3px solid #ff8000; border-top: none; padding-bottom: 10px; }.pagenav a { display: block; color: #F3E0BE; padding: 6px 0px 0px 8px; }.pagenav a:hover { box-shadow: inset 5px 0 0 0 #ff8000 } body { height: 200vh }; @media only screen and (max-width: 670px) {.stub { right: 0; left: auto; top: 0; bottom: auto; }.stub:hover.pagenav { display: block; position: absolute; top: 100%; left: -3px; } }
<body> <div class="stub" id="stub"> <div class="pagenav"> <a href="#last"> <table> <tr> <td>02.19 03.20</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#previous"> <table> <tr> <td>02.18 02.19</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#dec17"> <table> <tr> <td>12.17 04.18</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#nov17"> <table> <tr> <td>11.17 01.18</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#sep16"> <table> <tr> <td>09.16 11.17</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#sep15"> <table> <tr> <td>09.15 08.16</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#jan15"> <table> <tr> <td>01.15 03.16</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#jan14"> <table> <tr> <td>01.14 08.15</td> <td>:</td> <td class="two"></td> </tr> </table> </a> </div><a id="stublink" href=#>Pagemenu</a> </div> <script></script> </body>
您需要使用id
為“存根”的元素的style.display
屬性並將其設置為:
prevScrollPos > currentScrollPos
時“阻塞”; var prevScrollPos = window.pageYOffset; window.onscroll = function() { var currentScrollPos = window.pageYOffset; document.getElementById("stub").style.display = prevScrollPos > currentScrollPos? "block": "none"; prevScrollPos = currentScrollPos; }
.stub { background-color: #577284; float: right; position: fixed; right: 0; text-transform: uppercase; font-family: 'Yanone Kaffeesatz', sans-serif; font-weight: 700; padding: 10px; border: 3px solid #ff8000; margin-right: 1em; } #stublink { color: #F3E0BE; text-decoration: none; }.stub:hover.pagenav { display: block; position: absolute; top: 100%; left: -3px; width: calc(100% + 6px); }.pagenav { background-color: #577284; display: none; text-transform: uppercase; font-size: 0.8em; font-family: 'Yanone Kaffeesatz', sans-serif; font-weight: 700; border: 3px solid #ff8000; border-top: none; padding-bottom: 10px; }.pagenav a { display: block; color: #F3E0BE; padding: 6px 0px 0px 8px; }.pagenav a:hover { box-shadow: inset 5px 0 0 0 #ff8000 } body { height: 200vh }; @media only screen and (max-width: 670px) {.stub { right: 0; left: auto; top: 0; bottom: auto; }.stub:hover.pagenav { display: block; position: absolute; top: 100%; left: -3px; } }
<div class="stub" id="stub"> <div class="pagenav"> <a href="#last"> <table> <tr> <td>02.19 03.20</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#previous"> <table> <tr> <td>02.18 02.19</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#dec17"> <table> <tr> <td>12.17 04.18</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#nov17"> <table> <tr> <td>11.17 01.18</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#sep16"> <table> <tr> <td>09.16 11.17</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#sep15"> <table> <tr> <td>09.15 08.16</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#jan15"> <table> <tr> <td>01.15 03.16</td> <td>:</td> <td class="two"></td> </tr> </table> </a> <a href="#jan14"> <table> <tr> <td>01.14 08.15</td> <td>:</td> <td class="two"></td> </tr> </table> </a> </div><a id="stublink" href=#>Pagemenu</a> </div>
我會使用交叉點觀察器 api https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
如果要使用display
css 屬性,請小心,因為使用顯示屬性:
display: none
它根本不會被渲染(嘗試使用visibility: hidden
或opacity: 0
)所以我建議使用不透明度。
css
.stub {
transition: opacity 1s linear;
opacity: 0;
}
.stub.triggered {
opacity: 1;
}
javascript:
const options = {
root: null, // The document viewport (default)
rootMargin: '0px', // No offset from the root element (default)
threshold: 1.0, // Full intersection into the root element
};
const obs = new IntersectionObserver( elms => {
elms.forEach( curr => {
if(curr.intersectionRatio < options.threshold) {
curr.target.classList.remove('triggered')
} else {
curr.target.classList.add('triggered')
}
})
}, options)
Array.from(document.querySelectorAll('.stub')).forEach(obs.observe.bind(obs))
正如您在 MDN 頁面上看到的,如果需要,可以使用 Internet Explorer polyfill https://github.com/w3c/IntersectionObserver
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.