Изменение класса в зависимости от положения дива
Доброго времени суток!
Данная функция должна менять класс элементов с "like_box" на "like_box_fixed". Первый имеет позицию relative, второй fixed. Но проблема в том, что одна функция должна менять классы у всех дивов, как только окно опуститься до него. Надеюсь на Вашу помощь, заранее благодарен.
$(function() {
var likeboxElem = document.getElementById('like_box');
var offset = $("#like_box").offset();
var topPadding = 30;
$(window).scroll(function() {
if ($(window).scrollTop() > offset.top) {
likeboxElem.className = "like_box";
}
else {
likeboxElem.className = "like_box_fixed";
;};});
});
|
function getCoords(elem) {
var box = elem.getBoundingClientRect();
var body = document.body;
var docElem = document.documentElement;
var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
var clientTop = docElem.clientTop || body.clientTop || 0;
var clientLeft = docElem.clientLeft || body.clientLeft || 0;
var top = box.top + scrollTop - clientTop;
var left = box.left + scrollLeft - clientLeft;
return { top: Math.round(top), left: Math.round(left) };
}
function isVisible(elem) {
var coords = getCoords(elem);
var windowTop = window.pageYOffset || document.documentElement.scrollTop;
var windowBottom = windowTop + document.documentElement.clientHeight;
coords.bottom = coords.top + elem.offsetHeight;
// верхняя граница elem в пределах видимости ИЛИ нижняя граница видима
var topVisible = coords.top > windowTop && coords.top < windowBottom;
var bottomVisible = coords.bottom < windowBottom && coords.bottom > windowTop;
return topVisible || bottomVisible;
}
function showVisible() {
var likeboxElem = document.getElementById('like_box');
if (isVisible(likeboxElem)) {
likeboxElem.className = "like_box_fixed";
}
}
window.onscroll = showVisible
Соответственно в функции showVisible пилите то, что хотите. |
Классически это делают так :$('div:eq(1)').animate({top:123px},function(){$('div':not($(this))).addClass('такой-то'))}')СИНТАКСИС исправь как нужно(Дримвивер высвечивает синтаксис как Ворд ошибки в тексте)
|
Я так подумал и понял, что совсем не правильно объяснил проблему. Попробовал отобразить желаемый результат на картинке. На одной странице есть несколько дивов с классом like_box, по мере того, как див появляется в поле зрения, его класс меняется на like_box_fixed , но он не должен выходить за рамки большего дива (parent).
|
|
А причем здесь
Цитата:
|
Deff, как всегда - спасибо. Липкие блоки именно то, что нужно.
danik.js, да, думаю ты прав, не при чем. |
1) Не jQuery
2) Не кроссбраузерно 3) Просто демка.
<style>
div{
height: 50px;
margin: 100px 0;
border: 1px dotted gray;
}
span{
position: fixed;
top: 10px;;
right: 10px;
padding: 10px;
background: rgba(0,0,0,0.8);
color: white;
text-shadow: 1px white;
box-shadow: 0 0 10px rgba(0,0,0,0.5);
}
</style>
<span></span>
<div>Block 1</div>
<div>Block 2</div>
<div>Block 3</div>
<script>
var blocks = document.getElementsByTagName('div');
var span = document.getElementsByTagName('span').item(0);
function update() {
var messages = [];
for (var i=0; i < blocks.length; i++) {
var rect = blocks[i].getBoundingClientRect();
var visible = rect.bottom > 0 && rect.top < window.innerHeight;
messages[i] = 'Блок ' + (i+1) + (visible ? ' видим' : ' невидим');
}
span.innerHTML = messages.join('<br>');
}
window.addEventListener('scroll', update);
update();
</script>
|
В опере и FF не работает
|
Теперь работает (В FF точно)
|
| Часовой пояс GMT +3, время: 15:08. |