Liste öğesi madde işaretlerim neden kayan öğelerle çakışıyor?


166

Bir görüntüyü normal metin paragraflarının yanında yüzdüğüm bir (XHTML Sıkı) sayfam var. Paragraflar yerine bir liste kullanılması durumu dışında her şey yolunda gider. Listenin madde işaretleri yüzen görüntüyle örtüşüyor.

Listenin kenar boşluğunu veya liste öğelerini değiştirmek yardımcı olmaz. Marjı sayfanın solundaki hesaplanır, ancak şamandıra sağa liste öğelerini iter içerideli kendisi. Yani kenar boşluğu sadece görüntüyü daha geniş yaparsam yardımcı olur.

Görüntünün yanında yüzen liste de işe yarar, ancak listenin ne zaman bir yüzen işaretin yanında olduğunu bilmiyorum. Bunu düzeltmek için içeriğimdeki her listeyi kaydırmak istemiyorum. Ayrıca, bir resim listenin solu yerine sağa kaydırıldığında sola doğru kayan sayfa düzenini bozar .

Ayar li { list-style-position: inside }, madde işaretlerini içerikle birlikte hareket ettirir, ancak sarılı çizgilerin yukarıdaki çizgiyle hizalanmak yerine madde işareti ile hizalanmaya başlamasına da neden olur.

Sorun, merminin kutunun dışına çıkarılmasından kaynaklanıyor, şamandıra kutunun içeriğini sağa itiyor (kutunun kendisi değil). IE ve FF durumu nasıl ele aldığını ve bildiğim kadarıyla spesifikasyona göre yanlış değil. Soru şu: Nasıl önleyebilirim?

Yanıtlar:


280

Bu soruna bir çözüm buldum. Bir uygulama ul { overflow: hidden; }için ulyerine kutunun içindekiler, kutu kendisi şamandıra tarafından kenara olmasını sağlar.

Düzeni ul { zoom: 1; }olduğundan emin olmak için koşullu yorumlarımızda sadece IE6 gerekir ul.


1
+1: Harika CSS, İYİ BİR ÇOK YÖNLÜ çözüm için çılgın gibi aradım ve işte SO. Tek küçük geri çekme, zoom özelliğinin CSS'yi doğrulamamasıdır, ancak test ettim ve IE7'de IE8 gerekli değil, bu yüzden muhtemelen sadece IE6 için.
Marco Demaio

14
Bunu gerçekten işe almak için de başvurmalıydım: ul, ol {overflow: hidden; dolgu sol: 40 piksel; sol kenar boşluğu: 0; } ol li, ul li {liste-stil-konumu: dışarıda; dolgu sol: 0; } Bu tarayıcılar arasında tutarlı render zorladı ve IE6 mermi göstermek için zorladı. Mermiler başka türlü saklanmıştı. Ul {zoom: 1; } ie6 özel ayarlarında da hala gerekliydi.
Mandrake

1
MSIE'deki böyle saçma hatalara gülünç derecede basit bir çözüm.
SF.

10
Mükemmel bir çözüm değil. Blazemonger'ın darbeden bahsettiği gibi, eğer görüntü küçük ve liste çok uzunsa, liste kayan görüntünün etrafında akmaz. Görüntü çok genişse, listede baştan sona kadar büyük bir kenar boşluğu olacaktır.
yang

2
Güzel! Bununla birlikte, taşma sırasında W3C belgesini
MSC

66

İçin bir iyileştirme ekleme Glen E. Ivey'nin çözümüne :

ul {
    list-style: outside disc;
    margin-left: 1em;
}
ul li {
    position: relative;
    left: 1em;
    padding-right: 1em;    
}​

http://jsfiddle.net/mblase75/TJELt/

Bu tekniği tercih ederim, çünkü liste kayan görüntünün etrafında akması gerektiğinde çalışır, ancak overflow: hiddenteknik olmaz. Ancak, eklemek de gerekir padding-right: 1emiçin likendi kabı taşan onları tutmak için.


Üst düzeltme Twitter Bootstrap açılanlarımı kırdığı için bu düzeltmeyi de tercih ediyorum ve yukarıdaki yöntemin suçlu olduğunu anlamak beni sonsuza dek sürdü.
Ian Hoar

2
Bunun için teşekkürler. Taşma uygulanıyor: gizli; UL kabına tek tek satır öğelerindeki metnin kayan blok çevresinde düzgün bir şekilde dolaşmasını engelledi. Bu çözüm işe yaradı!
jsdalton

1
Bu çözümle ilgili küçük ama kritik bir sorunla karşılaştım ve iyileştirmenize bir ekleme önermek istiyorum. Neden olduğundan emin değilim, ancak position: relative;satır öğesine eklediğinizde , kayan içerikle ilgili bir yığınlama sorunu yaratır. (Chrome ve Firefox'ta) kayan içerikteki bağlantıların üzerine gelmenin ve tıklamanın zor olduğunu buldum. Benim için düzeltme position: relative; z-index: 1;, istifleme sorununu çözmüş görünen kayan öğeye eklemekti .
jsdalton

7
Ne yazık ki, IE 10'da mermiler kayan elemanla çakışıyor.
Munawwar

1
Oysa ul {overflow: hidden;}tüm tarayıcılarda bu sorunu çözmüş, yukarıdaki çözüm ile bu soruna yönelik tek çalışan çare oldu Prens XML , PDF dönüştürücü bir XHTML + CSS3.
Serge Stroobandt

36

"Display" özelliği burada devreye girer. Listenin kayan içerikle birlikte çalışması için aşağıdaki CSS'yi ayarlayın.

ekran: tablo; kayan içerikle birlikte (boşluğu doldururken), ancak arkasındaki içeriği gizlemeden çalışır. Bir tablo gibi :-)

.img {
  float: left;
}

.table {
  display: table;
}
<img class="img" src="https://via.placeholder.com/350x350" alt="">
<ul>
  <li>Test content</li>
  <li>Test content</li>
  <li>Test content</li>
</ul>
<ul class="table">
  <li>Test content</li>
  <li>Test content</li>
  <li>Test content</li>
</ul>

DÜZENLE: Bunu yapmak istediğiniz listeleri izole etmek için bir sınıf eklemeyi unutmayın. Örneğin "ul.in-content" veya daha genel olarak ".content ul"


29

Madde işaretlerinin düzenini değiştirmek için liste stili konumu: içerisini deneyin .


3
list-style-position:insideharika bir çözüm olabilir, ancak sarma çizgilerinin yukarıdaki çizgiyle hizalanmak yerine mermi ile hizalanmaya başlamasına neden olur.
Marco Demaio

taşma: gizli; benim sol şamandıra görüntü için çalışmıyor, ama liste tarzı pozisyon: içinde yaptı! teşekkürler
menardmam

Bu benim için hala IE'de içerik sarmış tek çözüm oldu. Teşekkürler!
jordan314

Bu, içerik madde işaretlerinizle madde işareti içeriği arasında yüzen olduğunda mükemmel bir çözümdür.
TylersSN

Seçilen cevap bu olmalıdır.
Şık Geek

18

Http://archivist.incutio.com/viewlist/css-discuss/106382 adresinde benim için çalışan bir öneri buldum: 'li' öğelerine şu şekilde stil uygula:

position: relative;
left: 1em;

"1em" ifadesini, şamandıra olmasaydı liste öğelerinizin alacağı sol dolgu / kenar boşluğunun genişliği ile değiştirdiğiniz yer. Bu, uygulamamda harika çalışıyor, şamandıranın alt kısmının listelerin ortasında olduğu durumda bile - mermiler sağa doğru (yerel) sol kenar boşluğuna geri dönüyor.


2
Fantastik bir çözüm, bir cazibe gibi çalışır! Kayan bir öğenin yanında olmayan listelerde liste öğesi numaralarını gösteremediğim için ellerimi IE7 ile kirletmek zorunda kaldım.
maryisdead

@maryisdead IE7 için çözümünüz nedir?
TJ.

IE7, liste öğelerinde fazladan bir kenar boşluğuna ihtiyaç duyuyordu. Bu keman jsfiddle.net/maryisdead/wu6ew/5 adresine bakın ve iki IE7 hackini not edin. Bunu daha önce eklemediğim için üzgünüm.
maryisdead

18

Neden overflow: hidden çalışır

Çözüm şu kadar kolaydır:

ul {overflow: hidden;}

Yeni bir blok formatlama bağlamıoverflow: dışında bir blok kutusuvisible için oluşturur. W3C önerisi: http://www.w3.org/TR/CSS2/visuren.html#block-formatting

Misal

Düğmeler web siteme olan <li>kılık değiştirmiş, böyle yapılır. Daha küçük tarayıcınızın görünüm (pencere) Make bkz girintilemeyi eylem .

Örnek olarak web sitem

İlgili cevaplar

Örneklerle makale


1
neden çalıştığını açıkladığınız için teşekkür ederiz (kabul edilen çözümde belirtilmemiş)
schellmax

17

Ekleyerek overflow: auto;için seninulEn azından benim çalışmalarına .

Güncelleme

Olanları görselleştirmek için jsfiddle'ımı güncelledim . ulYüzmenin yanına sahipken, imgiçeriğinin ulşamandıra tarafından itilecek, ancak gerçek kap değil. -Box'ın overflow: autotamamını ekleyerek ulsadece içerik yerine şamandıra tarafından itilecektir.


13

Sen atayabilir position: relative; left: 10px;için li. (Buna ek olarak a vermek isteyebilirsiniz margin-right: 10px;, aksi takdirde sağ tarafta çok geniş olabilir.)

Kullanmak istediğiniz Veya, floatiçin ulbaşkaları tarafından önerildiği gibi - - muhtemelen kullanarak ul hakkını yüzen gerisini durduramaz clear: leftul takip elemanı üzerinde.


teşekkürler chris, bu pozisyon: akraba çalıştı. ul'den sonra elemanın temizlenmesinden kaynaklanacak problem, elemanın solda yüzen div'ı da temizleyeceğidir.
superUntitled


7

feragat

Kayan öğelerin yanındaki listeler sorunlara neden olur. Kanımca, bu tür yüzen sorunları önlemenin en iyi yolu, içerikle kesişen hareketli görüntülerden kaçınmaktır. Duyarlı tasarımı desteklemeniz gerektiğinde de yardımcı olacaktır.

Paragraflar arasında ortalanmış görüntülere sahip basit bir tasarım, çok çekici görünecek ve desteklenmesi çok süslü olmaya çalışmaktan çok daha kolay olacaktır. Ayrıca a <figure>.

Ama gerçekten yüzen görüntüler istiyorum!

Tamam, sen eğer öyleyse deli bu yolda devam etmek ısrarlı yeterince kullanılabilir bir çift teknikler vardır.

En basit olanı listeyi kullanmaktır overflow: hiddenya overflow: scrollda liste esasen dolguyu küçültmek içindir, bu da dolguyu yararlı olduğu yere geri çeker:

img {
  float: left;
}
.wrapping-list {
  overflow: hidden;
  padding-left: 40px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

Bu tekniğin birkaç problemi var. Liste uzarsa, görüntünün etrafını sarmaz, floatbu da görüntüyü kullanma amacını neredeyse tamamen yener .

img {
  float: left;
}
.wrapping-list {
  overflow: hidden;
  padding-left: 40px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

Ama gerçekten liste kaydırma istiyorum!

Ok, ödeştik öyleyse çılgın daha kalıcı ve kesinlikle gerekir bu yolu devam, liste öğeleri sarmak ve mermi korumak için kullanılabilecek başka bir tekniktir var.

<ul>(Ve asla yapmak istemiyor gibi görünüyor) mermilerle güzel davranmaya çalışmak yerine, bu mermileri alıp götürün <ul>ve <li>s'ye verin. Mermiler tehlikelidir ve <ul>sadece onları düzgün bir şekilde kullanacak kadar sorumlu değildir.

img {
  float: left;
}
.wrapping-list {
  padding: 0;
  list-style-position: inside;
}
.wrapping-list li {
  overflow: hidden;
  padding-left: 25px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

Bu kaydırma davranışı karmaşık içeriğe garip şeyler yapabilir, bu yüzden varsayılan olarak eklemenizi önermiyorum. Geçersiz kılınması gereken bir şey yerine seçilebilecek bir şey olarak ayarlamak çok daha kolaydır.


İkinci seçeneği beğendim, ancak metin aslında daha uzun metinlerdeki mermi noktalarıyla başlıyor (2 satır) :-(
Arany

4

UL etiketinizde aşağıdakileri deneyin. Bu, görüntünüzün üstündeki mermilere dikkat etmeli ve neden olduğu sol hizalamayı bozmak zorunda değilsiniz list-position: inside.

overflow: hidden; 
padding-left: 2em; 

Bunu Blazemonger'ın çözümü ile kullanmak zorunda kaldım (yukarıdaki # 2). BLazemonger sadece IE 9-11 ve Opera'da çalışmadı. Bununla, tüm tarayıcılarda çalışır. Kamiel'in (# 1) çözümü mermilerimi sakladığı için benim için işe yaramadı. Belki Bootstrap3 ile çatışma.
Leraa

3

Bununla kendim mücadele ettik. En iyi yönettiğim şudur:

ul {
    list-style-position: inside;
    padding-left: 1em;
    text-indent: -1em;
}

Metin aslında girintili değil, madde işareti gösteriyor.


2

OP'nin yorumuna dayanarak güncellenmek üzere düzenlendi

tamam, sonra birlikte yuvalanmış 2 div'e ayırın

ul  {background: blue; position:static;}
.therest {position:relative; width:100%}
.indent {float:left; }

<div class="therest">
<p>
Est tincidunt doming iis nobis nibh. Ullamcorper eorum elit lius me delenit. 
</p>
<hr />
<h3>Lorem</h3>
<div class="indent">
<ul>
<li>list element</li>
<li>list element</li>
<li>list element</li>
</ul> 
<div>
the rest now under the UL
</div>

ul li css değiştirmeyi dene

ul {şamandıra: sol; arka plan: mavi; }


teşekkürler, bu işe yarar, ancak şimdi aşağıdaki paragraflar sağ tarafa doğru yüzer.
superUntitled

2

Birkaç projede bu ilginç sorunla savaştıktan ve neden olduğunu araştırdıktan sonra, sonunda her ikisini de bulduğuma inanıyorum: çalışan ve 'duyarlı' bir çözüm.

İşte sihir, canlı örnek: http://jsfiddle.net/superKalo/phabbtnx/

ul {
    list-style: none;
    position: relative;
    padding-left: 0; /* remove any left padding */
    margin-left: 0; /* remove any left margin */
    left: 35px;
}
li {
    padding-left: 0; /* remove any left padding */
    margin-left: 0; /* remove any left margin */
    text-indent: -19px; /* adjust as much as needed */
}
li:before {
    content: '•\00a0\00a0\00a0';
    color: #000; /* bonus: you can customize the bullet color */
}

I ilave display: flex;etmek lii yazı tipi boyutunu değiştirmek Bulletpoint dikey ortasında olacak şekilde olduğu, :beforekısmen.
Arany

1

Doküman başkanına erişimi olmayan bir LMS içinde çalışmak margin-right: 20px, görüntü için satır içi bir stil olarak gitmeyi daha kolay buldu . Bu siteye borçluyum .


0

bunu dene:

li{
    margin-left:5px;
}

Sola gitmelerini istiyorsanız, bir - ## px değeri girin.


0

ya da bunu yapabilirsiniz:

 #content ul {
        background:none repeat scroll 0 0 #AACCDD;
        float:left;
        margin-right:10px;
        padding:10px;

ve sonra tüm stilleri li'den kaldırın.


1
ul'u yüzen gerçekten sorunu çözer, ancak başka bir sorun ortaya çıkar ... ul'den sonra gelen tüm paragraf öğeleri ul'nin sağına süzülür.
superUntitled

bunun için +1 verdim ... Burada, <p> 'nin <ul>' un sağında kalacağı sorusu ile ilgili bağlantıya bakarak bir varsayım yapıyordum. İyi yakalama.
Reece


0
width: 300px;
height: 30px;
margin-left: auto;
right: 10px;

sol kenar boşluğu: otomatik, öğenin kendisinin sağa hizalanmasına neden olur. İstediğiniz öğenin yüksekliğini ve genişliğini ayarlayın - benim içimde bir div içindeki arka plan görüntüsü


0

Ayrıca ulsola doğru yüzmeyi deneyebilir ve widthbunun için uygun bir tanım tanımlayabilirsiniz , böylece görüntünün yanında yüzer.

Bu jsfiddle gibi bir şey mi?




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.