我正在尝试编写一些 JavaScript 代码,允许我使用填充在其父元素中居中一个子元素。然后使用相同的函数使用“resize”事件重新计算间距。在你开始问我为什么不使用 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();
示例-链接