li 내부의 CSS 세로 정렬 텍스트


100

<li> 태그에서 생성 된 고정 높이와 너비가있는 행에 여러 상자를 표시하고 있습니다. 이제 텍스트를 세로 중앙에 정렬해야합니다. CSS vertical-align은 영향을 미치지 않습니다. 뭔가 빠진 것일까 요 ???

(여백, 패딩, 줄 높이)를 사용하는 트릭을 찾고 있지 않습니다. 일부 텍스트가 길고 두 줄로 나뉘 기 때문에 작동하지 않습니다.

실제 코드를 찾으십시오.

CSS 코드

ul.catBlock{
  width:960px; 
  height: 270px; 
  border:1px solid #ccc; 
}

ul.catBlock li{
  list-style: none; 
  float:left; 
  display:block; 
  text-align: center; 
  width:160px; 
  height: 100px;
}

ul.catBlock li a{ 
  display: block;  
  padding: 30px 10px 5px 10px; 
  height:60px;
}

HTML 코드

<ul class="catBlock">
 <li><a href="#">IP Phone</a></li>
 <li><a href="#">Dual SIM Switch Server</a></li>
 <li><a href="#">IP PBX</a></li>
</ul>

2
더 많은 정보를 제공해야 할 수도 있습니다. 상자가 같은 높이입니까? li의 상자 안에 텍스트를 정렬하고 있습니까? "텍스트가 길기 때문에 ... 두 줄"??? 스크린 샷 또는 바이올린이 도움이 될 수 있습니다.
KMC

1
방금 스크린 샷을 게시하려고했지만 내 계정이 새 계정이므로 허용되지 않습니다.
AK4668

답변:


100

와 부모 정의 display: table와 함께 요소 자체 vertical-align: middledisplay: table-cell.


4
디스플레이 테이블 / 테이블 셀 사용시 +1. 많은 사람들이 자신의 존재를 인식하지 못하는 것 같습니다.
powerbuoy 2011

5
이것은 W3CSchool에서 가져온 것입니다 ... 참고 : 값 "inline-table", "run-in", "table", "table-caption", "table-cell", "table-column", "table-column- group ","table-row ","table-row-group "및"inherit "는 IE7 및 이전 버전에서 지원되지 않습니다. IE8에는! DOCTYPE이 필요합니다. IE9는 값을 지원합니다.
AK4668

20
이 솔루션은 마진 효과를 완전히 차단하기 때문에 짜증납니다. 이것에 대한 유일한 해결책은 수많은 가상 요소를 만드는 것입니다. CSS가 왜 그렇게 많이 짜증나.
Muhammad Umer 2013 년

무엇에 대한 <li>하나의 행으로 점점 s는?
polkovnikov.ph 2015

1
또한 실제로 표 형식 데이터를 표시하지 않는 경우 CATO 접근성을 준수하지 않습니다.
Stevo Perisic 2015 년

59

line-height텍스트를 세로로 정렬하는 방법입니다. 그것은 꽤 표준이고 나는 그것을 "해킹"이라고 생각하지 않습니다. 그냥 추가 line-height: 100px하면 ul.catBlock li괜찮을 것입니다.

이 경우 ul.catBlock li a안에있는 모든 텍스트 lia. 이 작업을 할 때 이상한 일이 발생하는 것을 보았으므로 둘 다 시도하고 어떤 것이 작동하는지 확인하십시오.


21
처음에는 line-height를 사용했지만 내용이 길면 두 줄로 나뉘어 각 줄에 100px 간격을두고 더 나빠 보이게합니다. 다른 방법이 있습니까?
AK4668

2
나는 vertical-align: middle당신이 가지고 있다면 가질 방법이 있다고 생각 합니다 display: table-cell. 그래도 사용하지 않았습니다. 여기를보세요 : phrogz.net/css/vertical-align/index.html
로건 Serman에게

훌륭한 솔루션-나는 최소 높이와 동일하게 li 'line height'를 설정하고 텍스트는 수직으로 정렬됩니다. 적어도 육안 검사에 충분히 가깝습니다. 위의 '테이블'솔루션은 확실히 의미 론적이지 않으며 본질적으로 hackish입니다. 우리가 그렇게 할 때마다 반응 형 지형 어딘가에서 깨진 디스플레이 또는 기발한 행동의 가능성을 높이고 있습니다.
CodeFinity 2015 년

감사! <a> 요소에서 잘 작동합니다! 얼마나 간단한 해결책입니까 :-) 값을 수정하기 위해 조정하면 수직으로 완벽하게 중앙에 배치됩니다!
Asle

45

몇 년이 늦었을지 모르지만이 문제를 접한 사람은

li {
    display: flex;
    flex-direction: row;
    align-items: center;
}

flexbox에 대한 브라우저 지원은 @scottjoudry가 위에 그의 응답을 게시했을 때보 다 훨씬 낫지 만 훨씬 오래된 브라우저를 지원하려는 경우 접두사 또는 다른 옵션을 고려할 수 있습니다. 캐니 우스 : 플렉스


이 좋은 재생되지 않는 list-style-image크롬 - 이미지 사라집니다
Benjineer

1
나는 이것을 부트 스트랩 4 nav-item에서 사용했고 완벽하게 작동했습니다. 고마워.
010110110101

플렉스 박스 절약 라이브 항상
Arthur Medeiros

16

놀랍게도 (또는 그렇지 않은 경우)이 vertical-align도구는 실제로이 작업에 가장 적합합니다. 무엇보다도 자바 스크립트가 필요하지 않습니다.

다음 예제에서는 outer클래스를 본문 inner중간에 배치하고 outer클래스를 클래스 중간에 배치합니다 .

미리보기 : http://jsfiddle.net/tLkSV/513/

HTML :

<div id="container">
    <span></span><div class="outer">
        <span></span><div class="inner">

        </div>
    </div>
</div>

CSS :

html, body {
    height: 100%;
    margin: 0;
    padding: 0; }
#container {
    text-align: center;
    height: 100%; }
span { 
    height: 100%;
    vertical-align: middle;
    display: inline-block; }
.outer {
    width: 100px;
    height: 200px;
    padding: 0;
    border: 1px solid #000;
    vertical-align: middle;
    display: inline-block; }
.inner {
    background: red;
    width: 30px;
    height: 20px;    
    vertical-align: middle;
    display: inline-block; }

수직 정렬은 서로 옆에있는 요소의 중심을 정렬하여 작동합니다. 단일 요소에 수직 정렬을 적용해도 아무런 효과가 없습니다. 너비는 없지만 컨테이너의 높이 인 두 번째 요소를 추가하면 단일 요소가이 너비가없는 요소와 함께 세로 중앙으로 이동하여 세로 중앙에 배치됩니다. 유일한 요구 사항은 두 요소를 인라인 (또는 인라인 블록)으로 설정하고 vertical-align 속성을로 설정하는 것 vertical-align: middle입니다.

참고 : 아래의 내 코드에서 내 <span>태그와 <div>태그가 접촉 하고 있음을 알 수 있습니다 . 둘 다 인라인 요소이기 때문에 공백은 실제로 너비가없는 요소와 div 사이에 공백을 추가하므로 반드시 생략해야합니다.


1
환상적입니다. 내 분 명성 (15)해야하기 때문에 // 지금 당신의 대답을 투표 할 수 있습니다
AK4668

1
질문에 직접 적용되는이 기술을 찾는 분들을 위해 -jsfiddle.net/utGVt/385
Wex

15

앞으로이 문제는 flexbox로 해결 될 것입니다. 현재 브라우저 지원은 음울하지만 현재의 모든 브라우저에서 하나 또는 다른 형태로 지원됩니다.

브라우저 지원 : http://caniuse.com/flexbox

.vertically_aligned {

    /* older webkit */
    display: -webkit-box;
    -webkit-box-align: center;
    -webkit-justify-content: center;

    /* older firefox */
    display: -moz-box;
    -moz-box-align: center;
    -moz-box-pack: center;

    /* IE10*/
    display: -ms-flexbox;
    -ms-flex-align: center;
    -ms-flex-pack: center;

    /* newer webkit */
    display: -webkit-flex;
    -webkit-align-items: center;
    -webkit-box-pack: center;

    /* Standard Form - IE 11+, FF 22+, Chrome 29+, Opera 17+ */
    display: flex;
    align-items: center;
    justify-content: center;
}

Flexbox에 대한 배경 정보 : http://css-tricks.com/snippets/css/a-guide-to-flexbox/


1
이 질문을 받았을 당시에는 이것이 좋은 대답이 아닐지 모르겠지만 오늘 우리는 ~ 95 % 접두사 지원을 보고 있으므로 이것이 실행 가능한 옵션이라고 생각합니다.
Wex

<li> 요소가 축소되는 대신 래핑되도록하려면 flex-wrap : wrap; <ul> 수준
Thierry

이 클래스도 어떤 요소를 추가합니까?
Matt M.

6

코드 나 예제를 제공하지 않는 Asaf의 답변을 제외하고 여기에 제공된 완벽한 답변이 없으므로 내 기여를하고 싶습니다 ...

메이크업의에 중위 vertical-align: middle;작업, 당신은 사용할 필요가 display: table;당신을 위해 ul요소 display: table-cell;에 대한 li요소 및 사용할 수있는 것보다 vertical-align: middle;위해 li요소.

당신은 어떤 명시를 제공 할 필요가 없습니다 margins, paddings당신의 텍스트를 수직으로 중간 만들 수 있습니다.

데모

ul.catBlock{
    display: table;
    width:960px; 
    height: 270px; 
    border:1px solid #ccc; 
}

ul.catBlock li {
    list-style: none;
    display: table-cell; 
    text-align: center; 
    width:160px; 
    vertical-align: middle;
}

ul.catBlock li a { 
    display: block;
}

이것이 도움이되지 않습니다. 수직으로 정렬 된 유일한 이유는 a 태그에 패딩을 사용하여 강제로 내리기 때문입니다
str11

@Mr. Alien이 솔루션의 유일한 문제는 마진 규칙이 무시된다는 것입니다.
Thomas

4

여기에 설명 된대로 : https://css-tricks.com/centering-in-the-unknown/ .

실제 사례에서 테스트 한 것처럼 가장 안정적이고 우아한 솔루션은 <li />첫 번째 자식으로 요소에 일관된 인라인 요소를 삽입하는 것입니다.이 요소는 높이를 100 % (부모 높이의 <li />)로 vertical-align설정하고 중간 으로 설정해야합니다. . 이를 위해를 넣을 수 <span />있지만 가장 편리한 방법은 li:after의사 클래스 를 사용하는 것입니다 .

스크린 샷 : 여기에 이미지 설명 입력

ul.menu-horizontal {
    list-style-type: none;
    margin: 0;
    padding: 0;
    display: inline-block;
    vertical-align: middle;
}

ul.menu-horizontal:after {
    content: '';
    clear: both;
    float: none;
    display: block;
}

ul.menu-horizontal li {
    padding: 5px 10px;
    box-sizing: border-box;
    height: 100%;
    cursor: pointer;
    display: inline-block;
    vertical-align: middle;
    float: left;
}

/* The magic happens here! */
ul.menu-horizontal li:before {
    content: '';
    display: inline;
    height: 100%;
    vertical-align: middle;
}

1

이 솔루션을 사용해보십시오

대부분의 경우 가장 잘 작동합니다.

당신은 사용 할 수 있습니다 DIV 대신 리튬 그것을 위해

.DivParent {
    height: 100px;
    border: 1px solid lime;
    white-space: nowrap;
}
.verticallyAlignedDiv {
    display: inline-block;
    vertical-align: middle;
    white-space: normal;
}
.DivHelper {
    display: inline-block;
    vertical-align: middle;
    height:100%;
}
<div class="DivParent">
    <div class="verticallyAlignedDiv">
        <p>Isnt it good!</p>
     
    </div><div class="DivHelper"></div>
</div>


1
수직 정렬에 divHelper가 필요한 이유는 무엇입니까? 나는 다른 주제에 그것을보고하지만 .. 다른 사업부하지 않고 그것을 자기 정렬되지 않는 이유를 이해할 수 없다
사샤 키리코에게

0

수직 정렬 중간에 대한 간단한 솔루션 ... 나에게는 매력처럼 작동합니다.

ul{display:table; text-align:center; margin:0 auto;}
li{display:inline-block; text-align:center;}
li.items_inside_li{display:inline-block; vertical-align:middle;}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.