Ширина подписи к изображению такая же, как у изображения

Как я могу сделать ширину подписи к изображению такой же, как изображение? Теперь у меня есть следующий код:

<div class="image">
    <img src="foo.jpg" alt="" />
    <div>This is the caption.</div>
</div>

Я пробовал много вещей (плавающее, абсолютное позиционирование и т. д.), но если заголовок длинный, он всегда делает div широким, а не многострочным. Проблема в том, что я не знаю ширину изображения (или длину подписи). Это единственный способ решить эту таблицу использования?


person Ville    schedule 12.02.2011    source источник
comment
+1 решение CSS было бы потрясающим. Вы всегда можете использовать JavaScript...   -  person JCOC611    schedule 12.02.2011
comment
Связано: Плотно разместить ‹div› вокруг закрытого изображения?   -  person DavidRR    schedule 16.09.2014
comment
Все css, никаких уловов: stackoverflow.com/questions/6523560/image- подписи и перенос   -  person Thomas Maier    schedule 17.09.2017


Ответы (6)


Таким образом, проблема в том, что вы не знаете, насколько широким будет изображение, а заголовок для изображения может превышать ширину изображения, и в этом случае вы хотите ограничить ширину заголовка шириной изображения.

В моем случае я применил display:table к родительскому элементу и применил display:table-caption и caption-side:bottom к элементу заголовка следующим образом:

<div class="image" style="display:table;">
    <img src="foo.jpg" alt="" />
    <div style="display:table-caption;caption-side:bottom;">This is the caption.</div>
</div>
person Cafe Coder    schedule 01.10.2013
comment
Просто заканчиваю это, вот. Существует полностью работающее решение только для css: stackoverflow.com/questions /6523560/image-captions-and-wrapping - person Thomas Maier; 17.09.2017
comment
Кажется, это работает только тогда, когда ширина img равна его фактической ширине. - person Ben P.P. Tung; 07.05.2018

Вы можете применить display:table; и произвольную начальную ширину, например. width:7px; в родительский блок, например figure, и все будет работать как положено!

Вот живая демонстрация: http://jsfiddle.net/blaker/8snwd/

Ограничение этого решения заключается в том, что IE 7 и более ранние версии не поддерживают display:table;, а IE 8 требует, чтобы ваш тип документа был !DOCTYPE.

Источники:

person Blaker    schedule 10.08.2012
comment
Наконец, преимущество в том, что таблицы не учитывают заданную ширину и вместо этого реагируют на содержимое! - person allicarn; 13.02.2014

Если проблема в том, что заголовок слишком длинный, вы всегда можете использовать


div.image {
    width: 200px; /* the width you want */
    max-width: 200px; /* same as above */ 
}
div.image div {
    width: 100%;
}

И подпись останется статической. Кроме того, имя тега — img, а не изображение.

Или, если вы хотите определить ширину изображения, вы можете использовать jQuery:


$(document).ready(function() {
    var imgWidth = $('.image img').width();
    $('.image div').css({width: imgWidth});
});

Таким образом, вы получаете ширину изображения, а затем устанавливаете для него ширину подписи.

person AeroCross    schedule 12.02.2011
comment
Возможно ли это без JavaScript? - person Ville; 12.02.2011
comment
@Ville Определить ширину изображения? Я почти уверен, что вы не можете. Однако первая часть кода предназначена только для CSS. - person AeroCross; 12.02.2011

Единственный способ сделать подписи должным образом — это заключить изображение и подпись в таблицу, состоящую из элементов span с атрибутами css table, table-row и table-cell.

Любой другой метод (включая теги фигур HTML5) либо приводит к несоответствию ширины, либо вызывает нежелательные разрывы строк.

Если ваш метод должен работать в браузере, отличном от css3, то лучше всего подойдет таблица.

person Community    schedule 04.07.2015

Вы можете попробовать установить оболочку div изображения display:inline-block

http://jsfiddle.net/steweb/98Xvr/

Если подпись длинная, единственным решением будет установить фиксированную ширину или установить ширину div .image с помощью js. Я пытаюсь думать о чистом решении css, но я думаю, что это сложная задача :)

person stecb    schedule 12.02.2011
comment
Такая простая задача, являющаяся сложной задачей, показывает, что не так с CSS для макета (в отличие от простого стиля). Мы обмениваем столы на что-то столь же поврежденное мозгом. И flexbox еще не реализован... - person Hejazzman; 12.02.2012
comment
jsfiddle больше не существует - person martpie; 20.04.2017

Ключ в том, чтобы рассматривать изображение как имеющее определенную ширину и длину. В приведенном ниже примере я проверил, и мое изображение было шириной 200 пикселей. А затем обработайте заголовок как встроенный блок.

HTML:

<div style="width:200px;">
   <img src="anImage.png" alt="Image description"/>
   <div class="caption">This can be as long as you want.</div>
</div>

CSS:

.caption {
   display: inline-block;
}

Вы также можете заменить встроенный блок текстом, который выровнен по левому краю, по правому краю или растянут по точной ширине изображения, заменив указанный выше css одним из следующих:

.caption {
   /* text-align: left; */
   /* text-align: right; */
   text-align: justify;
}
person Rahav    schedule 03.11.2014
comment
Ширина изображения может варьироваться в зависимости от изображения. Скажем, вы визуализируете много изображений разных размеров, тогда просто жесткое кодирование ширины в 200 пикселей не работает. - person dwoodwardgb; 05.10.2018