CSS để dừng gói văn bản dưới hình ảnh


87

Tôi có đánh dấu sau:

<li id="CN2787">
  <img class="fav_star" src="images/fav.png">
  <span>Text, text and more text</span>
</li>

Tôi muốn nó để nếu văn bản kết thúc, nó không đi vào 'cột' cho hình ảnh. Tôi biết tôi có thể làm điều đó với table(mà tôi đang làm) nhưng điều này không khả thi vì lý do này .

Tôi đã thử những cách sau mà không thành công:

li span {width: 100px; margin-left: 20px}
.fav_star {width: 20px}

Tôi cũng đã thử float: right.

Cảm ơn.

CHỈNH SỬA: Tôi muốn nó trông như thế này:

IMG   Text starts here and keeps going... and
      wrap starts here.

Không phải như thế này:

IMG   Text starts here and keeps going... and 
wrap starts in the space left for the image.

1
bạn có thể đặt mã của bạn vào jsfiddle?
Hardik

Tôi nghĩ rằng bạn cần phải rõ ràng hơn một chút về ý định của bạn ở đây. Nếu bạn không muốn văn bản để bọc sau đó bạn chỉ có thể sử dụng white-space: nowrap;trong li span {...}, nhưng tôi có ấn tượng rằng bạn đang cố gắng làm điều gì đó khác
My Head Hurts

@MyHeadHurts Xin lỗi - có vẻ rõ ràng với tôi :) Tôi muốn có hai cột trong dòng. 20px bên trái dành cho một hình ảnh. Phần còn lại dành cho văn bản. Nếu văn bản kết thúc, tôi muốn nó bắt đầu dòng thứ hai của dòng bao bọc 20px từ bên trái (dưới vị trí văn bản ban đầu bắt đầu).
Nick

1
Đối với người qua đường, bạn không cần phải xử lý chiều rộng như câu trả lời được chấp nhận gợi ý. Nó đơn giản hơn nhiều: tạo cái được gọi là ngữ cảnh định dạng mới . Hãy xem câu trả lời của Joe Conlin. Để biết nền tảng mới hơn, hãy xem của tôi.
hqcasanova

1
@hqcasanova Đối với hồ sơ, câu trả lời của Dan đã được chấp nhận 9 tháng trước khi Joe đăng bài của anh ấy và 16 tháng trước khi bạn của bạn. Tôi sẽ không chấp nhận câu trả lời của Dan, mặc dù cảm ơn vì đã thêm các lựa chọn thay thế.
Nick

Câu trả lời:


35

Vì câu hỏi này đang nhận được nhiều lượt xem và đây là câu trả lời được chấp nhận, tôi cảm thấy cần phải thêm tuyên bố từ chối trách nhiệm sau:

Câu trả lời này dành riêng cho câu hỏi của OP (Có chiều rộng được đặt trong các ví dụ). Trong khi nó hoạt động, nó yêu cầu bạn phải có chiều rộng trên mỗi phần tử, hình ảnh và đoạn văn. Trừ khi đó là yêu cầu của bạn, tôi khuyên bạn nên sử dụng giải pháp của Joe Conlin được đăng như một câu trả lời khác cho câu hỏi này.

Phần spantử là một phần tử nội tuyến, bạn không thể thay đổi chiều rộng của nó trong CSS.

Bạn có thể thêm CSS sau vào span của mình để có thể thay đổi chiều rộng của nó.

display: block;

Một cách khác, thường có ý nghĩa hơn, là sử dụng một <p>phần tử làm cha mẹ cho của bạn <span>.

<li id="CN2787">
  <img class="fav_star" src="images/fav.png">
  <p>
     <span>Text, text and more text</span>
  </p>
</li>

<p>là một blockphần tử, bạn có thể đặt chiều rộng của nó bằng cách sử dụng CSS mà không cần phải thay đổi bất cứ điều gì.

Nhưng trong cả hai trường hợp, vì bây giờ bạn có một phần tử khối, bạn sẽ cần phải làm nổi hình ảnh để văn bản của bạn không nằm bên dưới hình ảnh của bạn.

li p{width: 100px; margin-left: 20px}
.fav_star {width: 20px;float:left}

PS Thay vì float:leftvào hình ảnh, bạn cũng có thể đặt float:righttrên li pnhưng trong trường hợp đó, bạn cũng sẽ cần text-align:leftđể tổ chức lại các văn bản một cách chính xác.

PSS Nếu bạn tiếp tục với giải pháp đầu tiên là không thêm <p>phần tử, CSS của bạn sẽ trông giống như vậy:

li span{width: 100px; margin-left: 20px;display:block}
.fav_star {width: 20px;float:left}

Điều này thực sự hữu ích. Tôi đã thay đổi spanđến một pphần tử. Sau đó chỉ cần hai dường như làm các trick: li p {margin-left: 40px} .fav_star {float: left}. Chiều rộng cho hình ảnh do hình ảnh tự đặt, pphần tử tự động là a blockvà tôi để riêng chiều rộng. Cám ơn vì cái này.
Nick

2
Nếu bạn định sử dụng, display:blockbạn cũng có thể sử dụng một divvì đó là những gì nó dành cho (hoặc sử dụng một pnhư bạn cũng đề xuất). Không cần phải ngắt hai dòng văn bản - nếu bạn đang sử dụng, pbạn có thể mất span.
Gareth

IMO, bạn không nên sử dụng HTML để thay đổi thiết kế các trang của mình. Đây là công việc dành cho CSS (Tất nhiên là có ngoại lệ, đặc biệt khi bạn cần khả năng tương thích trên nhiều trình duyệt). Tôi tin rằng việc sử dụng HTML phù hợp và có "ngữ nghĩa tốt" là quan trọng hơn. Vì vậy, tôi sẽ không sử dụng div, trong trường hợp này, một pcó ý nghĩa hơn. Đánh mất cái spanlà chuyện nhỏ đối với tôi, và phụ thuộc vào cách bạn sắp xếp nội dung của mình.
Dan

Bao bọc một <span>trong một <p>là phù thủy thẳng ra khỏi Hogwartz! Hoạt động đẹp!
Janus

252

Câu trả lời rất đơn giản cho vấn đề này mà dường như rất nhiều người mắc phải:

<img src="url-to-image">
<p>Nullam id dolor id nibh ultricies vehicula ut id elit.</p>

    img {
        float: left;
    }
    p {
        overflow: hidden;
    }

Xem ví dụ: http://jsfiddle.net/vandigroup/upKGe/132/


11
Đây là câu trả lời đúng cho câu hỏi này. Kỹ thuật này không yêu cầu đặt chiều rộng cố định cho đoạn văn. Giải pháp đơn giản và dễ dàng hơn nhiều. Hoạt động hoàn hảo, ngay cả trong IE8.
chocolata

4
Trên thực tế, điều này sẽ không hoạt động nếu phần tử chứa văn bản là a span(trường hợp của OP). A display: blocksẽ là cần thiết cho span. Nhưng, tiết kiệm điều đó, tôi đồng ý rằng đó là một giải pháp thanh lịch hơn nhiều. Trong trường hợp có ai thắc mắc điều kỳ diệu đằng sau overflow: hidden, hãy xem câu trả lời của tôi dưới đây.
hqcasanova

7
Đó không phải là hành vi mà tôi mong đợi, nhưng điều này thật tuyệt vời.
Gavin

2
Đối với hồ sơ, câu trả lời này đến 8 tháng sau câu trả lời tôi đã đánh dấu :)
Nick

2
Chà. Hoạt động hoàn hảo. Tôi không thể tin rằng tôi chưa bao giờ biết điều này trước đây.
SFlagg

25

Đối với những người muốn một số thông tin cơ bản, đây là một bài viết ngắn giải thích lý do tại sao overflow: hiddenhoạt động. Nó liên quan đến cái gọi là ngữ cảnh định dạng khối . Đây là một phần của thông số kỹ thuật của W3C (tức là không phải là một cuộc tấn công) và về cơ bản là khu vực được chiếm bởi một phần tử có luồng kiểu khối.

Mỗi khi nó được áp dụng, hãy overflow: hiddentạo một ngữ cảnh định dạng khối mới . Nhưng nó không phải là thuộc tính duy nhất có khả năng kích hoạt hành vi đó. Trích dẫn bài thuyết trình của Fiona Chan từ Nhóm ứng dụng web Sydney:

  • float: left / right
  • tràn: ẩn / tự động / cuộn
  • display: table-cell và bất kỳ giá trị nào liên quan đến bảng / inline-block
  • vị trí: tuyệt đối / cố định

1
Bạn có thể thêm một số chi tiết từ bài báo đó vào câu trả lời của mình, trong trường hợp liên kết bị chết không?

Chào buổi sáng nước Úc! Cảm ơn đã nhận xét.
hqcasanova

Điều này là tuyệt vời để hiển thị các khối mã có thể phải cạnh tranh với hình ảnh hoặc thanh bên nổi gần đó.
AlexMA

Kỹ thuật như được mô tả ban đầu hoạt động tốt, mặc dù như những người khác đã nói, đó không phải là hành vi mà tôi mong đợi. Tuy nhiên, tôi không thấy rằng float hoặc inline-block hoạt động mà không bị tràn và tất nhiên các giá trị hiển thị liên quan đến bảng và vị trí tuyệt đối hoặc cố định có các hậu quả bố cục khác có thể được hoặc có thể không được chấp nhận trong ngữ cảnh.
enigment, 20/07/17

3

Nếu bạn muốn margin-leftlàm việc trên một spanyếu tố bạn sẽ cần phải làm cho nó display: inline-blockhay display:blocklà tốt.


Có lẽ cũng cần vertical-align: top;hình ảnh với cái này.
ThinkingStiff

2

cài đặt display:flexcho văn bản phù hợp với tôi.


Điều này dường như là một tương đương hiện đại hơn của thiết lập overflow:auto. Tôi chắc chắn rằng nó không hoạt động hoàn toàn giống nhau trong mọi tình huống, nhưng nó cũng hiệu quả với tôi.
Matt Browne

1

Quấn một div xung quanh hình ảnh và khoảng và thêm phần sau vào CSS như vậy:

HTML

        <li id="CN2787">
          <div><img class="fav_star" src="images/fav.png"></div>
          <div><span>Text, text and more text</span></div>
        </li>

CSS

            #CN2787 > div { 
                display: inline-block;
                vertical-align: top;
            }

            #CN2787 > div:first-of-type {
                width: 35%;
            }

            #CN2787 > div:last-of-type {
                width: 65%;
            }

ÍT HƠN

        #CN2787 {
            > div { 
                display: inline-block;
                vertical-align: top;
            }

            > div:first-of-type {
                width: 35%;
            }
            > div:last-of-type {
                width: 65%;
            }
        }
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.