#javascript #html #css
#javascript #HTML #css
Вопрос:
На моем веб-сайте у меня есть всплывающая модель с плавающей точкой, которая фиксируется внизу страницы. на этой странице у меня разные разделы. когда я прокручиваю веб-сайт, этот модальный параметр будет виден только в некоторых разделах, а для других разделов он должен скрываться.
Пример приведенного ниже кода, который всплывает во всплывающем окне, должен скрывать разделы баннера и нижнего колонтитула при прокрутке на этой странице. но если я представляю или просматриваю в остальной части раздела, он должен быть виден. Я хочу такого рода вещи. кто-нибудь, пожалуйста, помогите мне добиться этого.
Я пытался использовать JavaScript, но он не работает, этот код скрывает всплывающее модальное окно для всех разделов.
var mainbanner = document.querySelector(".banner");
if (mainbanner.top != window.self) {
document.getElementByClassName("float-popup").style.display = "none ";
}
section{
height:300px;
text-align:center;
}
section:nth-child(odd) {
background:#acacac;
}
section:nth-child(even) {
background:#e47d7d;
}
p{
color:red;
}
.float-popup{
position:fixed;
bottom:0;
left:0;
width:100%;
background:#000;
text-align:center;
}
body{
position:relative;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<section class="banner">
<p>banner content</p>
</section>
<section class="services">
<p>services content</p>
</section>
<section class="features">
<p>features content</p>
</section>
<section class="footer">
<p>footer content</p>
</section>
<div class="float-popup">
<p>float content</p>
</div>
</body>
Ответ №1:
Даже я искал решение точно такой же проблемы, и я нашел ее решение. Я попробовал некоторый код, и он работал нормально. Это сработало бы:
function checkFloatingDiv() {
var section1 = document.querySelector('.banner');
var position1 = section1.getBoundingClientRect();
var section2 = document.querySelector('.footer');
var position2 = section2.getBoundingClientRect();
//Checking whether the specified sections are visible
//If any of them is visible, then show the float content. Else, hide it.
if (position1.top < window.innerHeight amp;amp; position1.bottom >= 0) {
//Show the floating element
document.querySelector('.float-popup').style.display = "block";
return;
} else {
document.querySelector('.float-popup').style.display = "none";
}
if (position2.top < window.innerHeight amp;amp; position2.bottom >= 0) {
//Show the floating element
document.querySelector('.float-popup').style.display = "block";
} else {
document.querySelector('.float-popup').style.display = "none";
}
}
// Run the function on scroll
window.addEventListener("scroll", checkFloatingDiv);
// Run the function on load, if any elements are already visible without scrolling
window.addEventListener("load", checkFloatingDiv);
section {
height: 300px;
text-align: center;
}
section:nth-child(odd) {
background: #acacac;
}
section:nth-child(even) {
background: #e47d7d;
}
p {
color: red;
}
.float-popup {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
background: #000;
text-align: center;
}
body {
position: relative;
}
<section class="banner">
<p>banner content</p>
</section>
<section class="services">
<p>services content</p>
</section>
<section class="features">
<p>features content</p>
</section>
<section class="footer">
<p>footer content</p>
</section>
<div class="float-popup" style="display: none;">
<p>float content</p>
</div>
P / S: В этом коде я привел пример того, что содержимое с плавающей точкой будет видно только тогда, когда содержимое «баннера» и «нижнего колонтитула» будет видно на экране. Вы определенно можете изменить его в соответствии с вашими требованиями.
Ответ №2:
getElementByClassName не является функцией, попробуйте это вместо
document.getElementsByClassName("float-popup")[0].style.display = "none";
Комментарии:
1. спасибо за ваш ответ. но если я использую ваш код, это скроется для всех разделов. я хочу, чтобы при прокрутке баннера и нижнего колонтитула всплывающее окно скрывалось, а для других разделов оно должно отображаться во время прокрутки.
Ответ №3:
document.getElementByClassName
это не функция JavaScript, вы, кажется, имеете в виду document.getElementsByClassName
функцию (обратите внимание на элементы), которая возвращает массив. Итак, если есть только один элемент с этим именем класса, просто получите 0-й индекс этого массива.
Вот так:
document.getElementsByClassName("float-popup")[0].style.display = "none ";
const mainbanner = document.getElementsByClassName("banner")[0]; // I'm assuming this is what "mainbanner" variable is
if (mainbanner.top != window.self) {
document.getElementsByClassName("float-popup")[0].style.display = "none";
}
section{
height:300px;
text-align:center;
}
section:nth-child(odd) {
background:#acacac;
}
section:nth-child(even) {
background:#e47d7d;
}
p{
color:red;
}
.float-popup{
position:fixed;
bottom:0;
left:0;
width:100%;
background:#000;
text-align:center;
}
body{
position:relative;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<section class="banner">
<p>banner content</p>
</section>
<section class="services">
<p>services content</p>
</section>
<section class="features">
<p>features content</p>
</section>
<section class="footer">
<p>footer content</p>
</section>
<div class="float-popup">
<p>float content</p>
</div>
</body>
Комментарии:
1. это скрывает всплывающее модальное окно для всех разделов. Я спросил, что он должен скрываться при прокрутке только баннера и нижнего колонтитула, но если я представляю в сервисах или функциях, он должен отображаться в нижней части с плавающей точкой.
2. Все, что я сделал, это исправил ваш JavaScript, который вы не реализовали должным образом
getElementsByClassName(...)[0]
3. при прокрутке это скрывается для всех разделов. Мне нужно, чтобы он скрывал только разделы.
4. Ну, если вы хотите, чтобы он обновлялся, ваш JavaScript должен быть в каком-то цикле
5. Или привязать прослушиватель событий к прокрутке
Ответ №4:
Я предполагаю, что вы выполняете какую-то работу, когда определенный div (баннер / нижний колонтитул) виден в окне просмотра. Если это то, что вы ищете, вы можете использовать это.
function isInViewport(el) {
const rect = el.getBoundingClientRect();
return (
rect.top >= 0 amp;amp;
rect.left >= 0 amp;amp;
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) amp;amp;
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
}
const banner = document.querySelector('.banner');
const footer = document.querySelector('.footer');
const floatPopup = document.querySelector('.float-popup');
document.addEventListener('scroll', () => {
const floatPopupDisplay = isInViewport(banner) || isInViewport(footer) ?
"block" : 'none';
floatPopup.style.display = floatPopupDisplay;
}, {
passive: true
});
Комментарии:
1. да … что бы вы ни говорили, это правильно. но ваш код также не работает.