Isabel
Isabel

Reputation: 31

Adding margin-bottom to list item only when list-item exceeds certain number of words

I am fond of lists. Very fond of lists. Sometimes I have lists with short items like this:

List A

But sometimes I have lists with long blocks of text in them. Like this:

List B

For List A, I'd like to keep the items close, like that of a checklist/to-do. However, for List B, I want to add a margin-bottom to the list items. Is this possible with only CSS? Let's say I want to target list-items that exceed 20 words or so, what selector do I use?

Upvotes: 3

Views: 99

Answers (1)

Temani Afif
Temani Afif

Reputation: 272608

There is no such selector but here is an idea to approximate what you want. The trick is to have an invisible element that will create the needed space only when there is a lot of content. Otherwise it will stay at the same line with the content.

ul li div {
   display:inline-block;
   vertical-align:top;
}
ul li:after {
  content:"";
  display:inline-block;
  width:calc(100% - 200px); /* update the 200px like you want*/
  height:20px; /* your margin */
  background:rgba(255,0,0,.2); /* to illustrate*/
}
<ul>
  <li><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus viverra dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas</div></li>
  <li><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus viverra dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas</div></li>
  <li><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus viverra dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas</div></li>
</ul>


<ul>
  <li><div>Lorem ipsum dolor sit amet</div></li>
  <li><div>Lorem</div></li>
  <li><div>Lorem ipsum</div></li>
</ul>

Use a small width to active the space when there is more than a line:

ul li div {
   display:inline-block;
   vertical-align:top;
}
ul li:after {
  content:"";
  display:inline-block;
  width:2px; 
  height:20px; /* your margin */
  background:rgba(255,0,0,.2); /* to illustrate*/
}
<ul>
  <li><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus viverra dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas</div></li>
  <li><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus viverra dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas</div></li>
  <li><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus viverra dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas</div></li>
</ul>

<ul>
  <li><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus viverra dapibus. Pellentesque</div></li>
  <li><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque tempus viverra</div></li>
  <li><div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque temp</div></li>
</ul>


<ul>
  <li><div>Lorem ipsum dolor sit amet</div></li>
  <li><div>Lorem</div></li>
  <li><div>Lorem ipsum</div></li>
</ul>

Upvotes: 3

Related Questions