CSS hai div nằm cạnh nhau


230

Tôi muốn đặt hai <div>s cạnh nhau. Bên phải <div>là khoảng 200px; và bên trái <div>phải lấp đầy phần còn lại của chiều rộng màn hình? Tôi có thể làm cái này như thế nào?

Câu trả lời:


421

Bạn có thể sử dụng flexbox để bố trí các mục của bạn:

#parent {
  display: flex;
}
#narrow {
  width: 200px;
  background: lightblue;
  /* Just so it's visible */
}
#wide {
  flex: 1;
  /* Grow to rest of container */
  background: lightgreen;
  /* Just so it's visible */
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>

Điều này về cơ bản chỉ là cạo bề mặt của flexbox. Flexbox có thể làm những điều khá tuyệt vời.


Để hỗ trợ trình duyệt cũ hơn, bạn có thể sử dụng CSS float và thuộc tính chiều rộng để giải quyết nó.

#narrow {
  float: right;
  width: 200px;
  background: lightblue;
}
#wide {
  float: left;
  width: calc(100% - 200px);
  background: lightgreen;
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>


14
Đây thực sự là câu trả lời chính xác, ngắn gọn và - không giống như hai câu hỏi hiện tại - hoàn toàn khép kín. Câu trả lời tốt nhất về SO nên như thế này, IMO. +1
Bobby Jack

Quan tâm để giải thích tại sao bên trái cần phải được float:left? Nhận xét của bạn cho câu trả lời của tôi nói rằng 'div lft được yêu cầu mở rộng tất cả các khu vực bên trái', nhưng float:leftsẽ khiến nó bao bọc nội dung chặt chẽ.
falstro

14
Câu trả lời này không hoàn toàn chính xác và thật khó chịu khi thấy nó được nâng cấp rất nhiều. Điều này tạo ra một bố cục rất không ổn định. Tôi sẽ khuyên bạn nên đặt hai div vào một thùng chứa và sử dụng thuộc tính display: inline-block để có các div phù hợp, như một số câu trả lời khác đã đề xuất. Tôi không chỉ trích bất cứ ai, vì tất cả chúng ta đều ở đây để giúp đỡ lẫn nhau, vì vậy bên cạnh việc chọn nit của tôi, cảm ơn bạn vì những đóng góp của bạn cho cộng đồng này.
Mussser

1
NHƯNG một điều cần lưu ý là khối nội tuyến sẽ không hoạt động trong các phiên bản IE cũ hơn ...
Mussser 17/07/14

3
@Mussser Tôi đồng ý với nhận xét của bạn nhưng hãy nhớ câu trả lời này có từ năm 2009 ... thời điểm mà bạn gọi là "phiên bản cũ hơn của Ie" (tức là: IE8 trở xuống) là phiên bản "hiện tại" của IE ...
Laurent S.

139

Tôi không biết liệu đây có còn là vấn đề hiện tại hay không nhưng tôi chỉ gặp phải vấn đề tương tự và sử dụng display: inline-block;thẻ CSS . Gói chúng trong một div để chúng có thể được định vị thích hợp.

<div>
    <div style="display: inline-block;">Content1</div>
    <div style="display: inline-block;">Content2</div>
</div>

Lưu ý rằng việc sử dụng thuộc tính kiểu nội tuyến chỉ được sử dụng cho tính ngắn gọn của ví dụ này, tất nhiên những thứ này được sử dụng sẽ được chuyển sang tệp CSS bên ngoài.


1
Đây là giải pháp cho tôi. Tôi muốn có hai div liền kề như [] [] (người đàn ông đã lâu rồi kể từ khi tôi làm điều này ..) =) kudos.
Partack

Điều này cũng làm việc cho tôi. Tôi đã gặp một số vấn đề với một float khác: div div phải đẩy cột bên phải của tôi xuống bên dưới bên trái, vì vậy tôi cũng làm cho container sử dụng hiển thị: block-inline, và điều đó đã giải quyết nó.
Martin Carney

5
Điều này không hoạt động khi nội dung lớn trong Content1 DIV. Kết quả là các DIV nằm trên hai đường riêng biệt thay vì cạnh nhau.
Richard Hollis

@RichardHollis Tôi đã có thể đặt thuộc widthtính của tất cả 2 div của mình cạnh nhau để ngăn không cho gói thứ hai vào một dòng mới.
Trindaz

1
thêm css dọc-align: top; cả hai cũng vậy, họ sẽ đẩy nhau xuống nếu độ dài nội dung khác nhau
tìm kiếm

27

Thật không may, đây không phải là một điều nhỏ nhặt để giải quyết cho trường hợp chung. Cách dễ nhất là thêm thuộc tính kiểu css "float: right;" tuy nhiên, với div 200px của bạn, điều này cũng sẽ khiến "chính" của bạn thực sự có chiều rộng đầy đủ và bất kỳ văn bản nào trong đó sẽ nổi xung quanh cạnh của 200px-div, thường trông lạ, tùy thuộc vào nội dung (khá nhiều trong mọi trường hợp ngoại trừ nếu đó là một hình ảnh nổi).

EDIT: Theo đề xuất của Dom, tất nhiên vấn đề bao bọc có thể được giải quyết bằng một lề. Tôi thật ngốc.


1
'float: left' sẽ phù hợp hơn, div lft được yêu cầu mở rộng tất cả các khu vực bên trái. Không có ý xúc phạm, chỉ cần xem xét.
MN

19

Phương thức được đề xuất bởi @roe và @MohitNanda hoạt động, nhưng nếu div đúng được đặt là float:right;, thì nó phải xuất hiện đầu tiên trong nguồn HTML. Điều này phá vỡ thứ tự đọc từ trái sang phải, có thể gây nhầm lẫn nếu trang được hiển thị với các kiểu bị tắt. Nếu đó là trường hợp, tốt hơn là sử dụng div trình bao bọc và định vị tuyệt đối:

<div id="wrap" style="position:relative;">
    <div id="left" style="margin-right:201px;border:1px solid red;">left</div>
    <div id="right" style="position:absolute;width:200px;right:0;top:0;border:1px solid blue;">right</div>
</div>

Chứng minh:

trái phải

Chỉnh sửa: Hmm, thú vị. Cửa sổ xem trước hiển thị các div được định dạng chính xác, nhưng mục bài đăng được hiển thị thì không. Xin lỗi sau đó, bạn sẽ phải tự mình thử nó.


15

Tôi gặp vấn đề này ngày hôm nay. Dựa trên các giải pháp trên, điều này làm việc cho tôi:

<div style="width:100%;"> 
    <div style="float:left;">Content left div</div> 
    <div style="float:right;">Content right div</div> 
</div> 

Đơn giản chỉ cần làm cho div cha mở rộng toàn bộ chiều rộng và thả nổi các div có trong đó.


8

CẬP NHẬT

Nếu bạn cần đặt các phần tử liên tiếp, bạn có thể sử dụng Bố cục Flex . Ở đây bạn có một hướng dẫn Flex khác . Đây là một công cụ CSS tuyệt vời và mặc dù nó không tương thích 100%, mỗi ngày sự hỗ trợ của nó ngày càng tốt hơn. Điều này hoạt động đơn giản như:

HTML

<div class="container">
    <div class="contentA"></div>
    <div class="contentB"></div>
</div>

CSS

.container {
    display: flex;
    width: 100%;
    height: 200px;
}

.contentA {
    flex: 1;
}

.contentB {
    flex: 3;
}

Và những gì bạn nhận được ở đây là một container có tổng kích thước 4 đơn vị, chia sẻ không gian với các con của nó trong mối quan hệ là 1/4 và 3/4.

Tôi đã thực hiện một ví dụ trong CodePen giải quyết vấn đề của bạn. Tôi hy vọng nó sẽ giúp.

http://codepen.io/timbergus/pen/aOoQLR?editors=110

RẤT GIÀ

Có thể đây chỉ là một điều vô nghĩa, nhưng bạn đã thử với một cái bàn chưa? Nó không sử dụng CSS trực tiếp để định vị các div, nhưng nó hoạt động tốt.

Bạn có thể tạo một bảng 1x2 và đặt divsbên trong của bạn , sau đó định dạng bảng bằng CSS để đặt chúng theo ý muốn:

<table>
  <tr>
    <td>
      <div></div>
    </td>
    <td>
      <div></div>
    </td>
  </tr>
</table>

Ghi chú

Nếu bạn muốn tránh sử dụng bảng, như đã nói, bạn có thể sử dụng float: left;float: right;và trong các yếu tố sau đây, đừng quên thêm một clear: left;, clear: right;hoặc clear: both;để có vị trí làm sạch.


Bảng là một giải pháp dễ dự đoán hơn nhiều so với "float" luôn thay đổi, dường như luôn làm rối tung thứ gì đó khi bạn thêm hoặc xóa các phần tử.
Kokodoko

Đây là một giải pháp tốt nếu bạn đang làm việc với email.
Zac Clancy

6
div1 {
    float: right;
} 
div2 {
    float: left;
}

Điều này sẽ hoạt động tốt miễn là bạn đặt clear: bothcho phần tử tách hai khối cột này.


3
Khi sử dụng phao, bạn phải đặt thuộc tính chiều rộng. Vì vậy, tôi không nghĩ rằng đây là một giải pháp tốt ..
Martijn

4

Tôi gặp vấn đề tương tự và phiên bản Mohits hoạt động. Nếu bạn muốn giữ thứ tự bên trái của bạn trong html, chỉ cần thử điều này. Trong trường hợp của tôi, div bên trái đang điều chỉnh kích thước, div bên phải giữ ở chiều rộng 260px.

HTML

<div class="box">
<div class="left">Hello</div>
<div class="right">World</div>
</div>

CSS

.box {
    height: 200px;
    padding-right: 260px;
}    

.box .left {
    float: left;
    height: 200px;
    width: 100%;
}

.box .right {
    height: 200px;
    width: 260px;
    margin-right: -260px;
}

Mẹo nhỏ là sử dụng một miếng đệm bên phải trên hộp chính nhưng sử dụng lại khoảng trống đó bằng cách đặt lại hộp bên phải với lề phải.


Tôi không làm việc mà không nổi: ngay trong .right.
Jussi Palo

3

Tôi sử dụng hỗn hợp float và overflow-x: hidden. Mã tối thiểu, luôn hoạt động.

https://jsfiddle.net/9934sc4d/4/ - CỘNG VỚI bạn không cần phải xóa phao của bạn!

.left-half{
    width:200px;
    float:left;
}
.right-half{
    overflow-x:hidden;
}

1
Rất hữu ích khi bạn biết chiều cao của div và bạn biết nội dung không dài hơn chiều cao này. Tuy nhiên, khi có nhiều nội dung hơn chiều cao của div, nó bị ẩn đi, vì tràn ...
Martijn

1
Điều đó thực sự tốt hơn :)
Martijn

1
Đẹp! thật tốt khi thấy mọi người cho ăn ủng hộ với phản hồi hữu ích và tích cực, thay vì phản hồi tiêu cực không có kết cấu. Người đàn ông tốt @Martijn
Tony Ray Tansley

Cảm ơn vì điều này. Tôi thực hiện hầu hết các giao diện người dùng của mình trong React Native và hộp flex hoạt động tốt hơn nhiều so với HTML + CSS (theo ý kiến ​​của tôi). Điều này làm cho cuộc sống của tôi dễ dàng hơn nhiều.
Eric Wiener

2

Như mọi người đã chỉ ra, bạn sẽ làm điều này bằng cách đặt float:right;nội dung RHS và lề âm trên LHS.

Tuy nhiên .. nếu bạn không sử dụng float: left;LHS (như Mohit) thì bạn sẽ có được hiệu ứng bước vì div LHS vẫn sẽ sử dụng không gian lề trong bố cục.

Tuy nhiên .. float LHS sẽ thu nhỏ nội dung, vì vậy bạn sẽ cần chèn mã con có chiều rộng xác định nếu điều đó không được chấp nhận, tại thời điểm đó bạn cũng có thể đã xác định chiều rộng trên cha mẹ.

Tuy nhiên .. như David chỉ ra, bạn có thể thay đổi thứ tự đọc của đánh dấu để tránh yêu cầu thả nổi LHS, nhưng điều đó có khả năng đọc và có thể là các vấn đề về khả năng truy cập.

Tuy nhiên .. vấn đề này có thể được giải quyết với các số float được đánh dấu bổ sung

(báo trước: Tôi không tán thành div .clear trong ví dụ đó, xem tại đây để biết chi tiết)

Tất cả mọi thứ được xem xét, tôi nghĩ rằng hầu hết chúng ta đều mong muốn có một chiều rộng không tham lam: còn lại trong CSS3 ...


2

Đây không phải là câu trả lời cho tất cả mọi người, vì nó không được hỗ trợ trong IE7-, nhưng bạn có thể sử dụng nó và sau đó sử dụng câu trả lời thay thế cho IE7-. Nó được hiển thị: bảng, hiển thị: bảng-hàng và hiển thị: bảng-ô. Lưu ý rằng điều này không sử dụng các bảng để bố trí, nhưng tạo kiểu cho các div sao cho mọi thứ thẳng hàng với tất cả các rắc rối từ phía trên. Của tôi là một ứng dụng html5, vì vậy nó hoạt động rất tốt.

Bài viết này cho thấy một ví dụ: http://www.sitepoint.com/table-basing-layout-is-the-next-big-thing/

Đây là bản định kiểu của bạn sẽ như thế nào:

 .container {
    display: table;
    width:100%;
 }

 .left-column {
    display: table-cell;
 }

 .right-column {
    display: table-cell;
    width: 200px;
 }

-1

Để diễn giải một trong những trang web của tôi có nội dung tương tự:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <style TYPE="text/css"><!--

.section {
    _float: right; 
    margin-right: 210px;
    _margin-right: 10px;
    _width: expression( (document.body.clientWidth - 250) + "px");
}

.navbar {
    margin: 10px 0;
    float: right;
    width: 200px;
    padding: 9pt 0;
}

  --></style>
 </head>
 <body>
  <div class="navbar">
  This will take up the right hand side
  </div>
  <div class="section">
  This will fill go to the left of the "navbar" div
  </div>
 </body>
</html>

4
Không phải tôi, nhưng tôi đoán các hack CSS, loại tài liệu chuyển tiếp hoặc thiếu giải thích?
annakata

Ít nhất là nó có một loại tài liệu :) Tôi đoán có thể mọi người không thích các trình duyệt hack cho lề trên IE. Ít nhất là tôi đã thử nó ...
Rowland Shaw

Thật quá đáng. Có rất nhiều giải pháp hiện có mà ngắn gọn hơn nhiều.
John Bell

@JohnBell có thể đó là vấn đề với thời gian - đó là một giải pháp hợp lý vào thời điểm đó (hơn 8 năm trước), nhưng công nghệ trình duyệt đã phát triển từ đó. Wierdly một số câu trả lời khác hiện đại với tôi đề xuất ý tưởng tương tự đã ghi điểm tốt hơn (chẳng hạn như David, hai phút sau của tôi)
Rowland Shaw

-7

chỉ cần sử dụng một chỉ số z và mọi thứ sẽ ổn. đảm bảo có các vị trí được đánh dấu là cố định hoặc tuyệt đối. sau đó không có gì sẽ di chuyển xung quanh như với một thẻ float.

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.