CSS, aby zatrzymać zawijanie tekstu pod obrazem

87

Mam następujące znaczniki:

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

Chcę, aby tekst zawijał się, nie trafiał do „kolumny” obrazu. Wiem, że mogę to zrobić za pomocą table(co robiłem), ale z tego powodu nie jest to wykonalne .

Próbowałem następujących bez powodzenia:

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

Ja też próbowałem float: right.

Dzięki.

EDYCJA: chcę, żeby wyglądało to tak:

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

Nie tak jak to:

IMG   Text starts here and keeps going... and 
wrap starts in the space left for the image.
Nacięcie
źródło
1
czy możesz umieścić swój kod w jsfiddle?
Hardik,
Myślę, że musisz trochę jaśniej przedstawić swoje zamiary tutaj. Jeśli nie chcesz, aby otoczyć tekst następnie można po prostu użyć white-space: nowrap;w li span {...}, ale mam wrażenie, że staramy się robić coś innego
Boli mnie głowa
@MyHeadHurts Przeprosiny - wydawało mi się jasne :) Chcę mieć dwie kolumny w linii. Lewe 20 pikseli to obraz. Pozostała część dotyczy tekstu. Jeśli tekst zawija się, chcę, aby zaczynał drugą linię zawijania 20 pikseli od lewej (poniżej miejsca, w którym zaczynał się tekst początkowy).
Nick,
1
W przypadku przechodniów nie musisz zajmować się szerokościami, jak sugeruje zaakceptowana odpowiedź. To znacznie prostsze: utwórz tak zwany nowy kontekst formatowania . Zobacz odpowiedź Joe Conlin. Aby uzyskać więcej informacji, zobacz moje.
hqcasanova
1
@hqcasanova Dla przypomnienia, odpowiedź Dana została przyjęta 9 miesięcy przed opublikowaniem przez Joe i 16 miesięcy przed twoją. Nie zamierzam odrzucać odpowiedzi Dana, chociaż dziękuję za dodanie alternatyw.
Nick

Odpowiedzi:

35

Ponieważ to pytanie zyskuje wiele opinii i była to akceptowana odpowiedź, poczułem potrzebę dodania następującego zastrzeżenia:

Ta odpowiedź była specyficzna dla pytania PO (które miało szerokość określoną w przykładach). Chociaż to działa, wymaga szerokości każdego elementu, obrazu i akapitu. O ile nie jest to Twoje wymaganie, polecam skorzystanie z rozwiązania Joe Conlin, które jest zamieszczone jako kolejna odpowiedź na to pytanie.

Plik spanElement jest elementem inline, nie można zmienić jego szerokość w CSS.

Możesz dodać następujący CSS do swojego zakresu, abyś mógł zmienić jego szerokość.

display: block;

Innym sposobem, który zwykle ma większy sens, jest użycie <p>elementu jako rodzica dla twojego <span>.

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

Ponieważ <p>jestblock elementem, możesz ustawić jego szerokość za pomocą CSS, bez konieczności zmiany czegokolwiek.

Ale w obu przypadkach, ponieważ masz teraz element blokowy, będziesz musiał przesunąć obraz tak, aby cały tekst nie znalazł się pod obrazem.

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

PS Zamiast float:leftna obrazie, można również umieścić float:rightna li pale w takim przypadku konieczne będzie także text-align:leftprawidłowo wyrównać tekst.

PSS Jeśli zdecydowałeś się na pierwsze rozwiązanie polegające na nie dodawaniu <p>elementu, twój CSS powinien wyglądać tak:

li span{width: 100px; margin-left: 20px;display:block}
.fav_star {width: 20px;float:left}
Dan
źródło
To jest naprawdę pomocne. Zmieniłem spando pelementu. Wtedy właśnie te dwa wydawał się rade: li p {margin-left: 40px} .fav_star {float: left}. Szerokość obrazu jest ustalana przez sam obraz, pelement jest automatycznie a, blocka szerokość zostawiłem samą. Dzięki za to.
Nick,
2
Jeśli zamierzasz użyć display:block, równie dobrze możesz użyć a, divponieważ do tego służy (lub użyj a, pjak również sugerujesz). Nie ma potrzeby podwójnego zawijania tekstu - jeśli używasz a p, możesz zgubić span.
Gareth,
IMO, nie powinieneś używać HTML do zmiany projektu swoich stron. To jest zadanie dla CSS (są oczywiście wyjątki, szczególnie gdy potrzebujesz kompatybilności z różnymi przeglądarkami). Uważam, że ważniejsze jest używanie odpowiedniego HTML-a i posiadanie „dobrej semantyki”. Więc nie użyłbym div, w tym przypadku, a pma więcej sensu. Utrata spanjest dla mnie banalna i zależy od tego, jak układasz swoje treści.
Dan,
Zawijanie <span> w sposób <p>to czary prosto z Hogwartz! Działa pięknie!
Janus
252

Bardzo prosta odpowiedź na ten problem, który wydaje się łapać wiele osób:

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

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

Zobacz przykład: http://jsfiddle.net/vandigroup/upKGe/132/

Joe Conlin
źródło
11
To jest właściwa odpowiedź na to pytanie. Ta technika nie wymaga ustawiania stałej szerokości akapitu. Dużo prostsze i łatwiejsze rozwiązanie. Działa doskonale, nawet w IE8.
chocolata
4
Cóż, w rzeczywistości to nie zadziała, jeśli element zawierający tekst był a span(przypadek OP). Potrzebny display: blockbyłby plik span. Ale oszczędzając to, zgadzam się, że jest to znacznie bardziej eleganckie rozwiązanie. Jeśli ktoś się zastanawia, na czym polega magia overflow: hidden, zobacz moją odpowiedź poniżej.
hqcasanova
7
Nie takiego zachowania bym się spodziewał, ale to jest niesamowite.
Gavin
2
Dla przypomnienia, ta odpowiedź nadeszła 8 miesięcy po tej, którą zaznaczyłem :)
Nick
2
Łał. Działał doskonale. Nie mogę uwierzyć, że nigdy wcześniej tego nie wiedziałem.
SFlagg
25

Dla tych, którzy chcą uzyskać dodatkowe informacje, oto krótki artykuł wyjaśniający, dlaczego overflow: hiddendziała. Ma to związek z tak zwanym kontekstem formatowania bloków . Jest to część specyfikacji W3C (tj. Nie jest to hack) i jest to w zasadzie obszar zajmowany przez element z przepływem typu blokowego.

Za każdym razem, gdy jest stosowany, overflow: hiddentworzy nowy kontekst formatowania bloku. Ale to nie jedyna właściwość, która może wywołać takie zachowanie. Cytując prezentację Fiony Chan z Sydney Web Apps Group:

  • float: lewo / prawo
  • przepełnienie: ukryte / automatyczne / przewijanie
  • display: tabela-komórka i wszelkie wartości związane z tabelą / inline-block
  • pozycja: bezwzględna / stała
hqcasanova
źródło
1
Czy możesz dodać do odpowiedzi kilka szczegółów z tego artykułu na wypadek, gdyby link zniknął?
Dzień dobry Australio! Dziękuję za komentarz.
hqcasanova
Jest to doskonałe do wyświetlania bloków kodu, które mogą być zmuszone do rywalizacji z pobliskimi obrazami lub pływającymi paskami bocznymi.
AlexMA
Technika, jak pierwotnie opisano, działa dobrze, chociaż, jak powiedzieli inni, nie jest to zachowanie, którego bym się spodziewał. Jednak nie widzę, aby float lub inline-block działały bez przepełnienia, a wartości wyświetlania związane z tabelą i położenie bezwzględne lub stałe mają inne konsekwencje układu, które mogą być dopuszczalne lub nie w kontekście.
enigment
3

Jeśli chcesz, margin-leftaby działał nad spanelementem, musisz to zrobić display: inline-blocklub display:blockteż.

Gareth
źródło
Prawdopodobnie potrzebuję vertical-align: top;na obrazie również z tym.
ThinkingStiff
2

ustawienie display:flextekstu zadziałało dla mnie.

Mamrez
źródło
Wydaje się, że jest to bardziej nowoczesny odpowiednik scenerii overflow:auto . Jestem pewien, że nie działa dokładnie tak samo we wszystkich sytuacjach, ale zadziałał również dla mnie.
Matt Browne
1

Owiń element DIV wokół obrazu i zakresu i dodaj do CSS w ten sposób:

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%;
            }

MNIEJ

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

            > div:first-of-type {
                width: 35%;
            }
            > div:last-of-type {
                width: 65%;
            }
        }
9ete
źródło