Подтвердить что ты не робот

CSS div настолько же широкий, как и его содержимое

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

Короче говоря, я хочу иметь <div> которая будет только такой же широкой, как и ее содержимое. Я не хочу устанавливать его размер. Я хочу, чтобы он был настолько широким, как его содержимое, которое создается динамически.

Таблица делает это отлично. С <div> это всегда кажется чем-то другим, чем я хочу. Нет опции "переполнения" делает то, что я хочу.

Классический пример - когда я хочу создать полностраничный столбчатый макет с левым столбцом, содержащим навигационные ссылки и правую часть, содержащую контент. Я хочу, чтобы левый столбец был как можно более широким, чем навигационные ссылки. Не больше, не меньше. (Навигационные ссылки не являются статичными, они создаются динамически и могут в любой момент изменять размер/длину). И правильный ( "контент" ) столбец должен быть тем, что осталось. Самое главное, когда я делаю экран браузера более широким или более узким, я хочу, чтобы левая колонка была STILL, была бы такой же широкой, как и навигационные ссылки: не больше и не меньше. Я хочу, чтобы содержимое автоматически обертывалось по мере необходимости, если ширина браузера становится слишком узкой. Ни при каких обстоятельствах я не хочу, чтобы текст был затенен или вышел за пределы определенного столбца.

Короче говоря, я хочу <div> который работает так же, как и таблица без необходимости использовать таблицу. Разумеется, эксперты CSS. это можно сделать.... правый? Я задал этот вопрос на других форумах и до сих пор не получил приемлемого ответа.

Или возьмите простой пример, подобный этому (возможно, это легко):

<ul style="background: orange;">
   <li>one</li>
   <li>two</li>
   <li>three</li>
</ul>

Все это так же широко, как и экран браузера. Но я хочу, чтобы он был только таким широким, как самый длинный элемент. Как это сделать с помощью CSS? Я могу положить все это внутри таблицы, как это

<table border=0 cellpadding=0 cellspacing=0><tr><td>
<ul style="background: orange;">
   <li>one</li>
   <li>two</li>
   <li>three</li>
</ul>
</td></tr></table>

... и он делает то, что я хочу. Как это сделать с помощью CSS вместо использования этих "злых" таблиц?


Я попробовал пример miku.
Это не работает (для чего я хочу это делать).

Если бы я сделал длинную длинную навигационную строку длинной строкой вроде

 an&nbps;extra&nbps;long&nbps;navigation&nbps;link&nbps;goes&nbps;here&nbps;-&nbps;this&nbps;could&nbps;even&nbps;be&nbps;an&nbps;image!

Я хочу, чтобы левая сторона навигации расширялась по мере необходимости. Я не хочу максимальной ширины. Используя вышеприведенный пример, дополнительная длинная строка будет закрыта "основным" div.

Кроме того, "основной" div должен быть остальной частью ширины браузера, и в этом случае он будет только шириной, чем текст внутри.

4b9b3361

Ответ 1

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

  • Боковая панель будет такой же широкой, как и самая длинная ссылка (или что-то там) (в приведенном ниже примере есть список)
  • Если какой-либо контент на боковой панели превышает максимальный, указанный свойством max-width (здесь: 200px), он завершается.
  • Основное содержимое занимает оставшуюся ширину.

Example A


Изменение размера #main div (путем изменения размера окна браузера) работает через overflow:hidden.

Example B


<html><head></head><body>

<div id="sidebar-left" 
    style="background:#EFEFEF; max-width:200px; float:left">
    <ul>
        <li>Navigation 1</li>
        <li>Navigation 2</li>
        <li>Extra Long Navigation item, 
            that exceeds our limit of 200px - and should be wrapped</li>
    </ul>
</div>

<div id="main" style="background:gray; overflow:hidden;">
    <p>Hello there - main content goes here</p>
</div>

</body></html>

Если вы не хотите боковую панель максимального размера, просто отбросьте атрибут max-width.

Ответ 2

Используйте <span> и display: inline-block.

Ответ 3

Установите display: inline-block в содержащую div.

Пример: http://jsfiddle.net/bVRVb/

Что происходит, так что div по умолчанию: display: block, что означает, что они будут занимать столько горизонтального пространства, сколько доступно, и сделать все остальное вокруг них выше или ниже них. С inline-block они все еще имеют фиксированную форму, но будут отображаться рядом с вещами вокруг них и занимать только столько места, сколько им нужно.

Здесь более подробно рассмотрим block vs inline-block.

Ответ 4

Очень просто: поплавьте контейнер div и убедитесь, что он не имеет атрибутов ширины вообще. Он будет изменять размер до самого длинного слова независимо от ширины родителя. Поскольку он будет изменять размер элемента за пикселем, я добавил маркер 10 пикселей. Лучше, чтобы контейнер сделал это, конечно.

Вот он, в строке для демонстрационных целей:

<body style="width: 500px;">
<ul style="background: none repeat scroll 0pt 0pt orange; float: left;">
<li>one</li>
<li>two</li>
<li style="margin-right: 10px;">reallyreallyreallylongword</li>
</ul>
</body>