Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to align-items: center AND align-self: stretch?

Tags:

html

css

flexbox

I have an element I'd like to be (cross-axis) centered but also 'grow' to a nominal size even with too-little content, BUT ALSO 'shrink' when the width of the page becomes smaller than 350px wide.

HTML

<div class="parent">
  <div class="child">
    Some content
  </div>
</div>

SCSS

.parent {
  display: flex;
  flex-direction: column;
  align-items: center;

  .child {
    max-width: 350px; 
    align-self: stretch;
  }
}

Adding align-self: stretch; to .child does the job of making it 350px wide, but it seems to negate the align-items: center; in .parent

Is there a way to do this in CSS that I'm missing? Please note that the element can't just be 350px wide all the time - it must also respond to horizontal page resizing as it does in the example fiddle.

Fiddle: https://jsfiddle.net/1uqpxn8L/1/

like image 917
Mark Chapel Avatar asked Oct 02 '18 05:10

Mark Chapel


People also ask

Does align-content override align-self?

The align-self applies to all flex items, allows this default alignment to be overridden for individual flex items. The align-content property only applies to multi-line flex containers, and aligns the flex lines within the flex container when there is extra space in the cross-axis.

What is align-self center?

The align-self CSS property overrides a grid or flex item's align-items value. In Grid, it aligns the item inside the grid area. In Flexbox, it aligns the item on the cross axis.

How do you use align yourself?

Syntax: align-self: auto|normal|self-start|self-end|stretch|center |baseline, first baseline, last baseline|flex-start |flex-end|baseline|safe|unsafe; Property values: auto: This property is used to inherit its parent container align-items property or stretched if it has no parent container. It is a default value.


Video Answer


1 Answers

UPDATED

I think you should use justify-content to h-align child to center.

Please note, when you apply display: flex property to parent, you should apply flex property to child.

.parent {
  background: yellow;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.parent .child {
  background: black;
  color: white;
  text-align: center;
  flex: 1 1 auto;
  width: 100%;
  max-width: 350px;
}
<div class="parent">
  <div class="child">
    I should be 350px wide
    <br> and centered in the yellow
    <br> unless the page gets smaller,
    <br> in which case I should have
    <br> 10px padding on either side.
  </div>
</div>

Please see the result here, hope this is what you mean: https://jsfiddle.net/1uqpxn8L/11/

like image 64
Luu Dai Hai Avatar answered Oct 16 '22 23:10

Luu Dai Hai