解决 Flex 子元素居中,溢出滚动后被裁切的问题

晚上修改了 小窝 页面右侧目录树的定位,并且修改了二级导航栏的布局。其原有的设计采用的是 display: flex + justify-content: center 进行居中的,但这样也遇到了一个问题。如果我使用 white-space: nowrap 禁止文字换行(Flex 默认也是不换行,但是并不会溢出,而是会使得子元素宽度变窄导致文字被换行),并结合 overflow: auto 来使得内容出现滚动条,则会出现左侧被“裁切”掉的效果。

上网搜索了一番,出现这个效果的原因,主要是因为 Flex 居中对齐的特性造成的。当内容被强制不换行后,无论是否设定 overflow: auto,左侧区域由于居中的原因就变成“溢出”区域了,又由于设定了 overflow: auto 的缘故,右侧就还是正常显示的。

为了解决这个问题,我试了一个方案,就是万能的 margin: auto。它可以让任何内容横向居中对齐。但问题来了,Flex 占用了 100% 的宽度,有没有什么宽度可以让它根据内容自动调整?width: max-content 这个属性就迎刃而解,它就可以实现这样的效果!再加上 max-width: 100% 约束最大宽度,就会在手机上出现滚动条而不会溢出了!

.navigation{
    margin: auto;
    display: flex;
    overflow: auto;
    max-width: 100%;
    width: max-content;
    white-space: nowrap;
    margin-bottom: 2.5em;
}

max-content.jpg

你可能会问,这完全不就是多此一举吗?把子元素全部 display: inline-block,父元素 text-align: center 不就好了 🐎 ?没错,这招确实可以,但是如果 HTML 在编写的时候内容存在换行,则会出现间距不统一的问题,因此 Flex 才是更好的实践!

手机上则是横向滚动.jpg

如果你担心 max-content 的兼容性,那么试试这一招?把 Flex 的 width 定义取消,里面的第一个子元素设置成 margin-left: auto,最后一个子元素设置成 margin-right: auto 也可以实现居中且不影响滚动的效果!

.navigation{
    display: flex;
    overflow: auto;
    max-width: 100%;
    white-space: nowrap;
    margin-bottom: 2.5em;
}

.navigation a:first-child{
    margin-left: auto;
}

.navigation a:last-child{
    margin-right: auto;
}
.card{ /* 相对定位 */ position: relative; width: 300px; height: 450px; margin: 20px; background-color: #758a99; border-radius: 20px; /* 溢出隐藏 */ overflow: hidden; /* 弹性布局 */ display: flex; /* 元素纵向排列 */ flex-direction: column; /* 居中 */ align-items: center; color: #fff; /* 阴影 */ box-shadow: 0 0 30px rgba(0, 0, 0, 0.5); /* 不让其他被挤压 */ flex-shrink: 0; } .card .photo img{ width: 100%; height: 100%; /* 保持原有尺寸比例,裁切长边 */ object-fit: cover; } /* 默认大图 */ .card .photo{ /* 绝对定位 */ position: absolute; top: 0; width: 100%; height: 100%; border-radius: 0%; overflow: hidden; /* 动画过渡 */ transition: 0.5s; } /* 鼠标移入变小图 */ .card:hover .photo{ top: 30px; width: 120px; height: 120px; border-radius: 50%; box-shadow: 0 0 20px rgba(0, 0, 0, 0.8); } /* 这里加个黑色到透明的渐变背景,可以更好的看清楚名字 */ .card .photo::before{ content: ""; position: absolute; width: 100%; height: 100%; background: linear-gradient(to bottom,transparent 50%,#222); } .card h1{ position: absolute; top: 370px; transition: 0.5s; } .card:hover h1{ top: 170px; } .card h2{ margin-top: 220px; width: 80%; border-bottom: 1px solid rgba(255, 255, 255, 0.3); font-size: 20px; text-align: center; margin-bottom: 20px; padding-bottom: 20px; } .card p { width: 90%; text-indent: 32px; font-size: 16px; margin-bottom: 15px; line-height: 30px; } .card a{ font-size: 14px; color: rgba(255, 255, 255, 0.8); text-decoration: none; border: 1px solid rgba(255, 255, 255, 0.5); padding: 8px 32px; border-radius: 8px; } .card a:hover{ color: #fff; background-color: rgba(255, 255, 255, 0.2); }这部分css代码帮我用jQuery代替
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值