CSS, щоб зупинити перенесення тексту під зображенням


86

У мене є така розмітка:

<li id="CN2787">
  <img class="fav_star" src="images/fav.png">
  <span>Text, text and more text</span>
</li>

Я хочу, щоб якщо текст загортається, він не потрапляв у "стовпець" для зображення. Я знаю, що можу це зробити за допомогою table(що я і робив), але з цієї причини це не працює .

Я без успіху спробував наступне:

li span {width: 100px; margin-left: 20px}
.fav_star {width: 20px}

Я теж намагався float: right.

Дякую.

EDIT: Я хочу, щоб це виглядало так:

IMG   Text starts here and keeps going... and
      wrap starts here.

Не так:

IMG   Text starts here and keeps going... and 
wrap starts in the space left for the image.

1
Ви можете помістити свій код у jsfiddle?
Хардік

Я думаю, вам слід трохи чіткіше зрозуміти свої наміри тут. Якщо ви не хочете , щоб обернути текст , то ви можете просто використовувати white-space: nowrap;в li span {...}, але я отримую враження , що ви намагаєтеся зробити що - то ще
My Head Hurts

@MyHeadHurts Вибачення - здалося мені зрозумілим :) Я хочу дві колонки в рядку. Ліві 20 пікселів призначені для зображення. Решта - для тексту. Якщо текст обертається, я хочу, щоб він розпочинав другий рядок обтікання на 20 пікселів зліва (з того місця, де починався початковий текст).
Нік

1
Для перехожих не потрібно мати справу з шириною, як це передбачає прийнята відповідь. Це набагато простіше: створіть так званий новий контекст форматування . Дивіться відповідь Джо Конліна. Додаткові відомості див. У моєму.
hqcasanova

1
@hqcasanova На протокол, відповідь Дана було прийнято за 9 місяців до того, як Джо опублікував свою та за 16 місяців до тебе. Я не збираюся не приймати відповідь Дана, хоча дякую за додавання альтернатив.
Нік

Відповіді:


35

Оскільки це питання набирає багато переглядів, і це була прийнята відповідь, я відчув потребу додати таку відмову від відповідальності:

Ця відповідь була специфічною для запитання OP (який мав ширину, встановлену в прикладах). Хоча це працює, для вас потрібна ширина кожного елемента, зображення та абзацу. Якщо це не ваша вимога, я рекомендую використовувати рішення Джо Конліна, яке розміщено як чергову відповідь на це питання.

spanЕлемент є вбудований елемент, ви не можете змінити його ширину в CSS.

Ви можете додати наступний CSS до вашого інтервалу, щоб ви могли змінити його ширину.

display: block;

Інший спосіб, який зазвичай має більше сенсу, - використовувати <p>елемент як батьківський для вашого <span>.

<li id="CN2787">
  <img class="fav_star" src="images/fav.png">
  <p>
     <span>Text, text and more text</span>
  </p>
</li>

Оскільки <p>є blockелементом, ви можете встановити його ширину за допомогою CSS, не змінюючи нічого.

Але в обох випадках, оскільки у вас зараз є елемент блоку, вам потрібно буде розмістити зображення так, щоб весь ваш текст не йшов нижче вашого зображення.

li p{width: 100px; margin-left: 20px}
.fav_star {width: 20px;float:left}

PS Замість того float:leftна зображенні, ви можете також покласти float:rightна , li pале в цьому випадку вам також необхідно text-align:leftправильно вирівняти текст.

PSS Якщо ви продовжили перше рішення не додавати <p>елемент, ваш CSS повинен виглядати так:

li span{width: 100px; margin-left: 20px;display:block}
.fav_star {width: 20px;float:left}

Це справді корисно. Я змінив елемент spanна pелемент. Тоді як раз ці два , здавалося, зробити трюк: li p {margin-left: 40px} .fav_star {float: left}. Ширина зображення встановлюється самим зображенням, pелемент автоматично є a, blockі я залишив ширину в спокої. Дякую за це.
Нік

2
Якщо ви збираєтеся використовувати, display:blockви можете так само добре використовувати, divоскільки саме для цього він призначений (або використовуйте, pяк ви також пропонуєте). Не потрібно подвійно обгортати текст - якщо ви використовуєте a, pви можете втратити span.
Гарет,

IMO, ви не повинні використовувати HTML для зміни дизайну своїх сторінок. Це робота для CSS (Звичайно, є винятки, особливо коли вам потрібна сумісність між браузерами). Я вважаю, що використання належного HTML та наявність "хорошої семантики" є більш важливим. Тому я б не використовував а div, у цьому випадку, а pмає більше сенсу. Втрата spanдля мене є якоюсь тривіальною і залежить від того, як ви викладаєте свій вміст.
Ден

Загортання <span>в - <p>це чаклунство прямо з Гоґварца! Працює красиво!
Янус

251

Дуже проста відповідь на цю проблему, яка, схоже, ловить багатьох людей:

<img src="url-to-image">
<p>Nullam id dolor id nibh ultricies vehicula ut id elit.</p>

    img {
        float: left;
    }
    p {
        overflow: hidden;
    }

Див. Приклад: http://jsfiddle.net/vandigroup/upKGe/132/


11
Це правильна відповідь на це питання. Цей прийом не вимагає встановлення фіксованої ширини абзацу. Набагато простіше і простіше рішення. Працює ідеально, навіть в IE8.
chocolata

4
Ну, насправді це не спрацює, якби елемент, що містить текст, був span(випадок OP). Потрібно display: blockбуло б для span. Але, зберігаючи це, я погоджуюсь, що це набагато елегантніше рішення. Якщо хтось замислюється, в чому полягає магія overflow: hidden, дивіться мою відповідь нижче.
hqcasanova

7
Це не поведінка, яку я очікував би, але це приголомшливо.
Гевін

2
Для протоколу, ця відповідь надійшла через 8 місяців після тієї, яку я поставив галочку :)
Нік

2
Ого. Працював ідеально. Я не можу повірити, що ніколи раніше цього не знав.
SFlagg

25

Для тих, хто хоче отримати довідкову інформацію, ось коротка стаття, яка пояснює, чому це overflow: hiddenпрацює. Це пов’язано з так званим контекстом форматування блоків . Це частина специфікації W3C (тобто не є зламом) і в основному є областю, зайнятою елементом із потоком блочного типу.

Кожного разу, коли він застосовується, overflow: hiddenстворює новий контекст форматування блоків. Але це не єдина властивість, здатна викликати таку поведінку. Процитувавши презентацію Фіони Чан із Сіднейської групи веб-програм:

  • поплавок: лівий / правий
  • переповнення: прихований / авто / прокрутка
  • display: cell-cell та будь-які пов'язані з таблицею значення / inline-block
  • положення: абсолютне / фіксоване

1
Чи можете ви додати до своєї відповіді деякі подробиці з цієї статті, якщо посилання загине?

Доброго ранку Австралія! Дякую за коментар.
hqcasanova

Це відмінно підходить для відображення блоків коду, які можуть зіткнутися з зображеннями або плаваючими бічними панелями поблизу.
AlexMA

Спосіб, як описано спочатку, працює добре, хоча, як казали інші, я не очікував би такої поведінки. Однак я не бачу, щоб плаваючий або вбудований блок працював без переповнення, і, звичайно, пов'язані з таблицею значення відображення та абсолютна чи фіксована позиція мають інші наслідки розмітки, які можуть бути або не бути прийнятними в контексті.
загадка

3

Якщо ви хочете, margin-leftщоб робота працювала над spanелементом, вам потрібно буде зробити його display: inline-blockабо display:blockтакож.


Можливо, потрібна vertical-align: top;і картинка з цим.
ThinkingStiff

2

налаштування display:flexтексту працювало для мене.


Здається, це більш сучасний еквівалент обстановки overflow:auto. Я впевнений, це не працює точно так само у всіх ситуаціях, але це спрацювало і для мене.
Matt Browne

1

Оберніть div навколо зображення та діапазону та додайте до CSS наступне:

HTML

        <li id="CN2787">
          <div><img class="fav_star" src="images/fav.png"></div>
          <div><span>Text, text and more text</span></div>
        </li>

CSS

            #CN2787 > div { 
                display: inline-block;
                vertical-align: top;
            }

            #CN2787 > div:first-of-type {
                width: 35%;
            }

            #CN2787 > div:last-of-type {
                width: 65%;
            }

МЕНШЕ

        #CN2787 {
            > div { 
                display: inline-block;
                vertical-align: top;
            }

            > div:first-of-type {
                width: 35%;
            }
            > div:last-of-type {
                width: 65%;
            }
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.