2012-06-11 10 views
7

Mi piacerebbe avere un piccolo div rosso con larghezza completa in una posizione superiore fissa, all'interno di un altro div che ha overflow: scroll. Spero che jsFiddle chiarisca: http://jsfiddle.net/mCYLm/2/.Usa la larghezza completa escludendo la barra di scorrimento con "posizione: assoluta"

Il problema è che il div rosso si sovrappone alla barra di scorrimento. Immagino che right: 0 significhi il lato destro di div.wrapper; non sottrarre la barra di scorrimento di div.main. Quando sposto lo overflow: scroll in div.wrapper, il banner rosso ha le dimensioni corrette (fiddle). Tuttavia, non si trova più in una posizione fissa (lo scorrimento verso il basso fa scorrere il banner verso l'alto).

Come posso ottenere le seguenti due cose insieme?

  • Il banner rosso è nella posizione fissa come in this fiddle.
  • Il banner rosso ha una larghezza intera, ad eccezione della barra di scorrimento come in this fiddle.

Mi piacerebbe farlo funzionare su 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

Si potrebbe alterare il 'immobile right' in base alla larghezza della barra di scorrimento ... Richiede JS per assicurarsi che ogni barra di scorrimento sarebbe stato correttamente misurato .. –

+0

@Gaby aka G. Petrioli : Sì, funziona, grazie.Non è molto soddisfacente, però. Vado avanti con quello se non ci saranno risposte solo CSS. – pimvdb

+0

Perché non posizionare semplicemente l'elemento a scorrimento sotto la barra? Come [in questo esempio] (http://jsfiddle.net/mCYLm/6/). Questo è l'unico modo semplice in cui vedo che potresti farlo. – Qtax

risposta

5

Sembra che questo non sia possibile con CSS puro, quindi ecco un trucco JavaScript (jQuery):

$(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(); 
}); 

poi:

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

Non c'è bisogno di usare 'calc', basta impostare' right' invece, 'right: SCROLLBAR_WIDTH +" px "'. – Qtax

+0

@Qtax: Woops, devo averlo guardato troppo a lungo. Grazie! – pimvdb

+0

@Both: ho accettato questa risposta perché era l'unica soluzione senza effetti collaterali. Ti ho svalutato entrambi; Grazie per tutto il vostro aiuto. – 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; 
} 

versione di sviluppo: http://jsfiddle.net/mCYLm/13/
Versione finale: http://jsfiddle.net/mCYLm/14/

Funziona con zoom e larghezza viewport variabile.
! BUG: il pulsante della barra di scorrimento dalla parte superiore destra non è accessibile/selezionabile.

testato in:

  • IE6,7,8,9 (finestre)
  • FF11 (Windows)
  • Google Chrome 18 (ubuntu)
  • Safari 5.1 (OSX)
+0

Grazie mille, ma il testo ora si sovrappone al banner. L'idea era che il banner si sovrapponesse invece al testo (come nel violino). Vuoi sapere se è possibile? – pimvdb

+0

Questo non risolve il problema, posiziona semplicemente l'elemento a scorrimento sulla barra. – Qtax

+0

@pimvdb Quindi finalmente la soluzione solo CSS: http://jsfiddle.net/mCYLm/9/. Ora modificherò la mia risposta con le nuove informazioni su come usarlo. Potrebbe essere necessario sostituire il DataURI in base alle proprie esigenze. –

Problemi correlati