Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.11.2016, 12:24
Интересующийся
Отправить личное сообщение для kulbabka Посмотреть профиль Найти все сообщения от kulbabka
 
Регистрация: 07.11.2016
Сообщений: 10

Необходимо отцентрировать изображения в блоках по вертикали и горизонтали
Есть такой html код:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Example</title>
	<link media="all" rel="stylesheet" href="../common.css">
</head>
<body class="task2">

	<ul id="list-holder">
		<li><img src="images/image01.jpg" alt="image" width="132" height="92"/></li>
		<li><img src="images/image05.jpg" alt="image" width="83" height="60"/></li>
		<li><img src="images/image09.jpg" alt="image" width="90" height="83"/></li>
	</ul>

</body>
</html>


Алгоритм такой: выбрать все <li> внутри <ul id="list-holder">. В каждой найти <img>, который нужно измерить и спозиционировать по центру используя свойства marginTop и marginLeft.

Мое решение:
window.onload = function(){
	elements = document.getElementById('list-holder').childNodes;
	for(var j = 0; j < elements.length; j++){
		img = elements.getElementsByTagName('img')[j];	
	}
	for(var i = 0; i < elements.length; i++){
		img[i].style.marginLeft = ((elements[i].width - img[i].width)/2) + 'px';	
		img[i].style.marginTop = ((elements[i].height - img[i].height)/2) + 'px';
	}
};


Не срабатывает. Похоже, я неправильно ищу дочерние елементы или неправильно перебираю массив. Помогите
Ответить с цитированием
  #2 (permalink)  
Старый 07.11.2016, 13:19
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от kulbabka
выбрать все <li> внутри <ul id="list-holder">. В каждой найти <img>, который нужно измерить и спозиционировать по центру используя свойства marginTop и marginLeft
Центрирование можно реализовать правильной версткой. Т.о. никакой скрип не понадобится...
Ответить с цитированием
  #3 (permalink)  
Старый 07.11.2016, 13:30
Интересующийся
Отправить личное сообщение для kulbabka Посмотреть профиль Найти все сообщения от kulbabka
 
Регистрация: 07.11.2016
Сообщений: 10

Тут идея с помощью js попробовать задать стили. И задание на правильное нахождение элементов
Ответить с цитированием
  #4 (permalink)  
Старый 07.11.2016, 14:45
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от kulbabka
задание на правильное нахождение элементов
Вона че...
Сообщение от kulbabka
Похоже, я неправильно ищу дочерние елементы
Так и есть.
Твой пример должен выглядеть как-то так...

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
li {
	height: 200px;
	border: 1px solid;
}
</style>
<script type='text/javascript'>
window.onload = function(){
	var img=[];
	var elements = document.getElementById('list-holder').getElementsByTagName('li');
	for(var j = 0; j < elements.length; j++){
		img[j] = elements[j].getElementsByTagName('img')[0];	
	}
	for(j = 0; j < elements.length; j++){
		img[j].style.marginLeft = ((elements[j].clientWidth - img[j].clientWidth)/2) + 'px';	
		img[j].style.marginTop = ((elements[j].clientHeight - img[j].clientHeight)/2) + 'px';
	}
};

</script>
</head>
<body>
	<ul id="list-holder">
		<li><img src="images/image01.jpg" alt="image" width="132" height="92"/></li>
		<li><img src="images/image05.jpg" alt="image" width="83" height="60"/></li>
		<li><img src="images/image09.jpg" alt="image" width="90" height="83"/></li>
	</ul>
</body>
</html>

Но это ооочень избыточный код. Ооочень много лишнего.
Ответить с цитированием
  #5 (permalink)  
Старый 07.11.2016, 14:49
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Хватит и такого варианта.

window.onload = function(){
	var obj = document.querySelectorAll('#list-holder img');
	for(var j = 0; j < obj.length; j++){
		var par=obj[j].parentNode;
		obj[j].style.marginLeft = ((par.clientWidth - obj[j].clientWidth)/2) + 'px';	
		obj[j].style.marginTop = ((par.clientHeight - obj[j].clientHeight)/2) + 'px';
	};
};
Ответить с цитированием
  #6 (permalink)  
Старый 07.11.2016, 15:13
Интересующийся
Отправить личное сообщение для kulbabka Посмотреть профиль Найти все сообщения от kulbabka
 
Регистрация: 07.11.2016
Сообщений: 10

Сработало так
window.onload = function(){
	var elements = document.getElementById('list-holder').children;
	for(var j = 0; j < elements.length; j++){
		var item = elements[j];
		var img = item.children[0];
		img.style.marginLeft = ((item.offsetWidth - img.width)/2) + 'px';	
		img.style.marginTop = ((item.offsetHeight - img.height)/2) + 'px';
	}
};
Ответить с цитированием
  #7 (permalink)  
Старый 07.11.2016, 15:28
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от kulbabka
Сработало так
Оно и по-моему работает...
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
li {
	height: 200px;
	border: 1px solid;
}
</style>
<script type='text/javascript'>
window.onload = function(){
	var obj = document.querySelectorAll('#list-holder img');
	for(var j = 0; j < obj.length; j++){
		var par=obj[j].parentNode;
		obj[j].style.marginLeft = ((par.clientWidth - obj[j].clientWidth)/2) + 'px';	
		obj[j].style.marginTop = ((par.clientHeight - obj[j].clientHeight)/2) + 'px';
	};
};

</script>
</head>
<body>
	<ul id="list-holder">
		<li><img src="images/image01.jpg" alt="image" width="132" height="92"/></li>
		<li><img src="images/image05.jpg" alt="image" width="83" height="60"/></li>
		<li><img src="images/image09.jpg" alt="image" width="90" height="83"/></li>
	</ul>
</body>
</html>

Просто вариантов реализации можно сделать достаточно много...
Ответить с цитированием
  #8 (permalink)  
Старый 15.11.2016, 17:22
Аспирант
Отправить личное сообщение для orionpro Посмотреть профиль Найти все сообщения от orionpro
 
Регистрация: 23.12.2015
Сообщений: 39

А display: flex, разве не вариант?
Ответить с цитированием
  #9 (permalink)  
Старый 16.11.2016, 08:12
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от orionpro
А display: flex, разве не вариант?
Дык он ответил уже
Сообщение от kulbabka
Тут идея с помощью js попробовать задать стили. И задание на правильное нахождение элементов
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как грамотно по вертикали отцентрировать блок (для любых девайсов и разрешений) torsar (X)HTML/CSS 2 26.04.2013 13:28
Необходимо скрыть ссылки, кроме ведущих на изображения Keksman jQuery 4 04.03.2012 20:17
Закрепление элемента по вертикали или горизонтали AlexMak (X)HTML/CSS 5 23.12.2008 14:29