views:

28

answers:

2

I would like to display floated images with a caption underneath. But using the code below, the caption text doesn't wrap, meaning that the floated image-with-caption takes up a huuuuuge amount of horizontal space.

If there's a better way to have an image with a caption, I'll take that over any improvements to this code. Failing that, how can I get the text inside the float to wrap?

I tried searching for this, but could only get results for wrapping text AROUND a float, not inside.

Added: I would prefer not to set an explicit width for the float, since I would have to do so for every single image I ever use.

The full XHTML...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">

<head>
<title>Test</title>

<style type="text/css">

p.img-with-cap {
    float: left;
}

</style>


</head>

<body>

<p class="img-with-cap">
<a class="img" href="http://sohowww.nascom.nasa.gov/"&gt;
<img alt="Sun" src="http://www.heeris.id.au/sites/default/files/sun.gif" width="256" height="256" />
</a>
<br />The Sun - a sinister and destructive force. Image from
<a href="http://sohowww.nascom.nasa.gov/"&gt;SOHO website</a>.
</p>

<p style="font-size: 200%">The Sun is a star located at the centre of our solar system. It is
classified as a G2 star, has a mass of about 2×1030 kg, a temperature of
5800 K at the surface and a core temperature of 15.6 million Kelvin. It
constantly emits electromagnetic radiation over the entire spectrum
(indeed, it can be modelled as a black body), peaked at the wavelength
corresponding to that of green light.</p>

</body>

</html>
+1  A: 

Floated elements, just like any other block element, will take up as much width as necessary to fit their contents — up to 100%.

If you want it to be narrower than 100%, give it a width: ____; property.

VoteyDisciple
+1  A: 

Block-level floated elements can have a width applied to them. I would imagine that the following style should prevent the wrapping:

p.img-with-cap {
    float: left;
    width: 200px; /* or whatever */
}

If you don't want a specific width, but want it to match the width of the image, you could set the width dynamically when the window loads, like so:

function setWidth() {
    var width = document.getElementById("imgElement").width;
    document.getElementById("wrapperElement").style.width = width;
}

window.onload = setWidth;
Ryan Brunner
Not a fan of setting the width (see updated question). Is there really not a generic way to do this then?
detly
The best option I can see is to set the width via javascript once the image has loaded (you'd likely want to set the width to a reasonable initial value as well). I'll update my answer.
Ryan Brunner
That's not a bad idea. I find it a little strange that such an obvious use case isn't covered by CSS, but I'm sure it's not the first time someone's said that.
detly
Used jQuery for the container resizing — it's trivial to loop over containers with that class and do the width detection and resizing.
detly