특정`inline-block` 항목 앞 / 뒤에 줄 바꿈하기위한 CSS


202

이 HTML이 있다고 가정 해 봅시다.

<h3>Features</h3>
<ul>
    <li><img src="alphaball.png">Smells Good</li>
    <li><img src="alphaball.png">Tastes Great</li>
    <li><img src="alphaball.png">Delicious</li>
    <li><img src="alphaball.png">Wholesome</li>
    <li><img src="alphaball.png">Eats Children</li>
    <li><img src="alphaball.png">Yo' Mama</li>
</ul>

이 CSS는 :

li { text-align:center; display:inline-block; padding:0.1em 1em }
img { width:64px; display:block; margin:0 auto }

결과는 여기에서 볼 수 있습니다 : http://jsfiddle.net/YMN7U/1/

이제 이것을 세 열로 나누고 싶다고 상상해보십시오. 세 번째 열 <br>뒤에 a를 주입하는 것과 같습니다 <li>. (실제로 그렇게하는 것은 의미 적으로나 구문 적으로 유효하지 않습니다.)

<li>CSS 에서 세 번째를 선택하는 방법을 알고 있지만 그 후에 줄 바꿈을 어떻게 적용합니까? 작동하지 않습니다.

li:nth-child(4):after { content:"xxx"; display:block }

또한이 특정 경우 float대신을 사용하여 가능하다는 것을 알고 inline-block있지만를 사용하는 솔루션에는 관심이 없습니다 float. 또한 고정 너비 블록의 경우 부모의 너비를 ul해당 너비의 약 3 배로 설정하면 가능합니다 . 이 솔루션에 관심이 없습니다. 또한 display:table-cell실제 열을 원할 경우 사용할 수 있다는 것도 알고 있습니다. 이 솔루션에 관심이 없습니다. 인라인 내용 내부에서 중단을 일으킬 가능성에 관심이 있습니다.

편집 : 분명히, 나는 특정 문제에 대한 해결책이 아니라 '이론'에 관심이 있습니다. CSS가 display:inline(-block)?요소 중간에 줄 바꿈을 삽입 할 수 있습니까 , 아니면 불가능합니까? 그것이 불가능하다고 확신한다면, 그것은 받아 들일만한 대답입니다.


2
첫 번째 셋과 두 번째 셋을 두 개의 다른 목록에 넣습니까? 나는 당신이 이것을하고 싶지 않다고 가정하지만, 나는 그것을 거기에 버릴 것이라고 생각했습니다.
JakeParis

누군가가 최고의 방법을 추천 할 수 있도록 실제로 달성하려는 것을 알려 주어야합니다. 제외 된 모든 옵션은 문제를 해결하기 위해 존재하는데 왜 다른 솔루션이 필요한가요?
Jake

4
@Jake 사실 의미의 요소 목록을 사용하고 특정 요소를 래핑하고 싶었습니다. 실제로 컨테이너의 너비를 설정했지만 항목의 너비가 동일하고 일관된 가장자리로 감싸기를 원했기 때문에 특정 경우에만 작동합니다. 항상 그런 것은 아닙니다. 내가 "실제로 달성하려는" 것은 CSS가 인라인 흐름 중간에 줄 바꿈을 강제 할 수 있는지 여부를 배우는 것입니다. "정확히 불가능합니다"라는 자신감있는 답변 은 수용 가능합니다 (올 바르면).
Phrogz

답변:


302

인라인 LI 요소에서 작동하도록 만들 수있었습니다. 불행히도 LI 요소가 인라인 블록이면 작동하지 않습니다.

라이브 데모 : http://jsfiddle.net/dWkdp/

또는 절벽 노트 버전 :

li { 
     display: inline; 
}
li:nth-child(3):after { 
     content: "\A";
     white-space: pre; 
}

2
"\ A"가 인쇄되지 않는 이유는 무엇입니까? 내가 시도한 모든 것은 :after항상 직선 텍스트로 인쇄됩니다.
JakeParis

12
@JMCCreative ASCII 0x0A, 일명 LF (줄 바꿈) 문자입니다. 참조 w3.org/TR/CSS2/syndata.html#strings을
Phrogz

5
@JMC \A는 줄 바꿈 문자입니다 ... 탈출입니다
Šime Vidas


18
몇 달에 한 번씩이 질문에 계속 돌아와서 여기에 주석을 달았습니다 ... 인라인 컨텍스트 내에서 블록 컨테이너처럼 작동하는 줄 바꿈을 추가하기 때문에 인라인 블록에서 작동하지 않습니다. <li> 사이에 줄 바꿈을 삽입하여 컨텍스트를 벗어날 수 있으면 작동합니다. 반응 형 디자인 중단 점에 유용하므로 부끄러운 일입니다. 나는 목록에 대한 인라인 블록만큼이나 유용 시간 "인라인"대부분의 추측
user1010892

21

문제에 대한 많은 "솔루션"에 관심이 없습니다. 나는 당신이하고 싶은 일을 실제로 할 수있는 좋은 방법이 없다고 생각합니다. 아무것도 당신은 사용하여 삽입 :after하고 content그냥 거기에 스스로를 쓴 경우 짓을하는 것과 같은 구문과 의미 론적 타당성을 가지고있다.

CSS는 작업을 제공합니다. 언급 한 것처럼 lis를 플로팅 한 다음 clear: left새 줄을 시작하려는 경우 :

예를 참조하십시오 : http://jsfiddle.net/marcuswhybrow/YMN7U/5/


18
OP는 솔루션에 관심이 없습니다 :)
Šime Vidas

2
:after이미 사용할 수있는 도구가 있으므로 구문 을 사용하여 수행 할 수있는 작업 은 구문 적으로 유효하거나 좋은 아이디어가 아닙니다 . 따라서 대답입니다.
Marcus Whybrow

32
float를 사용하지 않는 한 가지 이유는와 같은 것이 없기 때문입니다 float: center.
눈꺼풀이

7
플러스 인라인 블록을 사용하면 플로팅 할 수없는 모든 종류의 수직 정렬이 가능합니다
user1010892

20
": after 및 content를 사용하여 삽입하는 모든 내용은 구문과 의미가 정확히 동일합니다."-파티에 늦었지만, 나는 이것에 완전히 동의하지 않습니다. HTML의 의미 적 의미를 방해하지 않습니다.
Rupert

4

html을 다시 쓸 수 있으면을 <ul>안에 중첩 <ul>시키고 내부 <li>를 인라인 블록으로 표시 할 수 있습니다 . 그룹화도 html에 반영되므로 의미 적으로 IMHO가 의미가 있습니다.


<ul>
    <li>
        <ul>
            <li>Item 1</li>
            <li>Item 2</li>
            <li>Item 3</li>
        </ul>
    </li>
    <li>
        <ul>
            <li>Item 4</li>
            <li>Item 5</li>
            <li>Item 6</li>
        </ul>
    </li>
</ul>

li li { display:inline-block; }

데모

$(function() { $('img').attr('src', 'http://phrogz.net/tmp/alphaball.png'); });
h3 {
  border-bottom: 1px solid #ccc;
  font-family: sans-serif;
  font-weight: bold;
}
ul {
  margin: 0.5em auto;
  list-style-type: none;
}
li li {
  text-align: center;
  display: inline-block;
  padding: 0.1em 1em;
}
img {
  width: 64px;
  display: block;
  margin: 0 auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h3>Features</h3>
<ul>
  <li>
    <ul>
      <li><img />Smells Good</li>
      <li><img />Tastes Great</li>
      <li><img />Delicious</li>
    </ul>
  </li>
  <li>
    <ul>
      <li><img />Wholesome</li>
      <li><img />Eats Children</li>
      <li><img />Yo' Mama</li>
    </ul>
  </li>
</ul>


3

목록을 행으로 나누는 쉬운 방법은 개별 목록 항목을 플로팅 한 다음 다음 행으로 이동하려는 항목을 플로트에서 지울 수 있습니다.

예를 들어

<li style="float: left; display: inline-block"></li>
<li style="float: left; display: inline-block"></li>
<li style="float: left; display: inline-block"></li>

<li style="float: left; display: inline-block; clear: both"></li> --- this will start on a new line
<li style="float: left; display: inline-block"></li>
<li style="float: left; display: inline-block"></li>

17
float설정 이 설정보다 우선합니다 inline-block. 그들은 함께 공존하지 않습니다
Itay

4
텍스트 정렬을 사용하는 경우 : center; 그것은 작동하지 않습니다 (휴식 부동 IT)
Павел Иванов

3

나는 당신이 수레를 사용하고 싶지 않았고 질문은 단지 이론이라는 것을 알고 있지만 누군가가 이것이 유용하다고 생각하는 경우 여기에 수레를 사용하는 해결책이 있습니다.

li플로팅하려는 요소 에 왼쪽 클래스를 추가하십시오 .

<li class="left"><img src="http://phrogz.net/tmp/alphaball.png">Smells Good</li>

다음과 같이 CSS를 수정하십시오.

li { text-align:center; float: left; clear: left; padding:0.1em 1em }
.left {float: left; clear: none;}

http://jsfiddle.net/chut319/xJ3pe/

너비 또는 인라인 블록을 지정할 필요가 없으며 IE6까지 거슬러 올라갑니다.


1

행의 첫 번째 인라인 요소에 대한 :: before 선택기를 만들고 행을 약간 분리하기 위해 위쪽 또는 아래쪽 여백이있는 블록을 선택 자로 만들었습니다.

.1st_item::before
{
  content:"";
  display:block;
  margin-top: 5px;
}

.1st_item
{
  color:orange;
  font-weight: bold;
  margin-right: 1em;
}

.2nd_item
{
  color: blue;
}

-1

페이지를 렌더링하는 방법에 따라 작동하는지 확인하십시오. 그러나 순서가없는 새로운 목록을 시작하는 것은 어떻습니까?

<ul>
<li>
<li>
<li>
</ul>
<!-- start a new ul to line break it -->
<ul>


-2

더 나은 솔루션은 -webkit-columns : 2;

http://jsfiddle.net/YMN7U/889/

 ul { margin:0.5em auto;
-webkit-columns:2;
}

일부 사용 사례의 경우 이는 합리적인 솔루션 일 수 있습니다. 이 경우 콘텐츠를 완전히 재정렬하여 가로로 놓지 않고 아래로 내려 가기 때문에 좋은 해결책이 아닙니다.
Phrogz

5
소수의 브라우저에서만 작동하는 웹 응용 프로그램을 만들고 싶은 사람은 누구입니까?
user2867288

-3

어쩌면 CSS만으로는 가능하지만 부모의 키를 방해하기 때문에 가능한 한 "float"를 피하는 것이 좋습니다.

jQuery를 사용하는 경우, "N"요소 만 랩핑 한 다음 루프를 사용하여 다음 "N"요소를 분리하고 랩핑한다는 점을 제외하면`wrapAll`과 유사한 간단한`wrapN` 플러그인을 작성할 수 있습니다. 그런 다음 래퍼 클래스를`display : block;`으로 설정하십시오.

(function ($) {
    $.fn.wrapN = function (wrapper, n, start) {
        if (wrapper === undefined || n === undefined) return false;
        if (start === undefined) start = 0;
        for (var i = start; i < $(this).size(); i += n)
           $(this).slice(i, i + n).wrapAll(wrapper);
        return this;
    };
}(jQuery));

$(document).ready(function () {
    $("li").wrapN("<span class='break' />", 3);
});

완성 된 제품의 JSFiddle은 다음과 같습니다.

http://jsfiddle.net/dustinpoissant/L79ahLoz/

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