2012-06-11 29 views
7

Tôi muốn có một div nhỏ màu đỏ có chiều rộng đầy đủ ở vị trí trên cùng cố định, bên trong một div khác có overflow: scroll. Tôi hy vọng jsFiddle làm cho nó rõ ràng: http://jsfiddle.net/mCYLm/2/.Sử dụng chiều rộng đầy đủ, không bao gồm thanh cuộn tràn với "vị trí: tuyệt đối"

Vấn đề là div màu đỏ chồng lên thanh cuộn. Tôi đoán right: 0 có nghĩa là bên tay phải của div.wrapper; nó không trừ thanh cuộn của div.main. Khi tôi di chuyển overflow: scroll vào div.wrapper, khi đó biểu ngữ màu đỏ có kích thước phù hợp (fiddle). Tuy nhiên, nó không phải ở một vị trí cố định nữa (di chuyển xuống làm cho biểu ngữ cuộn lên).

Làm cách nào để tôi có thể đạt được hai điều sau đây cùng nhau?

  • Biểu ngữ màu đỏ ở vị trí cố định như trong this fiddle.
  • Biểu ngữ màu đỏ có chiều rộng đầy đủ ngoại trừ thanh cuộn như trong this fiddle.

Tôi muốn làm việc này trong Google Chrome.

HTML:

<div class="wrapper"> 
    <div class="red-banner"></div> 
    <div class="main"> 
     <div class="item">foo</div> 
     <div class="item">foo</div> 
     <div class="item">foo</div> 
     <div class="item">foo</div> 
    </div> 
</div>​ 

CSS:

div.wrapper { 
    position: relative; 
} 

div.main { 
    height: 200px; 
    overflow-y: scroll; 
} 

div.item { 
    border: 1px solid black; 
    margin: 20px; 
    padding: 20px; 
} 

div.red-banner { 
    background-color: red; 
    position: absolute; 
    left: 0; 
    top: 0; 
    right: 0; 
    height: 20px; 
} 
+0

Bạn có thể thay đổi 'bất động sản right' để phù hợp với chiều rộng cuộn ... Yêu cầu JS để đảm bảo rằng bất kỳ thanh cuộn sẽ được đo một cách chính xác .. –

+0

@Gaby aka G. Petrioli : Vâng, nó hoạt động, cảm ơn.Nó không phải là rất thỏa mãn, mặc dù. Tôi sẽ tiếp tục với điều đó nếu không có bất kỳ câu trả lời chỉ CSS nào. – pimvdb

+0

Tại sao không chỉ định vị phần tử cuộn dưới thanh? Giống như [trong ví dụ này] (http://jsfiddle.net/mCYLm/6/). Đó là cách đơn giản nhất tôi thấy rằng bạn có thể làm điều này. – Qtax

Trả lời

5

Có vẻ như điều này là không thể với CSS tinh khiết, do đó, đây là một JavaScript (jQuery) hack:

$(function() { 
    var $container = $("<div>").css({ height: 1, overflow: "scroll" }).appendTo("body"); 
    var $child = $("<div>").css({ height: 2 }).appendTo($container); 
    window.SCROLLBAR_WIDTH = $container.width() - $child.width(); 
    $container.remove(); 
}); 

thì:

$("div.red-banner").css({ 
    right: SCROLLBAR_WIDTH 
}); 
+1

Không cần sử dụng 'calc', chỉ cần đặt' đúng' thay vào đó, 'phải: SCROLLBAR_WIDTH +" px "'. – Qtax

+0

@Qtax: Rất tiếc, tôi phải xem xét điều này quá lâu. Cảm ơn! – pimvdb

+0

@Both: Tôi đã chấp nhận câu trả lời này vì đó là giải pháp duy nhất không có tác dụng phụ. Tôi đã upvoted cả hai bạn; Cảm ơn tất cả sự giúp đỡ của bạn. – pimvdb

1

HTML

<div class="scroller"> 
    <div class="banner-wrapper"> 
     <div class="banner"></div> 
    </div> 
</div> 

<div class="main"> 
    <div class="item">foo</div> 
    <div class="item">foo</div> 
    <div class="item">foo</div> 
    <div class="item">foo</div> 
</div>​ 

CSS

* { margin: 0; padding: 0 } 
body { 
    padding-top: 30px; 
} 

div.main { 
    height: 200px; 
    width: 100%; 
    overflow-y: scroll; 
    position: absolute; 
    z-index: 50; 
    background: -webkit-gradient(linear, center top, center bottom, from(white), to(rgba(255,255,255,0))); 
} 

div.item { 
    border: 1px solid black; 
    margin: 20px; 
    padding: 20px; 
} 

div.scroller { 
    height: 20px; 
    width: 100%; 
    position: absolute; 
    z-index: 100; 
    overflow: hidden; 
} 

div.banner-wrapper { 
    background: transparent; 
    position: relative; 
    height: 20px; 
    overflow-y: scroll; 
    left: 0; 
    margin-right: -20px; 
} 
div.banner { 
    height: 20px; 
    background: -webkit-gradient(linear, center top, center bottom, from(white), to(rgba(255,255,255,0)));; 
    margin-left: 20px; 
    margin-right: 40px; 
} 

phiên bản phát triển: http://jsfiddle.net/mCYLm/13/
phiên bản cuối cùng: http://jsfiddle.net/mCYLm/14/

trình với zoom và chiều rộng khung nhìn khác nhau.
! BUG: Nút cuộn từ trên cùng bên phải không thể truy cập/có thể nhấp được.

Tested trong:

  • IE6,7,8,9 (cửa sổ)
  • FF11 (Windows)
  • Google Chrome 18 (ubuntu)
  • Safari 5.1 (OSX)
+0

Cảm ơn rất nhiều, nhưng văn bản hiện đang chồng chéo lên biểu ngữ. Ý tưởng là các biểu ngữ chồng chéo các văn bản thay vào đó (như trong fiddle). Bạn có biết nếu điều đó có thể? – pimvdb

+0

Điều đó không khắc phục được, nó chỉ đặt phần tử cuộn lên trên thanh. – Qtax

+0

@pimvdb Vì vậy, cuối cùng là giải pháp CSS duy nhất: http://jsfiddle.net/mCYLm/9/. Bây giờ tôi sẽ chỉnh sửa câu trả lời của tôi với các infos mới làm thế nào để sử dụng nó. Bạn có thể cần phải thay thế DataURI theo nhu cầu của bạn. –

Các vấn đề liên quan