我正在React中处理一个页面,在网格布局中遇到了一些奇怪的问题。
我创建了一个2列网格,其中包含许多项,有些项跨越2列。我使用网格是因为我希望一些按钮(这里是黄色方块)对齐。
问题是第一列占用的空间比实际需要的多得多:我希望按钮组左边和右边的空间是相同的。
这个问题在这个简化的屏幕截图中很明显,其中“yyy”行左侧的空间比右侧的空间宽:
第一行文本越长,情况就越糟。
如果“xxx”文本不换行,则没有问题。
我不能创建一个只包含按钮的网格,因为在真实的的应用程序中,文本、按钮和其他一些项目是随机交错的。
我不想使用固定宽度。
这是怎么回事,我如何才能确保“xxx”文本不会影响网格布局这种方式?
以下是与此屏幕截图对应的简化React代码:
<div style={{ width: '360px' }}>
<div
style={{
display: 'grid',
gridTemplateColumns: 'auto auto',
placeContent: 'center',
placeItems: 'center',
gap: '0.75rem',
border: '1px solid red',
fontSize: '16px',
lineHeight: '1.5',
// textAlign: 'center',
fontFamily: 'Roboto, Helvetica, Arial, sans-serif, ui-sans-serif, system-ui',
}}
>
<div
style={{
gridColumnStart: '1',
gridColumn: 'span 2 / span 2',
border: '1px solid green',
}}
>
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xx
</div>
<div
style={{
width: '1.75rem',
height: '1.75rem',
justifySelf: 'end',
gridColumnStart: 1,
border: '1px solid purple',
backgroundColor: 'yellow',
}}
/>
<div
style={{
justifySelf: 'start',
border: '1px solid purple',
}}
>
yyy yyy yyy yyy yyy yyy yyy
</div>
<div
style={{
width: '1.75rem',
height: '1.75rem',
justifySelf: 'end',
gridColumnStart: 1,
border: '1px solid purple',
backgroundColor: 'yellow',
}}
/>
<div
style={{
justifySelf: 'start',
border: '1px solid purple',
}}
>
zzz zzz
</div>
</div>
</div>
编辑12月27日
添加代码sandbox link here。
这样,您可以看到文本的第二行决定了网格左列宽度。
编辑05年1月
我尝试过不同的浏览器,这种行为对所有的浏览器都是一样的,所以它似乎与css的网格规格,以及如何计算间距有关。有人想到吗?谢谢!
编辑01/22添加图纸以阐明哪些空间应相同:
解决方案01/24正如所回答的,解决方案是创建一个4列网格,而不是2列网格。gridTemplateColumns: 'auto auto auto auto'
解决方案没有100%达到目标,因为yyy行仍然比应该的更快地换行:
但是将其更改为gridTemplateColumns: '1fr auto auto 1fr'
似乎可以实现目标:
以下是简化的React代码,带有解决方案:
<div style={{ width: '360px' }}>
<div
style={{
display: 'grid',
gridTemplateColumns: '1fr auto auto 1fr', // 4 columns
placeContent: 'center',
placeItems: 'center',
gap: '0.75rem',
border: '1px solid red',
fontSize: '16px',
lineHeight: '1.5',
// textAlign: 'center',
fontFamily: 'Roboto, Helvetica, Arial, sans-serif, ui-sans-serif, system-ui',
}}
>
<div
style={{
gridColumnStart: '1',
gridColumn: 'span 4', // Text spans 4 columns
border: '1px solid green',
}}
>
xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xx
</div>
<div
style={{
width: '1.75rem',
height: '1.75rem',
justifySelf: 'end',
gridColumnStart: 2, // Button & label use the center 2 columns
border: '1px solid purple',
backgroundColor: 'yellow',
}}
/>
<div
style={{
justifySelf: 'start',
border: '1px solid purple',
}}
>
yyy yyy yyy yyy yyy yyy yyy
</div>
<div
style={{
width: '1.75rem',
height: '1.75rem',
justifySelf: 'end',
gridColumnStart: 2,
border: '1px solid purple',
backgroundColor: 'yellow',
}}
/>
<div
style={{
justifySelf: 'start',
border: '1px solid purple',
}}
>
zzz zzz
</div>
</div>
</div>
3条答案
按热度按时间vngu2lb81#
我相信得到你想要的布局的唯一方法是有点棘手。
它涉及到创建2个额外的列,在现有列的左侧和右侧。
只有第一个元素占据4列。
剩下的第二个和第三个:
试着解释原始布局中的问题在哪里:
1.一旦只占用一列的元素设置了列宽
1.网格仍有可用空间
1.并且存在占用多于1列的元素
然后这个元素将使这些列增长。假定它可以使任何列增长,它通常将增长最小的一列,因为这似乎是更美观的解决方案。
wixjitnu2#
将
justifySelf: "start"
更改为justifySelf: "stretch"
。编号This article will be helpful to you
nxagd54h3#
我不知道React是如何做到的,但我会遵循这样的逻辑:
1.获取外盒的宽度(a),在您的情况下,它是360 px(22.5rem)
1.获取按钮的宽度(x)。在您的示例中,它是1.75rem
1.获取包含string的div的宽度(y),你可以找出多少字符占用了多少宽度,并相应地设置y。
1.获取栅格间隙(z)
1.估计值m =(a-x-y-z)/2
1.网格宽度应为:分别为x+m和y+m
1.将第一个网格的值向右浮动,将第二个网格的值向左浮动。
希望这能帮上忙。