내 목록 항목 글 머리 기호가 부동 요소와 겹치는 이유


166

일반 텍스트 단락과 함께 이미지를 띄우는 (XHTML Strict) 페이지가 있습니다. 단락 대신 목록을 사용하는 경우를 제외하고는 모두 잘 진행됩니다. 목록의 글 머리 기호가 부동 이미지와 겹칩니다.

목록의 여백이나 목록 항목을 변경해도 도움이되지 않습니다. 여백은 페이지 왼쪽에서 계산되지만 부동 소수점은 목록 항목을 자체 내부 의 오른쪽으로 푸시합니다 li. 따라서 여백은 이미지보다 넓게 만드는 경우에만 도움이됩니다.

이미지 옆에 목록을 플로팅해도 작동하지만 목록이 플로트 옆에 언제 있는지 모르겠습니다. 이 문제를 해결하기 위해 콘텐츠의 모든 목록을 띄우고 싶지 않습니다. 또한 떠 다니는 왼쪽은 이미지가 목록의 왼쪽 대신 오른쪽으로 떠오를 때 레이아웃을 엉망으로 만듭니다.

설정 li { list-style-position: inside }하면 글 머리 기호가 내용과 함께 이동하지만 줄 바꿈이 위 줄과 일치하지 않고 글 머리 기호와 정렬되기 시작합니다.

총알이 상자 바깥쪽으로 렌더링되고 상자의 내용물이 상자 자체가 아닌 오른쪽으로 상자의 내용물을 밀어 넣음으로써 문제가 발생합니다. 이것은 IE와 FF가 상황을 처리하는 방법이며, 내가 아는 한 사양에 따라 잘못되지 않았습니다. 문제는 어떻게 방지 할 수 있습니까?

답변:


280

이 문제에 대한 해결책을 찾았습니다. 적용 ul { overflow: hidden; }받는 ul대신 상자의 내용의 박스 자체가 플로트에 의해 옆으로 밀어 보장하지만합니다.

ul { zoom: 1; }조건부 주석 에는 IE6 만 있으면 ul레이아웃이 있어야 합니다.


1
+1 : 훌륭한 CSS, GOOD VERSATILE 솔루션을 찾기 위해 미친 듯이 검색했으며 여기에 있습니다. 유일한 작은 단점은 확대 / 축소 속성이 CSS의 유효성을 검사하지 않지만 IE7에서는 IE8이 필요하지 않으므로 IE6에만 해당한다는 것입니다.
Marco Demaio

14
이것을 실제로 작동 시키려면 다음도 적용해야했습니다. ul, ol {overflow : hidden; 왼쪽 여백 : 40px; 마진-왼쪽 : 0; } ol li, ul li {목록 스타일 위치 : 외부; 왼쪽 여백 : 0; } 이로 인해 브라우저 전체에서 일관된 렌더링이 수행되고 IE6이 글 머리 기호를 표시하도록 강제했습니다. 그렇지 않으면 총알이 숨겨져있었습니다. ul {줌 : 1; }은 ie6 특정 설정에서도 여전히 필요했습니다.
Mandrake

1
MSIE의 그런 우스운 버그에 대한 너무나도 간단한 해결책입니다.
SF.

10
완벽한 솔루션이 아닙니다. Blazemonger가 블로우를 언급했듯이 이미지가 작고 목록이 너무 길면 목록이 플로팅 이미지 주위로 흐르지 않습니다. 이미지가 매우 넓은 경우 목록의 상단부터 끝까지 큰 마진을 갖습니다.

2
좋은! 오버플로에서 W3C 문서를 읽을 때 이것이 어떻게 의미가 있는지 알 수 없습니다. w3schools.com/cssref/pr_pos_overflow.asp
MSC

66

Glen E. Ivey의 솔루션 개선 사항 추가 :

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

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

목록이 플로팅 이미지 주위로 흐를 필요가있을 때 작동하기 때문에이 기술을 선호하지만 overflow: hidden기술은 그렇지 않습니다. 그러나 컨테이너에 넘치지 않도록 추가 padding-right: 1em해야합니다 li.


맨 위의 Twitter Bootstrap 드롭 다운이 중단되어 위의 방법이 범인이라는 것을 알기 위해 영원히 시간이 걸렸습니다.
Ian Hoar

2
고마워 오버플로 적용 : 숨김; 컨테이너에 UL을 사용하면 개별 광고 항목의 텍스트가 플로팅 된 블록 주위에서 제대로 실행되지 않습니다. 이 솔루션은 트릭을 수행했습니다!
jsdalton

1
이 솔루션에서 사소하지만 중요한 문제가 발생하여 개선 사항을 추가하고 싶습니다. 이유를 잘 모르겠지만 광고 position: relative;항목에 추가 하면 플로팅 된 콘텐츠에 누적 문제가 발생합니다. Chrome 및 Firefox에서 플로팅 된 콘텐츠의 링크를 클릭하고 클릭하기가 어렵다는 것을 알았습니다. 나를위한 해결책 position: relative; z-index: 1;은 부동 요소 에 추가 하는 것이 었습니다.이 문제는 스택 문제를 해결하는 것처럼 보였습니다.
jsdalton

7
불행히도 IE 10에서는 글 머리 기호가 부동 요소와 겹칩니다.
Munawwar

1
ul {overflow: hidden;}모든 브라우저에서이 문제를 해결 한 반면 , 위의 솔루션은 XHTML + CSS3에서 PDF로 변환하는 Prince XML 에서이 문제에 대한 유일한 해결책이었습니다 .
Sroo Stroobandt

36

"디스플레이"속성이있는 곳입니다. 플로팅 된 컨텐츠와 함께 목록이 작동하도록 아래 CSS를 설정하십시오.

디스플레이 : 테이블; 부동 컨텐츠와 함께 작동하지만 (갭을 채우는) 컨텐츠를 숨기지 않습니다. 테이블처럼 :-)

.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>

편집 :이 목록을 분리 할 클래스를 추가해야합니다. 예를 들어 "ul.in-content"또는보다 일반적으로 ".content ul"


29

글 머리 기호의 레이아웃을 변경하려면 list-style-position : inside 를 사용해보십시오 .


3
list-style-position:inside훌륭한 해결책이 될 수 있지만 줄 바꿈이 위의 줄과 정렬되는 대신 총알과 정렬되기 시작합니다.
Marco Demaio

오버플로 : 숨겨진; 내 왼쪽 플로트 이미지에서는 작동하지 않지만 list-style-position : inside did! 감사
menardmam

이것은 여전히 ​​IE의 내용을 감싸는 유일한 솔루션이었습니다. 감사!
jordan314 1

글 머리 기호와 글 머리 기호 내용 사이에 컨텐츠가 떠있는 경우에 적합한 솔루션입니다.
TylersSN

이것이 정답입니다.
매끄러운 괴짜

18

에서 http://archivist.incutio.com/viewlist/css-discuss/106382 스타일을 가진 '리'요소 : 나는 나를 위해 일한 제안을 발견 :

position: relative;
left: 1em;

"1em"을 부동이 존재하지 않을 경우 목록 항목이 가질 수있는 왼쪽 패딩 / 여백의 너비로 대체합니다. 이것은 내 응용 프로그램에서 효과적이며, 플로트의 맨 아래가 목록의 중간에서 발생하는 경우를 처리합니다. 총알이 오른쪽 (로컬) 왼쪽 여백으로 다시 이동합니다.


2
환상적인 솔루션, 매력처럼 작동합니다! 부동 요소 옆에없는 목록에 목록 항목 번호를 표시하지 못했기 때문에 IE7로 손을 더럽혀 야했습니다.
maryisdead

@maryisdead IE7에 대한 솔루션은 무엇입니까?
TJ.

IE7은 목록 항목에 여분의 여백이 필요했습니다. 이 바이올린 jsfiddle.net/maryisdead/wu6ew/5 를보고 두 개의 IE7 핵에 주목하십시오. 이전에 이것을 추가하지 않아서 죄송합니다.
maryisdead

18

overflow: hidden작동

솔루션은 다음과 같이 쉽습니다.

ul {overflow: hidden;}

overflow:이외 의 블록 상자 는 내용에 대한 visible 새로운 블록 서식 컨텍스트 를 설정합니다. W3C 권장 사항 : http://www.w3.org/TR/CSS2/visuren.html#block-formatting

변장 한 내 웹 사이트 의 버튼 <li>은 다음과 같습니다. 들여 쓰기 가 실제로 표시되도록 브라우저의 뷰포트 (창)를 더 작게 만듭니다.

예를 들어 내 웹 사이트

관련 답변

예제가 포함 된 기사


1
작동 하는지 설명해 주셔서 감사 합니다 (허용 된 솔루션에 언급되지 않음)
schellmax

17

적어도 나를 overflow: auto;위해 당신의 ul작품에 추가함으로써 .

최신 정보

진행 상황 을 시각화하기 위해 jsfiddle 을 업데이트 했습니다. 을 갖는 경우 ul플로팅 옆 img의 내용은 ul실제 용기 플로트에 밀려 아닌 것이다. overflow: auto전체 ul-box 를 추가 하면 내용이 아닌 float에 의해 푸시됩니다.


13

에 할당 position: relative; left: 10px;할 수 li있습니다. (추가로을 제공 margin-right: 10px;할 수도 있습니다. 그렇지 않으면 오른쪽에서 너무 넓어 질 수 있습니다.)

당신이 사용하려는 경우 또는 float을 위해 ul다른 사람에 의해 제안 - - 당신은 아마 사용하여 UL의 권리를 부동에서 휴식을 중지 할 수 있습니다 clear: leftUL 인증을 다음 요소에.


고마워 크리스, 그 입장 : 친척이 일했다. ul 후 요소를 지우면 발생할 수있는 문제는 요소가 왼쪽 부동 div를 지우는 것입니다.
superUntitled

7

이 문제를 해결하기 위해 이것을 사용하고 있습니다.

ul {
   display: table;
}

7

부인 성명

부동 요소 옆에있는 목록은 문제를 일으 킵니다. 제 생각에는 이러한 종류의 플로팅 문제를 방지하는 가장 좋은 방법은 콘텐츠와 교차하는 플로팅 이미지를 피하는 것입니다. 반응 형 디자인을 지원해야 할 때도 도움이됩니다.

단락 사이에 이미지를 중앙에 배치하는 단순한 디자인은 너무 매력적으로 보이기보다 매우 매력적으로 보이고 지원하기가 훨씬 쉽습니다. 또한 한 걸음 떨어져 있습니다 <figure>.

그러나 나는 정말로 떠 다니는 이미지를 원합니다!

자, 만약 당신 이이 길을 계속할 정도로 열심 이라면 , 몇 가지 기술을 사용할 수 있습니다.

가장 간단한 방법은 목록을 사용 overflow: hidden하거나 overflow: scroll목록을 본질적으로 축소 포장하여 패딩을 유용한 위치로 끌어 올리는 것입니다.

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>

이 기술에는 몇 가지 문제가 있습니다. 목록이 길어지면 실제로 이미지를 감싸지 않으므로 이미지 사용의 전체 목적을 거의 능가합니다 float.

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>

그러나 나는 정말로 목록을 래핑하고 싶다!

좋아, 만약 당신이 더 더 영리하고 더 길을 따라 가야 한다면 ,리스트 아이템을 감싸고 글 머리 기호를 유지하는 데 사용할 수있는 또 다른 기술이 있습니다.

대신 패딩의 <ul>하고 (이것은 결코 수행 할 것 같다) 총알 잘 행동하려고 노력은 멀리 그 총알을 <ul>하고 그들을 제공 <li>의. 총알은 위험하며 그에 대한 <ul>책임은 없습니다.

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>

이 줄 바꿈 동작은 복잡한 내용에 이상한 일을 할 수 있으므로 기본적으로 추가하지 않는 것이 좋습니다. 재정의해야하는 것이 아니라 선택할 수있는 것으로 설정하는 것이 훨씬 쉽습니다.


나는 두 번째 옵션을 좋아하지만 텍스트는 실제로 긴 텍스트 (2 행)의 글 머리 기호로 시작합니다 :-(
Arany

4

UL 태그에서 다음을 시도하십시오. 이미지가 겹쳐지는 글 머리 기호를 처리해야하며으로 인해 왼쪽 맞춤을 엉망으로 만들 필요가 없습니다 list-position: inside.

overflow: hidden; 
padding-left: 2em; 

나는 이것을 Blazemonger의 솔루션 (위 # 2)과 함께 사용해야했습니다. BLazemonger만으로는 IE 9-11 및 Opera에서 작동하지 않았습니다. 이를 통해 모든 브라우저에서 작동합니다. Kamiel의 (# 1) 솔루션은 총알을 숨겨서 작동하지 않았습니다. 아마도 Bootstrap3과 충돌합니다.
Leraa

3

이 문제로 어려움을 겪었습니다. 내가 관리 한 최선은 다음과 같습니다.

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

텍스트는 실제로 들여 쓰기되지 않지만 글 머리 기호가 표시됩니다.


2

OP의 의견을 기반으로 업데이트되도록 수정되었습니다.

좋아, 그냥 중첩 된 2 개의 div로 나눕니다.

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를

ul {float : left; 배경 : 파랑; }


고마워,하지만 작동하지만 이제 아래 단락이 오른쪽에 떠 있습니다.
superUntitled

2

여러 프로젝트 에서이 흥미로운 문제와 싸우고 왜 그런 일이 일어 났는지 조사한 후에 마침내 작동하는 '응답 성' 솔루션을 발견했다고 생각 합니다.

다음은 마술 예입니다. 예 : 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 */
}

부품 의 글꼴 크기를 변경할 때 글 머리 기호가 세로로 가운데에 오도록을 추가 display: flex;했습니다 . li:before
Arany

1

문서 헤드에 액세스하지 않고 LMS 내부에서 작업 margin-right: 20px하면서 이미지의 인라인 스타일로 더 쉽게 갈 수 있습니다. 내가이 사이트에 빚진 것 입니다 .


0

이 시도:

li{
    margin-left:5px;
}

왼쪽으로 이동하려면-## px 값을 입력하십시오.


0

또는 당신은 이것을 할 수 있습니다 :

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

그런 다음 li에서 모든 스타일을 제거하십시오.


1
ul을 플로팅하면 실제로 문제가 해결되지만 또 다른 문제가 발생합니다. ul 뒤에 오는 모든 단락 요소는 ul의 오른쪽으로 뜹니다.
superUntitled

나는 당신에게 +1을주었습니다 ... 나는 여기서 <p>가 <ul>의 오른쪽으로 떠 다니는이 질문과 관련된 링크를보고 가정했습니다. 잘 잡았습니다.
Reece


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

margin-left : auto는 요소 자체가 오른쪽 정렬되도록합니다. 원하는 요소의 높이와 너비를 설정하십시오-내 div의 배경 이미지입니다.





당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.