1

子问题:flexbox 居中对齐的效果,只作用于子元素,还是子元素的子元素都会一路继承下去?

子问题的答案是:只作用于子元素,不会一路继承下去

怎么证明?我们先用纯 html+css 来展示

<!DOCTYPE html>
<html>

<head>
    <title>NiceGUI to HTML/CSS/JS</title>
    <style>
        /* CSS样式 */
        .row {
            display: flex;
            flex-direction: row;
        }

        .card {
            min-width: 600px;
            /* 其他卡片的样式 */
        }

        .column {
            display: flex;
            flex-direction: column;
            width: 100%;
            align-items: center;
            /* 其他列的样式 */
        }

        .title {
            border-bottom: 1px solid #e5e9ef;
            /* 其他标题的样式 */
        }

        /* 可能的其他样式 */
    </style>
</head>

<body>
    <div class="row">
        <div class="card">
            <div class="column">
                <h3 class="title">title</h3>
                <div class="column">
                    <label for="collection-name">Collection Name:</label>
                    <input type="text" id="collection-name">

                    <div>
                        <div>
                            <p>哈哈</p>
                        </div>
                        <p>嘿嘿</p>
                    </div>

                </div>

            </div>
        </div>
    </div>

    <script>
        // 可能的 JavaScript 代码
        // 比如事件处理等
    </script>
</body>

</html>

从上面的代码和下面的效果来看,貌似 <div class="column"> 设置的 align-items: center; 继承给 <p>哈哈</p><p>嘿嘿</p> 了,因为 <p>哈哈</p><p>嘿嘿</p> 都是居中对齐的

图片.png

这样想法对吧?错误!

其实是因为 <div class="column"> 下面的 labelinputdiv 被设置为居中了,但是不仅仅是居中。labelinputdiv 的 width 被设置为了它们的子元素的宽度,所以此时,你给它们的子元素设置左对齐、右对齐、居中对齐是没用的

「你给它们的子元素设置左对齐、右对齐、居中对齐是没用的」,那么怎么才有用,要把它们的 width 设置为 100% 或者一个大于子元素的宽度才有用

下面的修改

<!DOCTYPE html>
<html>

<head>
    <title>NiceGUI to HTML/CSS/JS</title>
    <style>
        /* CSS样式 */
        .row {
            display: flex;
            flex-direction: row;
        }

        .card {
            min-width: 600px;
            /* 其他卡片的样式 */
        }

        .column {
            display: flex;
            flex-direction: column;
            width: 100%;
            align-items: center;
            /* 其他列的样式 */
        }

        .title {
            border-bottom: 1px solid #e5e9ef;
            /* 其他标题的样式 */
        }
        .w-3 {
            width: 300px;
            /* 其他标题的样式 */
        }

        /* 可能的其他样式 */
    </style>
</head>

<body>
    <div class="row">
        <div class="card">
            <div class="column">
                <h3 class="title">title</h3>
                <div class="column">
                    <label for="collection-name">Collection Name:</label>
                    <input type="text" id="collection-name">

                    <div class="w-3">
                        <div>
                            <p>哈哈</p>
                        </div>
                        <p>嘿嘿</p>
                    </div>

                </div>

            </div>
        </div>
    </div>

    <script>
        // 可能的 JavaScript 代码
        // 比如事件处理等
    </script>
</body>

</html>

大家可以看到,我通过设置一个 <div class="w-3">, 大家可以发现,<p>哈哈</p><p>嘿嘿</p> 并没有继承 <div class="column">align-items: center;

图片.png


让我们回到原问题 「nicegui 为什么 w-full 会重置对齐效果?」

不过我懒得写了,我直接贴一段 copilot 的回答

在 NiceGUI 中,.classes('w-full') 会使元素的宽度变为其父元素的宽度1。这可能会导致元素的对齐方式被重置,因为它们现在占据了整个可用空间23

在你的代码中,当你给内部的 ui.column() 添加 .classes('w-full') 时,这个列元素的宽度就变为了其父元素(也就是外部的 ui.column().classes('w-full items-center'))的宽度。由于这个列元素现在占据了所有可用的水平空间,所以它的内容(也就是标题)就不再相对于其父元素居中对齐,而是相对于它自己居中对齐。这就是为什么标题看起来像是左对齐的23

这个行为确实是 Tailwind CSS 的一个特性41。Tailwind CSS 提供了一系列的工具类,让你可以方便地控制元素的宽度、对齐方式等样式41。在这个例子中,w-fullitems-center 都是 Tailwind CSS 的工具类41

如果你希望在使用 w-full 的同时保持元素的对齐方式,你可以尝试添加 no-wrap 类到行元素2。这将阻止内容换行,从而强制表格相应地缩小2。例如:

from nicegui import ui

with ui.row():
    with ui.card().style('minWidth: 600px'):
        with ui.column().classes('w-full items-center no-wrap'):
            with ui.column().classes('w-full'):
                ui.markdown(
                    '### title',
                ).style('border-bottom: 1px solid #e5e9ef;')

ui.run(port=8083)

这段代码将创建一个行,其中包含一个标题,即使行的宽度设置为 w-full,这个标题也不会换行2。希望这个答案能帮到你!

一开始,我看上面的 copilot 回答根本看不到,因为我一开始以为 「flexbox 居中对齐的效果,子元素的子元素都会一路继承下去」,基于这个错误的 css 认知,就无法理解 copilot 回答

相关问题: Why does w-full reset alignment?


universe_king
3.4k 声望680 粉丝