Разрешить изображения в <div>быть шире, чем строки текста в том же <div> - PullRequest
14 голосов
/ 23 января 2012

Я хочу подогнать текст в <div> к ширине <div>, но изображений в том же <div> в ширину parent <div>

Эта диаграмма должна прояснить ситуацию:

http://dl.dropbox.com/u/2792776/screenshots/2012-01-22_1838.png

(вот URL, если он слишком мал: http://dl.dropbox.com/u/2792776/screenshots/2012-01-22_1838.png)

Ответы [ 13 ]

9 голосов
/ 09 марта 2012

Я бы решил это одним из двух способов.Вот идея № 1:

CSS

#inner {width:400px; position:relative; float:left;}

HTML:

<div id="inner">
    <img src="awesomeimage.jpg" alt="this awesome image" />
    <p>text goes here</p>
    <img src="awesomeimage.jpg" alt="this awesome image" />
</div>

SCRIPT:

<script>
var imgWidth = $(window).outerWidth();
$('#inner > img').css({
    width : imgWidth + 'px'
});
</script>

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

Вы можете иметь масштаб изображения с окном, как в примере, использованном в этой скрипте JS, которую я создал для другого вопроса: http://jsfiddle.net/D544n/1/

Идея # 2: Без JavaScript.

CSS

#outer {width:100%;} /* Outer becomes irrelevant */
#inner {width:100%;}
#inner img {width:100% !important}
#inner * {width:400px;} /* Set all childs to 400 */

HTML:

<div id="outer">
    <div id="inner">
        <img src="awesomeimage.jpg" alt="this awesome image" />
        <p>text goes here</p>
        <img src="awesomeimage.jpg" alt="this awesome image" />
    </div>
</div>

Селектор для этого был получен из другого ТАК вопрос .

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

5 голосов
/ 09 марта 2012

редактировать

Я усовершенствовал свой подход. Меня вдохновили Адам Данн ответ .
Все, что вам нужно сделать, это обернуть каждый img <div class="sanitize">|</div>. Либо сделайте это на стороне сервера (рекомендуется), либо с помощью небольшого вызова jQuery wrap (оставленного читателю в качестве домашней работы). Также не допускайте div с p с.

Секреты:

  • Имеет границу / фон в отдельном div.border, если вам нужно
  • Перезаписать max-width на inherit !important

http://jsfiddle.net/HerrSerker/PSPyZ/9/


HTML

<div class="container">
    <div class="border"></div>
    <div class="inner">
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. .</p>
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut        <div class="sanitize">
            <img src="http://lorempixel.com/800/200/sports/2" /></div>
        </p>
        <div class="sanitize"><img src="http://lorempixel.com/800/200/sports/2" /></div>
        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>        
    </div>
    <br clear="left" />
</div>​

CSS

.container {
    position: relative;
    width: auto;
    border: 1px solid red;
}
.container > .inner {
    border: 1px solid gold;
    width: 100%;
    min-width: 400px;
}
.container > .inner > * {
    max-width: 400px;
}
.container > .inner .sanitize {
    position: relative;
    max-width: inherit !important;
    border: 1px solid green;
    width: 100%;
}

.container > .inner .sanitize > img {      
    display: block;
    width: 100%;  
}
.container > .border {
    width: 400px;
    position: absolute;
    top: 1px;
    left: 1px;
    bottom: 1px;
    height: 100%;
    border: 1px solid silver;
}​

Первый ответ

Почему бы и нет?
Смотрите здесь пример: http://jsfiddle.net/HerrSerker/PSPyZ/

5 голосов
/ 23 января 2012

Что если вы полностью избавились от внутреннего div, но поместили ширину 400px на все p-теги внутри внешнего div?Тогда все будет течь правильно, и изображения будут дочерними элементами внешнего div, поэтому они могут быть ограничены его шириной.

Конечно, это может вызвать некоторые проблемы, если есть много других элементов, которые должнынаходиться внутри области 400px, но если это просто абзацы и некоторые заголовки, то все готово.

3 голосов
/ 09 марта 2012

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

$(document).ready(function() {
    //read every images
    $("img").each(function(k,v) {
        //get the width parent's parent
        var width = $(this).parent().parent().innerWidth();
        //use it
        $(this).css('width',width);
    });
});

Демо

1 голос
/ 13 марта 2012

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

HTML:

<div id="outer">
    <div id="inner">
        <p>
            Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
        </p>
        <img src="image.png" alt="image">
        <p>
            Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
        </p>
    </div>
</div>

CSS:

html, body {
    width: 100%;
    height: 100%;
    padding: 0;
    margin: 0;
}

#outer {
    width: 100%;
    height: 100%;
}

#inner {
    max-width: 100%;
    float: left;
}

#inner > * {
    max-width: 400px;
}

#inner > img {
    max-width: inherit !important;
}

DEMO: http://pastehtml.com/view/br8c4ht5n.html
(Окно изменения размера показывает требования OP. Серый цвет - это внешний DIV. Оранжевый - это внутренний DIV. Синий - фактический IMG.)

1 голос
/ 13 марта 2012

Может сделать это с чистым CSS.

CSS

.container{
   max-width:400px;
   border:1px solid red;
}
.container > img {
    width: 100%;
    position:absolute;
    height:200px;
}
img + p{
    margin-top:200px;
}

Проверьте это http://jsfiddle.net/PSPyZ/5/

1 голос
/ 13 марта 2012

HTML

<div class="outer">
  <div class="inner"><p>Your content goes here</p>
  <img src="http://dl.dropbox.com/u/2792776/screenshots/2012-01-22_1838.png" alt="" /> 
  <p>Your content goes here</p></div>
</div>

CSS

.inner { float: left; width: 400px; overflow: visible; }
.inner img { width: 2000px; }

JQuery

var browserWidth = $(document).width();
$('div.inner img').css('width', browserWidth);
1 голос
/ 08 марта 2012
#outer {position:absolute;top:0;left:1%;width:99%;}
#outer img{width:100%;position:absolute;left:0;} 

Лучшее, что я могу сказать, это строки выше, но они не будут обтекать текст, потому что элементы с абсолютным позиционированием удаляются из потока.

Я думаю, ellawren предложиллучшее решение до сих пор: "полностью избавился от внутреннего div" .

Вы говорите: "содержимое DIV задается пользователями (и они могут не использовать абзацы) ".

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

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

1 голос
/ 29 января 2012

Расширяем ответ Лазаря:

Установите overflow:visible; на свой внутренний div.Затем используйте Javascript, чтобы установить максимальную ширину изображений, равную размеру внешнего элемента, то есть области просмотра браузера.Может быть, как-то так?

document.body.innerdiv.img.style.maxWidth = window.innerWidth + 'px';

1 голос
/ 23 января 2012

Вы можете использовать свойство переполнения CSS, чтобы содержимое переполняло границы контейнера.Попробуйте overflow: visible на своем внутреннем div.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...