CSS căn chỉnh theo chiều dọc các div nổi


89

Tôi có một div (#wrapper) chứa 2 div đứng cạnh nhau.

Tôi muốn div bên phải được căn chỉnh theo chiều dọc. Tôi đã thử vertical-align: middle trên trình bao bọc chính của mình nhưng nó không hoạt động. Nó đang khiến tôi phát điên!

Hy vọng ai đó có thể giúp đỡ.

http://cssdesk.com/LWFhW

HTML:

<div id="wrapper">
  <div id="left-div">
    <ul>
      <li>One</li>
      <li>Two</li>
    </ul>
  </div>  
  <div id="right-div">
    Here some text...
  </div>
</div>

CSS:

#wrapper{
  width:400px;
  float:left;
  height:auto;
  border:1px solid purple;}

#left-div{
  width:40px;
  border:1px solid blue;
  float:left;}

#right-div{
  width:350px;
  border:1px solid red;
  float:left;}

ul{
  list-style-type: none;
  padding:0;
  margin:0;}

Câu trả lời:


67

Bạn không gặp may với các yếu tố trôi nổi. Họ không tuân theo căn chỉnh dọc,

bạn cần, display:inline-blockthay vào đó:

http://cssdesk.com/2VMg8

CHĂM SÓC


Hãy cẩn thận display: inline-block;vì nó diễn giải khoảng trắng giữa các phần tử là khoảng trắng thực. Nó không bỏ qua nó như display: blockkhông.

Tôi đề nghị điều này:

Đặt font-sizephần tử chứa thành 0(không) và đặt lại thành font-sizegiá trị cần thiết của bạn trong các phần tử như vậy

ul {
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: 0;
}
ul > li {
    font-size: 12px;
}

Xem trình diễn ở đây: http://codepen.io/HerrSerker/pen/mslay


CSS

#wrapper{
  width:400px;
  height:auto;
  border:1px solid green;
  vertical-align: middle;
  font-size: 0;
}

#left-div{
  width:40px;
  border:1px solid blue;
  display: inline-block;
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}

#right-div{
  width:336px;
  border:1px solid red;
  display: inline-block;  
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}
  

Điều này sẽ không hoạt động nếu chiều cao #wrapper được cố định. # Right-div được căn giữa so với # left-div , không liên quan đến phần tử trình bao bọc. ( inline-blocklàm cho nó hoạt động như một nội tuyến imgalignthuộc tính được đặt)
Costa

@Costa Đó là cách nên làm, tôi nghĩ vậy.
yunzen

Nó không quan trọng theo cách nào, có nhiều trường hợp bạn PHẢI sử dụng một phần tử nổi, và luôn có cách để thực hiện những thứ trong CSS. luôn luôn. trong trường hợp đơn giản nhất, một vertical-align của văn bản nổi: jsbin.com/UWeB/1/edit
vsync

11
nhưng giải pháp của bạn cũng sẽ không hoạt động, bởi vì bạn không thể quyết định KHÔNG sử dụng phao ... toàn bộ vấn đề là bằng cách nào đó căn chỉnh theo chiều dọc trong khi sử dụng phao.
vsync

2
Tất cả quan điểm của tôi là đôi khi khối nội tuyến không phải là một tùy chọn và đưa ra một trường hợp sử dụng để giúp những người khác có thể truy cập trang này từ Google. Không cần phải thô lỗ.
Jamie Barker

21

Bạn có thể làm điều này khá dễ dàng với bảng hiển thị và ô bảng hiển thị.

#wrapper {
    width: 400px;
    float: left;
    height: auto;
    display: table;
    border: 1px solid green;
}

#right-div {
    width: 356px;
    border: 1px solid red;
    display: table-cell;
    vertical-align: middle;
}

CHỈNH SỬA: Trên thực tế đã nhanh chóng lộn xộn trên CSS Desk cho bạn - http://cssdesk.com/RXghg

CHỈNH SỬA KHÁC: Sử dụng Flexbox. Điều này sẽ hoạt động nhưng nó khá lỗi thời - http://www.cssdesk.com/davf5

#wrapper {
    display: flex;
    align-items: center;
    border:1px solid green;
}

#left-div {
    border:1px solid blue;
}

#right-div {
    border:1px solid red;
}

1
Xin chào SpaceBeers. Đề xuất của bạn không hiệu quả với tôi vì tôi đang ẩn phần tràn bên phải div (tôi vừa thêm mã vào css table). Với giải pháp của bạn, phần tràn không bị ẩn, div mở rộng chiều rộng của nó ...
Marc

11

Tôi nhận ra đây là một câu hỏi cổ hủ tuy nhiên tôi nghĩ sẽ hữu ích nếu đăng một giải pháp cho vấn đề căn chỉnh theo chiều dọc nổi.

Bằng cách tạo một trình bao bọc xung quanh nội dung bạn muốn nổi, sau đó bạn có thể sử dụng bộ chọn :: after hoặc :: before giả để căn chỉnh theo chiều dọc nội dung của bạn trong trình bao bọc. Bạn có thể điều chỉnh kích thước của nội dung đó tất cả những gì bạn muốn mà không ảnh hưởng đến việc căn chỉnh. Trở ngại duy nhất là các wrapper phải lấp đầy 100% chiều cao của chứa.

http://jsfiddle.net/jmdrury/J53SJ/

HTML

<div class="container">
    <span class="floater">
        <span class="centered">floated</span>
    </span>
    <h1>some text</h1>
</div>

CSS

div {
    border:1px solid red;
    height:100px;
    width:100%;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.floater {
    float:right;
    display:inline-block;
    height:100%;
    box-sizing: border-box;
}
.centered {
    border:1px solid blue;
    height: 30px;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
h1 {
    margin:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.container:after, .floater:after, .centered:after, h1:after {
    height:100%;
    content:'';
    font-size:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}

Tôi không chắc bạn đang làm gì, nhưng sau khi xóa centeredlớp và dọn dẹp nhiều thứ thừa từ CSS đó, nó vẫn căn chỉnh theo chiều dọc tốt, chỉ với (xin lỗi về việc mất định dạng! ...):div { border:1px solid red; height:100px; } .floater { float:right; height:100%; } h1 { vertical-align:middle; } .container:after, .floater:after, .centered:after { height:100%; content:''; font-size:0; vertical-align:middle; display:inline-block; }
Sz.


2

Tôi cố gắng hết sức để tránh sử dụng phao ... nhưng - khi cần, tôi căn chỉnh theo chiều dọc ở giữa bằng các dòng sau:

position: relative;
top: 50%;
transform: translateY(-50%);

-1

Sự sụp đổ duy nhất của các sửa đổi của tôi là bạn có chiều cao div đã đặt ... Tôi không biết đó có phải là vấn đề với bạn hay không.

http://cssdesk.com/kyPhC


1
Xin chào Sean. Cảm ơn, nhưng tôi đang cố gắng sử dụng một giải pháp linh hoạt và do đó hy vọng để tránh những loại dung dịch ...
Marc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.