@boga-net

Почему не определяется ширина элемента?

Здравствуйте. Сделал горизонтальный скролл, теперь хочу поймать ширину каждого слайда, чтобы ограничить высоту
родительского элемента, дабы на последний слайде окно не уходило дальше. Столкнулся с проблемой, что не могу получить ширину элементов - возвращает undefined или NaN. Не знаю, то ли потому, что элементы создаются динамически, то ли потому что jquery считает в пикселях, а у меня вьюпорты, то ли потому, что в CSS задано min-width: 100vw.
Значит надо узнавать ширину и высоту элементов (которые могут меняться в зависимости от размера экрана), чтобы этими значениями можно было манипулировать. В Хроме работает плохо, в мозилле лучше, но это не суть. Мне всё равно нужно понять, почему в моём случае не определяется ширина элементов. Поэтому, пожалуйста, без советов про изобретение велосипедов, iscroll и т.д.

https://codepen.io/anon/pen/wXqzbZ?editors=0010 (Внимание, подключён GSAP). Поэтому не могу воспользоваться fiddle

Есть массив изображений, из его длины создаётся соответствующее количество динамических элементов. Из массива берутся изображения, и устанавливаются в качестве бэкграунда этим созданным элементам. Им в css задаётся min-width: 100vw.
Затем я хочу для родительского элемента - в данном случае это body, задать ту же высоту, что и ширина всех слайдов. Не уверен,что этот способ самый лучший, но в качестве общего развития - почему бы и нет. Хотя, одним местом чую, что это тупо и есть другие более грамотные способы. Но вопрос - есть вопрос. Надо понять, почему не определяетяс ширина.
Таким образом я могу создать динамическую высоту для body, чтобы возможность скролла ограничивалась: ширина всех элементов в зависимости от ширины окна браузера = высота родительского контейнера. Скажем 3 элемента в общей сложности с шириной в 3000px и такая же высота body - дальше проскроллить не получится - если я правильно всё понял.

.wrapper

body
	width: 100%

.wrapper
	position: fixed
	width: 100vw
	height: 100%
	display: flex
	
	.slide
		min-width: 100vw
		height: 100%


var images = [
	//...Ссылки на картинки
];
var wrap = $('.wrapper');
var wrapWidth = wrap.width();
var slideWidth = $('.slide').width();
var allSlideWidth = slideWidth * images.length; // Вот такие значения и нужны. Но они NaN или undefined 
var slideHeight = $('.slide').height();
var allSlideHeight = slideHeight * images.length; // Вот такие значения и нужны. Но они NaN или undefined 

// Вот так я хочу задать высоту для body
$('body').css({
	// 'height': allSlideWidth + 'vh'
	'height': 100 * images.length + 'vw'
});

// Создание динамических элементов
for (let i = 0; i < images.length; i++) {
	wrap.append('<div class="slide"><p>'+ i +'</p></div>');
	$('.slide').eq(i).css({
		'background': 'url("'+ images[i] +'") no-repeat center / cover'
	});
}

$(window).on('scroll', function() {
	var scr = $(this).scrollTop();
	if (scr > wrapWidth * 7) {
		scr = wrapWidth * 7;
	}
	
	TweenLite.to('.wrapper', 2, {
		x: -scr,
		overflow: 5
	});
});
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
odobrygin
@odobrygin
Front-end / Back-end Developer
Добавьте setTimeout

setTimeout(function(){
  console.log($('.slide').width())
}, 4);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы