Flexbox中的单个元素未居中
我有一个带动画效果的弹性盒布局,当你指向的任意项会获得更多空间。这确实会发生,只是该项获得的空间只在右侧增加,左侧并没有。此外,flex-grow的比例是2:1,但被指向的项似乎获得了更多空间。添加justify-content: center对此并无影响。有人能帮我理解是什么驱动了这种行为吗?下面有截图和代码,第一张是在加载时的外观,第二张是在将鼠标悬停在第三个项上时的外观。请原谅这些不太美观的图像,我只是想把它跑起来:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="Swish.css">
</head>
<body>
<!-- favicon -->
<header class="header">
<span class="header_logo_svg">
<!-- image -->
</span>
</header>
<main>
<section class="main-splash">
Not A Noob
</section>
<section class="main-swish">
<!-- multiple transparent diagonal bands of various shades, add with js -->
</section>
<section class="main-swiper">
<h2 class="main-swiper__grid">Stuff I Did</h2>
<div class="main-swiper__wrapper">
<ul class="main-swiper__flex">
<li class="main-swiper__item" id="li1">
<img src="splodge.jpg">
</li>
<li class="main-swiper__item" id="li2">
<a href="https://www.example.com" target="_blank">
<img src="splodge.jpg">
</a>
</li>
<li class="main-swiper__item" id="li3">
<img src="splodge.jpg">
</li>
<li class="main-swiper__item" id="li1">
<img src="splodge.jpg">
</li>
</ul>
</div>
</section>
</main>
<footer class="footer">
</footer>
<h2 id="header">Begin</h2>
<script src="Swish.js"></script>
</body>
</html>
body {
margin: 0;
font-family: sans-serif;
}
main > section {
display: block;
}
.main-swiper__wrapper {
height: 300px;
}
.main-swiper__flex {
display: flex;
height: 100%;
background: dodgerblue;
padding: 0;
margin: 0;
list-style: none;
}
.main-swiper__item {
flex: 0;
height: 100%;
transition: flex 0.3s ease;
}
.main-swiper__item img {
height: 100%;
object-fit: contain;
transition: transform 0.3s ease;
}
console.log("JS loaded");
const flexContainer = document.querySelector(".main-swiper__flex");
const items = document.getElementsByClassName("main-swiper__item");
console.log("container: " + JSON.stringify(flexContainer.style.flex));
flexContainer.addEventListener("mouseleave", containerShrink);
//flex.addEventListener("mouseleave", outShrink);
for (let i = 0; i < items.length; i++) {
items[i].addEventListener("mouseenter", expand);
items[i].addEventListener("mouseleave", shrink);
}
function expand(e) {
for (let i = 0; i < items.length; i++) {
if (items[i] !== e.currentTarget) {
items[i].style.flex = "1 0 5%";
}
}
e.currentTarget.style.flex = "2 0 5%";
//e.currentTarget.querySelector("img").style.transform = "scale(1.2)";
}
function shrink(e) {
e.currentTarget.style.flex = "1 0 5%";
//e.currentTarget.querySelector("img").style.transform = "scale(1)";
}
function containerShrink() {
for (let i = 0; i < items.length; i++) {
items[i].style.flex = 0;
}
}


解决方案
把justify行为应用到一个flex项上并不会作用于它的子元素。一旦我把居中应用到实际承载内容的 元素上,一切都按预期工作。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。