Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Изменение класса в зависимости от положения дива (https://javascript.ru/forum/server/35603-izmenenie-klassa-v-zavisimosti-ot-polozheniya-diva.html)

Mateus 15.02.2013 20:54

Изменение класса в зависимости от положения дива
 
Доброго времени суток!
Данная функция должна менять класс элементов с "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";
				;};});
			
	});

VHS1980 16.02.2013 21:37

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 пилите то, что хотите.

asmprog 16.02.2013 23:04

Классически это делают так :$('div:eq(1)').animate({top:123px},function(){$('div':not($(this))).addClass('такой-то'))}')СИНТАКСИС исправь как нужно(Дримвивер высвечивает синтаксис как Ворд ошибки в тексте)

Mateus 17.02.2013 14:15

Я так подумал и понял, что совсем не правильно объяснил проблему. Попробовал отобразить желаемый результат на картинке. На одной странице есть несколько дивов с классом like_box, по мере того, как див появляется в поле зрения, его класс меняется на like_box_fixed , но он не должен выходить за рамки большего дива (parent).

Deff 17.02.2013 14:21

http://javascript.ru/forum/misc/2898...kie-bloki.html
http://javascript.ru/forum/misc/2892...tml#post181794

danik.js 17.02.2013 14:26

А причем здесь
Цитата:

Сообщение от Mateus
Серверные языки и технологии

?

Mateus 17.02.2013 14:39

Deff, как всегда - спасибо. Липкие блоки именно то, что нужно.
danik.js, да, думаю ты прав, не при чем.

danik.js 17.02.2013 14:49

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>

Deff 17.02.2013 15:28

В опере и FF не работает

danik.js 17.02.2013 15:46

Теперь работает (В FF точно)


Часовой пояс GMT +3, время: 22:18.