【布局技巧】Flex 布局下居中溢出滚动截断问题

这篇具有很好参考价值的文章主要介绍了【布局技巧】Flex 布局下居中溢出滚动截断问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在页面布局中,我们经常会遇到/使用这么一类常见的布局,也就是列表内容水平居中于容器中,像是这样:

<ul class="g-contaner">
    <li></li>
    <li></li>
</ul>
ul {
    width: 500px;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    justify-content: center;
    align-items: center;
    gap: 10px;
}

效果如下:

【布局技巧】Flex 布局下居中溢出滚动截断问题

这里,外层的容器是定宽的,内层的 flex-item 也是定宽的。

当 flex-item 个数较小时,是没有问题的。但是,如果当元素内容过多,并且设置了 flex-wrap: nowrap 的话,内容就会溢出容器:

【布局技巧】Flex 布局下居中溢出滚动截断问题

此时,我们有几种解法,其中一种便是给父容器设置 overflow: auto 或者 overflow: hidden,让父容器可以滚动,像是这样:

ul {
    // ...
    overflow: auto;
}

效果就变成了这样:

【布局技巧】Flex 布局下居中溢出滚动截断问题

我们尝试滚动一下这个容器,会发现一个致命问题:容器只能向左滚动,无法向右滚动,因此只能看到后半部分被截断的内容,而无法看到前半部分被截断的内容

【布局技巧】Flex 布局下居中溢出滚动截断问题

什么意思呢?结合上面的 Gif 与下面这张示意图,一看就懂:

【布局技巧】Flex 布局下居中溢出滚动截断问题

针对这个问题。其中一类比好好的解法在于,当 flex-item 不足以溢出时候,flex-item 居中展示,而当 flex-item 的数量溢出父容器宽度时候,布局上采用类似于 justify-content: flex-start 的样式进行排布,这样可以保证内容在滚动的过程中能够全部看到

正常效果应该如下:

【布局技巧】Flex 布局下居中溢出滚动截断问题

上面第一、第二行就是 flex-item 不足以溢出时候,flex-item 居中展示, 而第三行 ,就是当 flex-item 的数量溢出父容器宽度时候,布局上采用类似于 justify-content: flex-start 的样式进行排布,这样可以保证内容在滚动的过程中能够全部看到。

因此,本文我们将一起探讨一下,在面对这个问题时的几种不同方式的解法。

方法一:Flex 布局下关键字 safe、unsafe

其实,规范也已经注意到了布局下的这个居中滚动问题。

因此,在从 Chrome 115 开始,flex 布局下新增了两个关键字 safeunsafe

【布局技巧】Flex 布局下居中溢出滚动截断问题

基于 CSS Box Alignment Module Level 3,明确列出了这种安全(safe)不安全(unsafe) 的布局说明:

【布局技巧】Flex 布局下居中溢出滚动截断问题

而今天,我们可以直接在对齐模式中,通过 safe 关键字解决这个问题。

我们简单改造一下上述我们的 flex 布局代码,将 justify-content: center 改为 justify-content: safe center 即可:

ul {
    width: 500px;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
 -  justify-content: center;
 +  justify-content: safe center;
    align-items: center;
    gap: 10px;
}

此时,flex 布局就能自动识别当前 flex 容器下的 flex-item 数量是否超出容器宽度/高度,从而改变对齐方式

【布局技巧】Flex 布局下居中溢出滚动截断问题

完整的代码,你可以戳这里自己感受:CodePen Demo -- 使用 Safe 关键字解决 Flex 居中溢出问题

目前而言,这个方法唯一的问题在于 兼容性safe 关键字的大范围使用,还需要静待一段时间。

方法二:使用 margin: auto 替代 justify-content: center

因此,我们有必要继续去探寻其它解决方案。

在之前,有发过另外两篇 flex 相关技巧性的文章 --

  1. 探秘 flex 上下文中神奇的自动 margin - 掘金
  2. 水平垂直居中深入挖掘 - 掘金

除去 justify-content: center 之外,其实我们还可以利用 margin: auto 实现子 flex-item 的水平居中。

我们改造一下文章一开始的示意 DEMO:

ul {
    width: 500px;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    gap: 10px;
}
li {
    margin: auto;
}

当,flex-item 数量不足以溢出容器宽度时,效果如下:

【布局技巧】Flex 布局下居中溢出滚动截断问题

此时,flex-item 在 margin: auto 的作用下,会均分整个容器的剩余空间,并且是水平和垂直方向上的。

用规范的话说就是,设置了 margin: auto 的元素,在通过 justify-contentalign-self 进行对齐之前,任何正处于空闲的空间都会分配到该方向的自动 margin 中去。

所以,margin: auto 也是一种居中非常重要的技巧,虽然我们常将这个技巧用于 flex 布局下的垂直居中。可以翻看一下上面提供的两篇文章。

有趣的是,当 flex-item 的数量溢出父容器宽度时候,由于没有剩余空间了,此时 margin: auto 其实相当于失效了,因此布局上的效果同样也是采用类似于 justify-content: flex-start 的效果进行排布。

同样能达到我们的目的:

【布局技巧】Flex 布局下居中溢出滚动截断问题

完整的代码,你可以戳这里自己感受:CodePen Demo -- 使用 margin:auto 解决 Flex 居中溢出问题

方法三:额外嵌套一层

上面的 margin:auto 虽然没有兼容性问题,但是有一点点瑕疵。我们仔细对比 margin: autojustify-content: center 在 flex-item 不足以溢出下的表现:

【布局技巧】Flex 布局下居中溢出滚动截断问题

瑕疵在于,使用 margin: auto 的方式,flex-item 之间的间距是不可控。因为它们始终会去平分剩余空余空间。

2023-12-06 更新,基于 margin: auto 不可控的方式,其实通过只给子 item 的首个元素添加 margin-left: auto,给尾元素添加 margin-right: auto,其实是可以解决间距问题的。

所以,兼容性最好的方式,就是我们多叠加一层,同样可以巧妙的解决这个问题。

原结构:

<ul class="g-contaner">
    <li></li>
    // ...
    <li></li>
</ul>

改造后的结构:

<ul class="g-contaner">
    <ul class="g-wrap">
        <li></li>
        // ...
        <li></li>
    </ul>
</ul>

改造后的 CSS:

.g-contaner {
    width: 500px;
    height: 200px;
    display: flex;
    flex-wrap: nowrap;
    flex-direction: row;
    justify-content: center;
    align-items: center;
    overflow: auto;
}

.g-wrap {
    display: flex;
    gap: 10px;
    max-width: 100%;
}

我们通过多设置了一层 g-wrap,并且设置了 max-width: 100%,当然,它也是一个 flex 容器。

因此当:

  1. .g-wrap 内 flex item 宽度不足 100% 时,整个 .g-wrap 受到其父容器的 justify-content: center 限制会表示为水平居中;
  2. .g-wrap 内 flex item 宽度超出 100% 时,由于设置了 max-width: 100%,所以,整个容器最大宽度就是 .g-container 的宽度。此时的子 flex item 的表现就是默认的 justify-content: flex-start,因此内容也是从头开始展示,滚动场景下没有问题

至此,我们借助多嵌套一层,同样完美的解决了整个问题。其效果与方法一类似,就不再额外贴 Gif 图。

完整的代码,你可以戳这里:CodePen Demo - 使用额外嵌套层解决 Flex 居中溢出问题

总结一下

好,我们快速总结一下三种方式的优劣对比:

  1. 方法一:Flex 布局下关键字 safe、unsafe,修改代码量最少,效果完美,核心问题在于兼容性目前不佳;
  2. 方法二:使用 margin: auto 替代 justify-content: center,兼容性好,问题在于 flex item 不足父容器 100% 时,元素之间间距无法控制;
  3. 方法三:额外嵌套一层,效果完美,改造量略多一点点。

三种方式各有优劣,基于实际面临的业务场景再做选择。

同时,本文举例采用了水平方向的例子,实际在业务中,我们同样可能会遇到垂直方向一样的问题,本文中的解法都是通用的。并且,基于 safe 的解法中,除了 justify-content: safe center 外,safe 关键字还可以应用于 align-itemsalign-self,实际使用时,结合规范,选取最适合的写法。

最后

好了,本文到此结束,希望本文对你有所帮助 😃

想 Get 到最有意思的 CSS 资讯,千万不要错过我的公众号 -- iCSS前端趣闻 😄

更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。文章来源地址https://www.toymoban.com/news/detail-749184.html

到了这里,关于【布局技巧】Flex 布局下居中溢出滚动截断问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序23__flex布局 相关的3种居中: 水平居中_垂直居中_水平垂直居中

    类似这样写法 display:  flex; flex-direction:  column;                //垂直布局 align-items:  center;                    // 水平居中     justify-content:  space-around; //垂直方向分散布局 类似这样写法 display:  flex; flex-direction: row;          //水平布局       align-items: center;    

    2024年02月03日
    浏览(34)
  • Css Flex 弹性布局中的换行与溢出处理方法

    Css Flex 弹性布局中的换行与溢出处理方法 CSS弹性布局(Flex)是CSS3中的一种新的布局方式,它能够帮助我们更加灵活地布局元素。在Flex弹性布局中,元素的布局仅依赖于父容器的设置,而不再需要复杂的相对或绝对定位。本文将详细介绍Flex布局中的换行与溢出处理方法,并

    2024年02月07日
    浏览(41)
  • 【移动端网页布局】Flex 弹性布局案例 ② ( 顶部固定定位搜索栏 | 固定定位盒子居中对齐 | 二倍精灵图设置 | CSS3 中的垂直居中对齐 )

    需求 : 制作如下搜索栏 ; 首先 , 设置固定定位 , 固定定位盒子始终显示在浏览器中指定的位置 , 与父容器或其它容器无关 ; 然后 , 设置固定定位盒子垂直方向位置 , 设置为 top: 0; 紧贴顶部 ; 再后 , 设置 left: 50% 样式 , 将盒子左侧设置到中心位置 , 这个 50% 是相对于父容器的 比

    2024年02月05日
    浏览(42)
  • uniapp scroll-view横向滚动无效,scroll-view子元素flex布局不生效

    要素排查: 1.scroll-x属性需要开启,官方类型是Boolean,实际字符串也行。   2scroll-view标签需要给予一个固定宽度,可以是百分百也可以是固定宽度或者100vw。    3.子元素需要设置display: inline-block(行内块元素)属性,scroll-view需要设置white-space: nowrap(不换行) 当使用scroll

    2024年02月12日
    浏览(34)
  • uni-app/微信小程序:scroll-view纵向滚动高度自适应flex布局填充剩余高度

    uni-app文档:https://uniapp.dcloud.net.cn/component/scroll-view.html 使用竖向滚动时,需要给 一个固定高度,通过 css 设置 height 微信文档:https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html 使用竖向滚动时,需要给scroll-view一个固定高度,通过 WXSS 设置 height 所以,给scroll-view设置

    2024年02月09日
    浏览(38)
  • web前端之使用弹性和外边距进行网页布局、非常有用的小技巧、flex、margin、auto

    图中效果只需要flex和margin便可以实现。 1、d_f: display: flex; 2、fw_w: flex-wrap: wrap; 3、m_a: margin: auto; 4、ml_a: margin-left: auto; 5、mr_a: margin-right: auto; 3、item类名比较特殊,所以单独定义,涉及到变量,不属于公共样式 4、其他类名基本是见名知意,不做过多叙述

    2024年02月20日
    浏览(44)
  • css三角和css 用户见面样式,vertical-align 属性应用,溢出的文字省略号显示,常见布局技巧

    目录 3.CSS三角  4.CSS 用户界面样式 4.1什么是界面样式  4.2轮廓线 outline  4.3 防止拖拽文本域 resize  5.vertical-align 属性 5.1图片,表单都属于行内块元素,默认的vertical-align 是基线对齐。 5.2解决图片底部默认空白缝隙问题 6.溢出的文字省略号显示 1.单行文本溢出显示省略号--必须

    2023年04月09日
    浏览(34)
  • css中flex布局固定宽度盒子被压缩问题解决

    当一个flex布局,有固定宽度盒子和使用 flex: 1; ,当内容过多时固定宽度的盒子被压缩宽度。 给固定宽度的盒子设置 min-width 值 给固定宽度的盒子设置 flex-shrink: 0;

    2023年04月10日
    浏览(45)
  • 关于 flex 布局时,子元素宽度超出父元素问题及解决方案(问题)

    1. 第一次遇到这个问题的场景 先看效果图,大家可以看一下下面的样式,很明显左边和右边的盒子我是给的定宽,但是被挤压了 这个是我在项目中遇到的一个bug,使用的 flex 布局,由于我动态的修改绿色盒子的显示与隐藏,导致两边盒子的挤压 2. 第二种情况 很明显,红色的

    2024年02月02日
    浏览(33)
  • flex 布局 子元素不设置宽高,高度撑满父元素的问题

    在 flex 布局中,我们通过 align-items 来控制元素在交叉轴上的对齐方式。 它可能取5个值: flex-start: 交叉轴的起点对齐 flex-end: 交叉轴的终点对齐 center: 交叉轴的中点对齐。 baseline: 项目的第一行文字的基线对齐。 stretch (默认值): 如果子元素未设置高度或者高度为auto,将占满

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包