Reputation: 12898
I have a <ul>
-list, where each list item contains multiple sections of text.
I want want each section of text to be as narrow as possible, but I still want all of them to be aligned vertically across the items. E.g.
<ul>
<li> A. Name | Some complex address | 555-1234 </li>
<li> Longer Name | Short Addr. | 555-1234 </li>
<li> P. Diddy | No home | 555-1234 </li>
</ul>
I hoped css grid would solve this issue for me, but I can't figure it out...
ul {
list-style: none;
display: grid;
justify-content: stretch;
}
li {
display: grid;
grid-template-columns: auto 1fr auto;
grid-column-gap: 10px;
}
p:nth-child(1) {
background: #EEEEEE;
border-right: 1px solid;
}
p:nth-child(2) {
background: #CECECE;
border-right: 1px solid;
}
p:nth-child(3) {
background: #EEEEEE;
}
<ul>
<li>
<p>A. Name</p>
<p>Some complex address</p>
<p>555-1234</p>
</li>
<li>
<p>Longer Name</p>
<p>Short Addr.</p>
<p>555-1234</p>
</li>
<li>
<p>P. Diddy</p>
<p>No home</p>
<p>555-1234</p>
</li>
</ul>
Is css grid the wrong tool for the job, or am I missing something here?
Upvotes: 3
Views: 119
Reputation: 64164
A new way to solve this problem would be to use display: content.
It will flatten your HTML keeping it semantic.
Support is still low, but probably it will come sooner than subgrid.
You can find this article in CSS Tricks interesting
ul {
list-style: none;
justify-content: stretch;
display: grid;
grid-template-columns: auto 1fr auto;
grid-column-gap: 10px;
}
li {
display: contents; /* make it disapear */
}
li:nth-child(odd) {
background-color: red;
color: blue;
font-weight: bold;
}
p:nth-child(1) {
border-right: 1px solid;
background-color: inherit;
}
p:nth-child(2) {
background: #CECECE;
border-right: 1px solid;
}
p:nth-child(3) {
background: #EEEEEE;
}
<ul>
<li>
<p>A. Name</p>
<p>Some complex address</p>
<p>555-1234</p>
</li>
<li>
<p>Longer Name</p>
<p>Short Addr.</p>
<p>555-1234</p>
</li>
<li>
<p>P. Diddy</p>
<p>No home</p>
<p>555-1234</p>
</li>
</ul>
Upvotes: 3
Reputation: 272806
They need to belong to the same grid to have this result, so you may try something like this:
Yes there is no more list
.list {
display: grid;
grid-template-columns: auto 1fr auto;
grid-column-gap: 10px;
}
p:nth-child(3n + 1) {
background: #EEEEEE;
border-right: 1px solid;
}
p:nth-child(3n +2) {
background: #CECECE;
border-right: 1px solid;
}
p:nth-child(3n+3) {
background: #EEEEEE;
}
<div class="list">
<p>A. Name</p>
<p>Some complex address</p>
<p>555-1234</p>
<p>Longer Name</p>
<p>Short Addr.</p>
<p>555-1234</p>
<p>P. Diddy</p>
<p>No home</p>
<p>555-1234</p>
</div>
Or consider display:table and you can keep your list structure:
.list {
display: table;
margin:0;
padding:0;
border-spacing: 10px;
}
.list li {
display:table-row;
}
p {
display:table-cell;
}
p:nth-child(1) {
background: #EEEEEE;
border-right: 1px solid;
white-space:nowrap;
}
p:nth-child(2) {
background: #CECECE;
border-right: 1px solid;
width:100%;
}
p:nth-child(3) {
background: #EEEEEE;
white-space:nowrap;
}
<ul class="list">
<li>
<p>A. Name</p>
<p>Some complex address</p>
<p>555-1234</p>
</li>
<li>
<p>Longer Name</p>
<p>Short Addr.</p>
<p>555-1234</p>
</li>
<li>
<p>P. Diddy</p>
<p>No home</p>
<p>555-1234</p>
</li>
</ul>
Upvotes: 3