Javascript-форум (https://javascript.ru/forum/)
-   (X)HTML/CSS (https://javascript.ru/forum/xhtml-html-css/)
-   -   Выравнивание элемента (https://javascript.ru/forum/xhtml-html-css/67932-vyravnivanie-ehlementa.html)

exec 16.03.2017 05:09

Выравнивание элемента
 
Существуют ли универсальные средства для выравнивания любых элементов по горизонтали и вертикали?

float не умеет выравнивать по центру, text-align умеет, но он только для текста.

С выравниванием по вертикали тоже всё плохо.
По низу можно выравнять через position: absolute; bottom: 0, а по центру никак.

Неужели нет никаких нативных способов выравнять элемент?

exec 16.03.2017 05:13

Сам я уже так намучался с этим выравниванием, что тупо делаю через js.

<p>
	Align( document.getElementById("aligned"), <span id="update">1</span> );
</p>
<div style="width: 500px; height: 350px; border: 3px solid black;">
	<div id="aligned" style="width: 100px; height: 100px; background-color: #cccccc;">
	</div>
</div>
<script type="text/javascript">

function Align(target, index, parent) {
	parent = parent || target.parentNode;
	var rect = parent.getBoundingClientRect();
	var offset = parseInt(getComputedStyle(parent).borderWidth);
	target.style.position = "absolute";
	target.style.top = [
		(offset + rect.top),
		(offset + rect.top + (parent.clientHeight - target.clientHeight) / 2),
		(rect.bottom - target.clientHeight - offset)
	][Math.floor((index - 1) / 3)] + "px";

	target.style.left = [
		(offset + rect.left),
		(rect.left + (parent.clientWidth - target.clientWidth) / 2),
		(rect.right - target.clientWidth - offset)
	][(index - 1) % 3] + "px";

	target.style.marginTop = 0;
	target.style.marginLeft = 0;
}

var update = document.getElementById("update");
var i = 1;
setInterval(function () {
	update.innerHTML = i;
	Align( document.getElementById("aligned"), i );
	i++;
	if (i == 10) i = 1;
}, 1000);

</script>

рони 16.03.2017 07:39

exec,
можно обьяснить что не так с выравниванием? и зачем нужен js?

рони 16.03.2017 08:00

exec,
<style type="text/css">
div {position: relative;box-sizing: border-box;}
div div {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  margin: auto;
}
</style>
<div style="width: 500px; height: 350px; border: 3px solid black;">
  <div id="aligned" style="width: 100px; height: 100px; background-color: #cccccc;">
  </div>
</div>

nerv_ 16.03.2017 08:16

http://frontender.info/a-guide-to-flexbox/

ksa 16.03.2017 08:36

Цитата:

Сообщение от exec
Существуют ли универсальные средства для выравнивания любых элементов по горизонтали и вертикали?

Да. :yes:
Это таблица. Простая табличка из одной строки и одной колонки сможет выровнять любой элемент по центру. Как по вертикали... Так и по горизонтали.

Теперь есть "табличные" свойства в ЦСС, которые могут это эмулировать для любого элемента
http://htmlbook.ru/css/display

Есть еще возможности HTML5...
http://html5.by/blog/flexbox/

exec 21.03.2017 06:36

Ещё один вопрос назрел. Как сделать так, чтобы месяц выравнивался посередине?

Здесь всё выравнивается, но правую стрелку переносит на следующую строку:
<div style="background: #ccc; width: 300px; padding: 5px">
  <div style="float: left">◄</div>
  <div style="text-align: center">March 2017</div>
  <div style="float: right">►</div>
</div>


Если месяцу добавить float:left, то всё идёт в одну строчку, но выравнивание пропадает:
<div style="background: #ccc; width: 300px; padding: 5px">
  <div style="float: left">◄</div>
  <div style="text-align: center; float:left">March 2017</div>
  <div style="float: right">►</div>
</div>


CSS как будто издевается надо мной! Делает что угодно кроме того, что мне нужно!

ksa 21.03.2017 08:29

Цитата:

Сообщение от exec
Здесь всё выравнивается, но правую стрелку переносит на следующую строку

Как вариант...

<div style="background: #ccc; width: 300px; padding: 5px">
  <div style="float: right">►</div>
  <div style="float: left">◄</div>
  <div style="text-align: center">March 2017</div>
</div>

clecar 21.03.2017 08:41

<div style="background: #ccc; width: 300px; text-align: center; padding: 5px">
<div style="float: left">◄</div>
March 2017
<div style="float: right;
">►</div>
</div>

laimas 21.03.2017 08:50

Если у родителя фиксированный размер, который известен, то зачем вообще использовать float? Каждому дочернему элементу по 100рх и соответствующее выравнивание текста.


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