2014-10-20 16 views
13

Tôi có một phần tử chặn nội tuyến có chứa một từ rất dài. Khi tôi thay đổi kích thước khung nhìn cho đến khi tôi đạt đến điểm ngắt của văn bản được bao bọc cho dòng tiếp theo, tôi nhận được một lượng không gian đáng kể. Tuy nhiên, tôi muốn phần tử khối nội tuyến bọc ngay lập tức với chiều rộng của nội dung của nó.Không gian thêm dòng nội dòng khối

tôi thấy nó khó để giải thích chính xác những gì đang xảy ra, vì vậy dưới một gif động để minh họa cho vấn đề của tôi:

Khi thay đổi kích thước khung nhìn:

animated gif for illustration purposes

Để được rõ ràng, các hình ảnh ở trên là tôi liên tục thay đổi kích thước khung nhìn.

Có ai biết cách nào để đạt được điều tôi muốn không? Ngay cả với dấu gạch nối CSS, khoảng trắng vẫn còn (mà tôi không muốn).

JSFiddle. Thay đổi kích thước khung hình để xem ý tôi là gì.

div { 
    display: inline-block; 
    background-color: black; 
    color: white; 
    padding: 5px; 
} 
+0

Tôi thực sự cần một số mã để làm việc với .. Có thể bạn xin vui lòng thêm một jsfiddle – Nick

+0

http://jsfiddle.net/527z755p/ Cảm ơn :) – AKG

+0

@AKG: Tôi đã xóa câu trả lời của tôi (nó không hoạt động nếu dòng cuối cùng ngắn hơn lần đầu tiên). –

Trả lời

8

Các inline-block thực sự kéo dài về thay đổi kích thước như hình ảnh động của bạn cho thấy, để nó giữ vị trí cho từ dài để đi vào không gian đó một lần nữa.

Một giải pháp đơn giản là thêm text-align: justify, nhưng tôi e rằng nó có thể không chính xác như những gì bạn muốn (xem demo).

Một số khác sẽ là sử dụng media queries, như @Parody đã đề xuất, nhưng bạn sẽ phải biết các kích thước có chứa div và điều đó sẽ không thể mở rộng như bạn đã đề cập.

word-break: break-all được đề xuất bởi @yugi cũng hoạt động nhưng làm cho các từ bị thu gọn bằng chữ cái, bất kể độ dài của chúng.

Cách duy nhất để đạt được hành vi chính xác là (theo như tôi biết) để sử dụng javascript. Ví dụ, bạn sẽ phải quấn văn bản của bạn thành một yếu tố span bên trong div, và sau đó thêm một cái gì đó như thế này:

var paddingLeft = parseInt($('#foo').css('padding-left')), 
    paddingRight = parseInt($('#foo').css('padding-left')), 
    paddingTop = parseInt($('#foo').css('padding-top')), 
    paddingBottom = parseInt($('#foo').css('padding-Bottom')), 
    cloned = $('#foo span').clone(), 
    cloned_wrap = document.createElement('div'); 

$(cloned_wrap).css({ 
    paddingLeft : paddingLeft, 
    paddingRight : paddingRight, 
    display : 'inline-block', 
    visibility: 'hidden', 
    float: 'left', 
}); 

$(cloned_wrap).insertAfter('#foo'); 
cloned.appendTo(cloned_wrap); 

$(window).on('resize', function(){ 
    $('#foo').css('width', cloned.width() + 1); 
    $(cloned_wrap).css('margin-top',- $('#foo').height() - paddingTop - paddingBottom); 
}).resize(); 

Hãy xem jsfiddle working demo. (← chỉnh sửa nhiều lần)

Đó là khá nhiều mã, nhưng nó hoạt động;)

(PS: Tôi giả định jquery đã có sẵn, nếu không, hoàn toàn giống có thể đạt được trong tinh khiết JS)

+0

Tuyệt vời! Tôi đã sử dụng JavaScript nếu không có giải pháp CSS thuần túy. Tôi thích jQuery nhưng không thích sử dụng nó nếu không cần thiết. Nhưng thực sự, cảm ơn người đàn ông! Tôi sẽ đợi thêm một chút nữa để xem có câu trả lời thú vị nào khác không :) – AKG

+1

Cảm ơn;) Tôi đã cập nhật mã một lần nữa vì nó có một số hành vi không mong muốn khi được bao quanh bởi các nội dung khác (như trong kịch bản sử dụng thực tế). – lapin

+0

Tôi không hiểu tại sao bạn cần đặt 'margin-top'. Trong chức năng thay đổi kích thước chỉ cần thêm '$ ('# foo'). Width (cloned.width() + 1);' hoạt động tốt. Tôi sẽ upvote. Vui lòng giải thích – shinobi

0

Nếu im hiểu bạn một cách chính xác bạn có thể sử dụng các loại @media để quyết định những gì css để sử dụng tùy thuộc vào độ rộng của màn hình

đây là một ví dụ về những gì tôi có nghĩa là

@media(min-width:0px) and (max-width:200px){ 
    div { 
    display: block; 
    background-color: black; 
    color: white; 
    padding: 5px; 
    } 
} 
@media (min-width:200px){ 
    div { 
    display: inline-block; 
    background-color: black; 
    color: white; 
    padding: 5px; 
    } 
} 
+0

Điều đó có ý nghĩa nhưng đó không phải là giải pháp có thể mở rộng. Những gì tôi đang thực sự tìm kiếm là một cách để tự nhiên có yếu tố điều chỉnh chiều rộng của nó đến nội dung của nó. Ngay bây giờ khi nó kết thúc tốt đẹp, luôn luôn có không gian dư thừa bên trái - tôi muốn điều đó biến mất. – AKG

1

Tôi không nghĩ rằng đây có thể chỉ với CSS cho một phần tử. Lý do cho hành vi của bạn là chiều rộng của phần tử vẫn là 100% của vùng chứa của nó. Cách duy nhất tôi có thể nghĩ để thực hiện điều này là bằng cách làm một chút gì đó "sáng tạo" ... thử đặt kiểu thành nội tuyến để bạn có được hành vi thu nhỏ, nhưng để tránh vấn đề màu nền, hãy đặt nó vào một vùng chứa có chung nền.Cần làm việc.

0

Tôi vẫn đánh giá cao câu trả lời của @ lapin (tôi đã chấp nhận và trao tiền thưởng), tôi phát hiện ra sau khi thực tế là nó không hoàn toàn hoạt động trên nhiều phần tử bên cạnh nhau (không liên quan gì đến @ lapin, tôi đã không đề cập đến nó trong câu hỏi ban đầu của tôi như tôi nghĩ rằng nó sẽ là thông tin không liên quan).

Dù sao, tôi đã đi lên với những điều sau đây mà làm việc cho tôi (giả định các yếu tố cần được áp dụng cho những .title.subtitle):

$('.title, .subtitle').each(function(i, el) { 
    var el = $(el), 
     inner = $(document.createElement('span')), 
     bar = $(document.createElement('span')); 

    inner.addClass('inner'); 
    bar.addClass('bar'); 

    el.wrapInner(inner) 
     .append(bar) 
     .css({ 
      backgroundColor: 'transparent' 
     }); 
}); 

function shrinkWrap() { 
    $('.title, .subtitle').each(function(i, el) { 
     var el = $(el), 
      inner = $('.inner', el), 
      bar = $('.bar', el), 
      innerWidth = inner.width(); 

     bar.css({ 
      bottom: 0, 
      width: innerWidth + parseFloat(el.css('paddingLeft')) + parseFloat(el.css('paddingRight')) 
     }); 
    }); 
} 
shrinkWrap(); 

$(window).on('resize', function() { 
    shrinkWrap(); 
}); 

Về cơ bản những gì tôi làm là:

  1. đặt văn bản trong phần tử quấn bên trong
  2. tạo thành phần nền bổ sung hoàn toàn được định vị
  3. tải xuống dth của phần tử bọc inline bên
  4. áp dụng cho biết chiều rộng đến các yếu tố nền (cộng với đệm và không có điều gì)

CSS:

.title, .subtitle { 
    position: relative; 
    z-index: 500; 
    display: table; 
    padding-left: 10px; 
    margin-right: 10px; 
    background-color: red; 
} 

.title .bar, .subtitle .bar { 
    position: absolute; 
    top: 0; 
    left: 0; 
    bottom: 0; 
    z-index: -10; 
    background-color: red; 
} 
Các vấn đề liên quan