Использование.outerWidth() & .outerHeight() с событием resize для центрирования дочернего элемента в parent
Я пытаюсь написать некоторый код JavaScript, который позволит мне центрировать дочерний элемент в его родительском элементе, используя отступы. Затем с помощью той же функции пересчитать интервал с помощью события "изменить размер". Прежде чем вы спросите меня, почему я не делаю это с помощью CSS, этот код является лишь небольшой частью более крупного проекта. Я упростил код, так как остальная часть кода работает и послужит только для запутывания предмета.
Расчет пространства - это функция, которая рассчитывает количество пространства, которое будет использоваться с обеих сторон дочернего элемента.
($outer.outerWidth() - $inner.outerWidth()) / 2;
($outer.outerHeight() - $inner.outerHeight()) / 2;
Эта проблема
Хотя мне удалось добиться желаемых результатов с запасом. Падение вызывает у меня проблемы.
- Похоже, увеличивается ширина на внешнем элементе при изменении размера
- Он не центрирует дочерний элемент идеально (кажется, что смещение)
- Внутренний элемент разрушается при изменении размера и становится невидимым.
Я понимаю, что могут быть некоторые основы относительно заполнения, которые вызывают мои проблемы, однако после многочисленных журналов консоли и наблюдения за возвращенными данными я все еще не могу разобраться в проблеме. Любое предложение будет приветствоваться. Может оказаться, что это вообще невозможно.
HTML
<div id="demo" class="outer">
<div class="inner">
</div>
</div>
CSS
html {
box-sizing: border-box;
}
*, *:before, *:after {
box-sizing: inherit;
}
.outer {
width:97%;
height:400px;
border:1px solid black;
margin:20px;
}
.inner {
width:40%;
height:100px;
background-color:grey;
}
JAVASCRIPT
var $outer = $(".outer");
var $inner = $(".inner");
var getSpace = function(axis) {
if (axis.toLowerCase() == "x") {
return ($outer.outerWidth() - $inner.outerWidth()) / 2;
} else if (axis.toLowerCase() == "y") {
return ($outer.outerHeight() - $inner.outerHeight()) / 2;
}
}
var renderStyle = function(spacingType) {
var lateralSpace = getSpace("x");
var verticalSpace = getSpace("y");
var $element;
if (spacingType == "padding") {
$element = $outer;
} else if (spacingType == "margin") {
$element = $inner;
}
$.each(["top", "right", "bottom", "left"], function(index, direction) {
if (direction == "top" || direction == "bottom") {
$element.css(spacingType + "-" + direction, verticalSpace);
}
else if (direction == "right" || direction == "left") {
$element.css(spacingType + "-" + direction, lateralSpace);
}
});
};
var renderInit = function() {
$(document).ready(function() {
renderStyle("padding");
});
$(window).on("resize", function() {
renderStyle("padding");
});
}
renderInit();
ПРИМЕР - ссылка
2 ответа
Хотя я полностью не согласен с таким подходом к горизонтальному центрированию элемента, надеюсь, это поможет вам на вашем пути.
Скрипка: https://jsfiddle.net/0uxx2ujg/
JavaScript:
var outer = $('.outer'), inner = $('.inner');
function centreThatDiv(){
var requiredPadding = outer.outerWidth() / 2 - (inner.outerWidth() / 2);
console.log(requiredPadding);
outer.css('padding', '0 ' + requiredPadding + 'px').css('width','auto');
}
$(document).ready(function(){
// fire on page load
centreThatDiv();
});
$(window).resize(function(){
// fire on window resize
centreThatDiv();
});
HTML:
<div class="outer">
<div class="inner">Centre me!</div>
</div>
CSS:
.outer{ width:80%; height:300px; margin:10%; background: tomato; }
.inner{ width:60px; height:60px; background:white; }
От того, почему я не согласен с таким подходом, следует продолжать - JavaScript не должен использоваться для выкладывания вещей. Конечно - это может быть, если это действительно нужно использовать; но для чего-то такого простого, как центрирование элемента, это вовсе не обязательно. Браузеры сами обрабатывают изменение размеров элементов CSS, поэтому, используя JS, вы вводите больше головной боли для себя в дальнейшем.
Вот несколько примеров того, как вы можете достичь этого только в CSS:
выравнивание текста: по центру и отображение: встроенный блок https://jsfiddle.net/0uxx2ujg/1/
позиция: абсолютная и левая: 50% https://jsfiddle.net/0uxx2ujg/2/ (это можно использовать и для вертикального центрирования, которое сложнее, чем горизонтальное)
Вы можете создать новый класс CSS для настройки размера элементов в $window.onresize = function () { //add your code };