Dokładnie jak napisał @ScriptyChris, efektu margin collapsing parent, można także pozbyć się m. in.
przez dodanie do parent-a elementu, border ustawiony na 1px.
<div class="container">
<div class="parent">
<div class="child"></div>
<button>border</button>
</div>
<button>border</button>
</div>
div button {
margin: 1em;
cursor: pointer;
}
.container {
width: 300px;
height: 400px;
background: #eee;
border: 1px solid transparent;
}
.parent {
border: 1px solid transparent;
width: 275px;
height: 300px;
margin: 20px auto;
background: #bbb;
}
.child {
width: 250px;
height: 200px;
margin: 20px auto;
background: #777;
}
.border-zero {
border: 0;
}
dla demonstracji
[...document.querySelectorAll('button')].forEach((button) => {
button.addEventListener('click', ({target}) => {
target.parentNode.classList.toggle('border-zero');
target.textContent = getStyle(target.parentNode);
});
button.click();
});
function getStyle(obj, style='border') {
return window.getComputedStyle(obj).getPropertyValue(style);
}