# Using figures and Flex-box to align captions

As I learn how to be more flexible in working with art direction for web content, I’m documenting some of the cool things I’ve learned.

Because I’m using flexbox, I’m relying on CSS Trick’s A Complete Guide to Flexbox to reference the Flexbox aspects fo the elements.

## Figures as flex containers

If we make a figure into a flex container we gain a lot of flexibility in how we place captions around the image.

This is the image that we’ll play with.

``````<h1><span class="highlight">Pablo Neruda</span> Facts</h1>

<figure>
<img
src="https://www.nobelprize.org/images/neruda-13228-portrait-medium.jpg"
alt="Pablo Neruda Portrait" />
<figcaption>
<p>Pablo Neruda, original name Neftalí Ricardo Reyes Basoalto, (born July 12, 1904, Parral, Chile — died September 23, 1973, Santiago), Chilean poet, diplomat, and politician who was awarded the Nobel Prize for Literature in 1971. He was perhaps the most important Latin American poet of the 20th century.</p>
</figcaption>
</figure>
``````

This is the basic CSS that will place both the image and the caption in a row, the caption aligned to the top of the image.

We define the image as being 30vw (viewport width units) wide and having no margin at the bottom of the image.

We add a deep red bar on the left side of the figcaption element. The caption is placed at the top, flushed with the image.

We also make the caption 25vw wide as an initial value that we can play with it later.

``````figure {
display: flex;
flex-flow: row;
justify-content: flex-start;
}

img {
width: 30vw;
margin-bottom: 0;
}

figcaption {
align-self: flex-start;
border-left: 1em solid rgb(169, 13, 94);
margin-left: 2em;
width: 25vw;
}
``````

You can see the result of this initial test in this pen

## Vertical caption alignment

One of the first changes that I want to experiment with is changing the vertical placement of the caption to the side of the image.

We modify the style for the `figcaption` element to tell it where we want to place the caption relative to the image.

All we need to do is change the `align-self` attribute in the `figcaption` element. The code below will align the caption to the bottom of the image.

``````figcaption {
align-self: flex-end;
border-left: 1em solid rgb(169, 13, 94);
margin-left: 2em;
width: 25vw;
}
``````

This pen illustrates aligning to the bottom of the image

We can also center the caption related to the image by changing the `align-self` selector to center instead of `flex-start` or `flex-end`.

``````figcaption {
align-self: center;
border-left: 1em solid rgb(169, 13, 94);
margin-left: 2em;
width: 25vw;
}
``````

This pen shows vertical centering

## Moving captions to the left of the image

Moving the caption to the left of the image helps with balancing the flow of text or just to make the images look different by playing with the captions in ways the reader might not expect.

To move the caption we have to change the `flex-flow` attribute to reverse the order in which the objects appear on the screen.

In the `figure` element we set the `flex-flow` to `row-reverse` meaning that the browser will display the content from right to left. Since the image is the first element in document order it will appear to the right with the caption to the left.

We must remember that because we flipped the order of the items we also have to change the way we justify the content, in this case to `flex-end` if we want the figure to stay on the left side of the screen.

``````figure {
display: flex;
flex-flow: row-reverse;
justify-content: flex-end;
}
``````

We also to change the `border-`, `padding-`, and `margin-` to right, moving the bar and space between the bar and the caption to the right side.

``````figcaption {
align-self: flex-end;
border-right: 1em solid rgb(169, 13, 94);
margin-right: 2em;
width: 25vw;
}
``````

The tricks for vertical alignment work on the right side too.

The example pen is here

## Captions above or below the image

Changing the value of `flex-flow` we can place the caption above or below the image. The example below puts the caption text below the image.

The figure now flows vertically using `flex-flow: column` and has an explicit width that is as wide as the image inside.

``````figure {
display: flex;
flex-flow: column;
width: 30vw;
}
``````

We control the alignment of the caption element using the `align-self` attribute. In this case, the caption is left aligned.

We can add borders to highlight the caption. In the example, we added the same border at the top and bottom.

Controlling the width of the caption and the font size gives us a little more control over what we can do with the caption, as shown in this example Codepen

``````figcaption {
align-self: flex-start;
border-top: 2px solid rgb(169, 13, 94);
border-bottom: 2px solid rgb(169, 13, 94);
font-size: 80%;
width: 20vw;
}
``````

To place the caption above the image we need to make a single change; use `flex-flow: column-reverse` in the figure styles.

``````figure {
display: flex;
flex-flow: column-reverse;
width: 30vw;
}
``````

In the example pen you may want to adjust the bottom margin to create some space between the caption border/line and the image.