Görselin altına metin kaydırmayı durdurmak için CSS


87

Aşağıdaki işaretlemem var:

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

Metnin kaydırılması durumunda resmin "sütununa" gitmemesini istiyorum. Bunu a ile yapabileceğimi biliyorum table(bunu yapıyordum) ama bu nedenle bu işe yaramıyor .

Aşağıdakileri başarılı olmadan denedim:

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

Ben de denedim float: right.

Teşekkürler.

DÜZENLEME: Bunun gibi görünmesini istiyorum:

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

Böyle değil:

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

1
kodunuzu jsfiddle'a koyabilir misiniz?
Hardik

Sanırım burada niyetleriniz konusunda biraz daha net olmanız gerekiyor. Metin daha sonra sarmak için istemiyorsanız sadece kullanabilirsiniz white-space: nowrap;içinde li span {...}ama başka bir şey yapmaya çalışıyoruz izlenimi olsun
Başım ağrıyor

@MyHeadHurts Özür dilerim - bana açık göründü :) Satırda iki sütun istiyorum. Soldaki 20px bir görüntü içindir. Geri kalan metin içindir. Metin kaydırılırsa, sarmanın ikinci satırına soldan 20px (ilk metnin başladığı yerin altında) başlamasını istiyorum.
Nick

1
Yoldan geçenler için, kabul edilen cevabın önerdiği gibi genişliklerle uğraşmanıza gerek yoktur. Çok daha basit: yeni bir biçimlendirme bağlamı adı verilen şeyi oluşturun . Joe Conlin'in cevabına bakın. Daha fazla bilgi için benimkine bakın.
hqcasanova

1
@hqcasanova Kayıt için, Dan'ın cevabı Joe'nun gönderdiği 9 ay ve sizinkinden 16 ay önce kabul edildi. Alternatifler eklediğiniz için teşekkürler olsa da, Dan'in cevabını kabul etmeyeceğim.
Nick

Yanıtlar:


35

Bu soru çok sayıda görüş kazandığından ve kabul edilen cevap bu olduğundan, aşağıdaki sorumluluk reddini ekleme ihtiyacı hissettim:

Bu cevap OP'nin sorusuna özeldi (Örneklerde genişliği ayarlanmış olan). Çalışırken, öğelerin her birinde, görüntüde ve paragrafta bir genişliğe sahip olmanızı gerektirir. Gereksiniminiz bu değilse , bu soruya başka bir cevap olarak yayınlanan Joe Conlin çözümünü kullanmanızı tavsiye ederim .

spanEleman bir satır içi eleman, CSS onun genişliğini değiştiremezsiniz olduğunu.

Genişliğini değiştirebilmeniz için aşağıdaki CSS'yi yayılma alanınıza ekleyebilirsiniz.

display: block;

Genellikle daha mantıklı olan başka bir yol da, bir <p>öğeyi sizin için ebeveyn olarak kullanmaktır <span>.

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

Yana <p>bir olan blockunsur, bir şey değiştirmek zorunda kalmadan, CSS kullanarak genişliğini ayarlayabilirsiniz.

Ancak her iki durumda da, şimdi bir blok öğeniz olduğundan, metninizin tamamı görüntünüzün altına düşmemesi için görüntüyü kaydırmanız gerekecektir.

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

Not: float:leftResmin float:rightüzerine koymak yerine , onu da takabilirsiniz , li pancak bu durumda, text-align:leftmetni doğru şekilde yeniden hizalamanız da gerekecektir .

PSS Eğer bir <p>element eklememenin ilk çözümüne geçtiyseniz, CSS'niz şöyle görünmelidir:

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

Bu gerçekten faydalıdır. Öğesini spanbir pöğeye değiştirdim . O zaman sadece bu iki hile yapmak gibiydi: li p {margin-left: 40px} .fav_star {float: left}. Görüntünün genişliği görüntünün kendisi tarafından belirlenir, pöğe otomatik olarak blocka'dır ve genişliği yalnız bıraktım. Bunun için teşekkürler.
Nick

2
Kullanmak gidiyoruz display:blocksen de iyi bir kullanabilir divbunun için ne o yıllardan beri (ya da kullanmak pda önerdiği gibi). Çift sargı metin gerek yoktur - Bir kullanıyorsanız psize kaybedebilir span.
Gareth

IMO, sayfalarınızın tasarımını değiştirmek için HTML kullanmamalısınız. Bu CSS'nin işidir (Elbette, özellikle tarayıcılar arası uyumluluğa ihtiyaç duyduğunuzda bir istisna vardır). Doğru HTML kullanmanın ve "iyi anlamlara" sahip olmanın daha önemli olduğuna inanıyorum. Yani divbu durumda a kullanmazdım , a pdaha mantıklı. Kaybetmek spanbenim için biraz önemsiz ve içeriğinizi nasıl düzenlediğinize bağlı.
Dan

Bir <span>içine sarmak <p>, Hogwartz'dan çıkmış bir büyücülüktür! Güzel çalışıyor!
Janus

252

Pek çok insanı yakalayan bu problem için çok basit cevap:

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

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

Örneğe bakın: http://jsfiddle.net/vandigroup/upKGe/132/


11
Bu sorunun doğru cevabı budur. Bu teknik, paragrafa sabit bir genişlik ayarlamayı gerektirmez. Çok daha basit ve daha kolay çözüm. IE8'de bile mükemmel çalışıyor.
chocolata

4
Aslında, metni içeren öğe bir span(OP'nin durumu) ise bu işe yaramayacaktır . İçin bir display: blockgerekir span. Ancak bunu kaydederek, bunun çok daha zarif bir çözüm olduğuna katılıyorum. Birinin arkasındaki sihrin ne olduğunu merak etmesi durumunda overflow: hidden, aşağıdaki cevabıma bakın.
hqcasanova

8
Beklediğim davranış bu değil, ama bu harika.
Gavin

2
Kayıt için, bu cevap işaretlediğim cevaptan 8 ay sonra geldi :)
Nick

2
Vay. Mükemmel çalıştı. Bunu daha önce hiç bilmediğime inanamıyorum.
SFlagg

25

Arka plan bilgisi isteyenler için, neden işe yaradığını açıklayan kısa bir makaleoverflow: hidden . Sözde blok biçimlendirme bağlamı ile ilgisi vardır . Bu, W3C'nin spesifikasyonunun bir parçasıdır (yani bir hack değildir) ve temelde blok tipi akışa sahip bir eleman tarafından işgal edilen bölgedir.

Uygulandığı her zaman, overflow: hiddenbir oluşturur yeni blok biçimlendirme bağlamı. Ancak bu davranışı tetikleyebilecek tek özellik bu değildir. Sydney Web Apps Group'tan Fiona Chan'ın bir sunumundan alıntı yapmak :

  • şamandıra: sol / sağ
  • taşma: gizli / otomatik / kaydırma
  • ekran: tablo hücresi ve tabloyla ilgili değerler / satır içi blok
  • pozisyon: mutlak / sabit

1
Bağlantının kesilmesi durumunda cevabınıza bu makaleden bazı ayrıntılar ekleyebilir misiniz?

Günaydın Avustralya! Yorum için teşekkürler.
hqcasanova

Bu, yakındaki görüntülerle veya kayan kenar çubuklarıyla uğraşması gerekebilecek kod bloklarını görüntülemek için mükemmeldir.
AlexMA

Başlangıçta açıklanan teknik iyi çalışıyor, ancak diğerlerinin de söylediği gibi, beklediğim bir davranış değil. Bununla birlikte, kayan veya satır içi bloğun taşma olmadan çalıştığını görmüyorum ve tabii ki tabloyla ilgili görüntüleme değerleri ve mutlak veya sabit konum, bağlamda kabul edilebilir veya olmayabilecek başka düzen sonuçlarına sahip.
muigment

3

margin-leftBir spanöğe üzerinde çalışmayı istiyorsanız, onu yapmanız display: inline-blockya display:blockda yapmanız gerekir .


Muhtemelen vertical-align: top;bununla birlikte görüntüye de ihtiyaç var.
ThinkingStiff

2

display:flexmetin için ayar benim için çalıştı.


Bu, daha modern bir ortam eşdeğeri gibi görünüyor overflow:auto. Eminim her durumda aynı şekilde çalışmaz, ama benim için de işe yaradı.
Matt Browne

1

Görüntünün ve aralığın etrafına bir div sarın ve aşağıdaki gibi CSS'ye ekleyin:

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

AZ

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

            > div:first-of-type {
                width: 35%;
            }
            > div:last-of-type {
                width: 65%;
            }
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.