CSS: imposta un colore di sfondo pari al 50% della larghezza della finestra


155

Cercare di ottenere uno sfondo su una pagina che è "divisa in due"; due colori sui lati opposti (apparentemente fatto impostando un valore predefinito background-colorsul bodytag, quindi applicandone un altro su uno divche allunga l'intera larghezza della finestra).

Ho trovato una soluzione, ma purtroppo la background-sizeproprietà non funziona in IE7 / 8, che è un must per questo progetto -

body { background: #fff; }
#wrapper {
    background: url(1px.png) repeat-y;
    background-size: 50% auto;
    width: 100%;
}

Dal momento che si tratta solo di colori solidi, forse c'è un modo di usare solo la background-colorproprietà normale ?

Risposte:


280

Supporto per browser meno recenti

Se il supporto del browser precedente è un must, quindi non puoi andare con più sfondi o gradienti, probabilmente vorrai fare qualcosa del genere su un divelemento di riserva :

#background {
    position: fixed;
    top: 0;
    left: 0;
    width: 50%;
    height: 100%;
    background-color: pink; 
}

Esempio: http://jsfiddle.net/PLfLW/1704/

La soluzione utilizza un div fisso aggiuntivo che riempie metà dello schermo. Poiché è stato risolto, rimarrà in posizione anche quando gli utenti scorrono. Potrebbe essere necessario armeggiare con alcuni indici z in seguito, per assicurarsi che gli altri elementi siano sopra il div dello sfondo, ma non dovrebbe essere troppo complesso.

Se hai problemi, assicurati solo che il resto dei tuoi contenuti abbia un indice z più alto dell'elemento di sfondo e dovresti andare bene.


Browser moderni

Se i nuovi browser sono la tua unica preoccupazione, ci sono un paio di altri metodi che puoi usare:

Gradiente lineare:

Questa è sicuramente la soluzione più semplice. Puoi usare un gradiente lineare nella proprietà di sfondo del corpo per una varietà di effetti.

body {
    height: 100%;
    background: linear-gradient(90deg, #FFC0CB 50%, #00FFFF 50%);
}

Questo provoca un taglio al 50% per ogni colore, quindi non c'è un "gradiente" come suggerisce il nome. Prova a sperimentare il pezzo "50%" dello stile per vedere i diversi effetti che puoi ottenere.

Esempio: http://jsfiddle.net/v14m59pq/2/

Sfondi multipli con dimensioni dello sfondo:

È possibile applicare un colore di sfondo htmlall'elemento, quindi applicare un'immagine di sfondo bodyall'elemento e utilizzare la background-sizeproprietà per impostarlo sul 50% della larghezza della pagina. Ciò si traduce in un effetto simile, anche se in realtà verrebbe utilizzato solo su pendenze se si utilizza un'immagine o due.

html {
    height: 100%;
    background-color: cyan;
}

body {
    height: 100%;
    background-image: url('http://i.imgur.com/9HMnxKs.png');
    background-repeat: repeat-y;
    background-size: 50% auto;
}

Esempio: http://jsfiddle.net/6vhshyxg/2/


NOTA SUPPLEMENTARE: si noti che entrambi gli elementi htmle bodysono impostati su height: 100%negli ultimi esempi. Questo per assicurarsi che anche se il contenuto è più piccolo della pagina, lo sfondo sarà almeno l'altezza della finestra dell'utente. Senza l'altezza esplicita, l'effetto di sfondo diminuirà solo fino al contenuto della pagina. È anche solo una buona pratica in generale.


Grazie, mi ha aiutato a ottenere questo effetto su un tavolo: jsfiddle.net/c9kp2pde

11
Il linear-gradientduro taglio funziona anche per i pixel:background: linear-gradient(90deg, #FFC0CB 225px, #00FFFF 0, #00FFFF 100%);
Jacob van Lingen,

1
funziona con il 50% 50%, ma non funziona quando ho sostituito con il 25% 75%
datdinhquoc

5
@datdinhquoc Try background: linear-gradient(90deg, #FFC0CB 25%, #00FFFF 0);.
justisb

55

Soluzione semplice per ottenere lo sfondo "diviso in due":

background: linear-gradient(to left, #ff0000 50%, #0000ff 50%);

Puoi anche usare i gradi come direzione

background: linear-gradient(80deg, #ff0000 50%, #0000ff 50%);

14
Questo è bello, ma è un gradiente. È possibile fare una forte distinzione?
John Giotta,

23

Puoi fare una forte distinzione invece del gradiente lineare mettendo il secondo colore sullo 0%

Per esempio,

Gradiente - background: linear-gradient(80deg, #ff0000 20%, #0000ff 80%);

Forte distinzione - background: linear-gradient(80deg, #ff0000 20%, #0000ff 0%);


17

Quindi, questa è una domanda terribilmente vecchia che ha già una risposta accettata, ma credo che questa risposta sarebbe stata scelta se fosse stata pubblicata quattro anni fa.

L'ho risolto esclusivamente con CSS e SENZA ELEMENTI DOM EXTRA! Ciò significa che i due colori sono puramente quello, solo i colori di sfondo di ONE ELEMENT, non il colore di sfondo di due.

Ho usato un gradiente e, dato che ho impostato i colori così vicini, sembra che i colori siano distinti e che non si fondano.

Ecco il gradiente nella sintassi nativa:

background: repeating-linear-gradient(#74ABDD, #74ABDD 49.9%, #498DCB 50.1%, #498DCB 100%);

Il colore #74ABDDinizia alle 0%ed è ancora #74ABDDalle 49.9%.

Quindi, forzo la sfumatura per passare al mio prossimo colore entro 0.2%l'altezza degli elementi, creando quella che sembra essere una linea molto solida tra i due colori.

Ecco il risultato:

Colore di sfondo diviso

Ed ecco il mio JSFiddle!

Divertiti!


Si può anche andare con i pixel su questo. background: repeating-linear-gradient(var(--grayLight), var(--grayLight) 430px, rgba(0,0,0,0) 201px, rgba(0,0,0,0) 100%);
Filippo il

12

questo dovrebbe funzionare con CSS puro.

background: -webkit-gradient(linear, left top, right top, color-stop(50%,#141414), color-stop(50%,#333), color-stop(0%,#888));

testato solo su Chrome.


9

In un progetto passato che doveva supportare IE8 + e l'ho raggiunto usando un'immagine codificata in formato url dati.

L'immagine era 2800x1px, metà dell'immagine era bianca e metà trasparente. Ha funzionato abbastanza bene.

body {
    /* 50% right white */
    background: red url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACvAAAAABAQAAAAAqT0YHAAAAAnRSTlMAAHaTzTgAAAAOSURBVHgBYxhi4P/QAgDwrK5SDPAOUwAAAABJRU5ErkJggg==) center top repeat-y;

   /* 50% left white */
   background: red url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACvAAAAABAQAAAAAqT0YHAAAAAnRSTlMAAHaTzTgAAAAPSURBVHgBY/g/tADD0AIAIROuUgYu7kEAAAAASUVORK5CYII=) center top repeat-y;
}

Puoi vederlo funzionare qui JsFiddle . Spero che possa aiutare qualcuno;)


4

Ho usato :aftere funziona in tutti i principali browser. si prega di controllare il link. ho solo bisogno di fare attenzione all'indice z poiché dopo sta avendo la posizione assoluta.

<div class="splitBg">
    <div style="max-width:960px; margin:0 auto; padding:0 15px; box-sizing:border-box;">
        <div style="float:left; width:50%; position:relative; z-index:10;">
            Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
        </div>
        <div style="float:left; width:50%; position:relative; z-index:10;">
            Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, 
        </div>
        <div style="clear:both;"></div>
    </div>
</div>`
css

    .splitBg{
        background-color:#666;
        position:relative;
        overflow:hidden;
        }
    .splitBg:after{
        width:50%;
        position:absolute;
        right:0;
        top:0;
        content:"";
        display:block;
        height:100%;
        background-color:#06F;
        z-index:1;
        }

link a violino


3

È possibile utilizzare lo :afterpseudo-selettore per raggiungere questo obiettivo, anche se non sono sicuro della retrocompatibilità di quel selettore.

body {
    background: #000000
}
body:after {
    content:'';
    position: fixed;
    height: 100%;
    width: 50%;
    left: 50%;
    background: #116699
}

Ho usato questo per avere due diversi gradienti su uno sfondo di pagina.


1
Questa tecnica è supportata in tutti i browser, ottima soluzione! Puoi anche usare una posizione assoluta con un genitore relativo se non vuoi l'effetto fisso.
Adam T. Smith,

3

Usa sulla tua immagine bg

Divisione verticale

background-size: 50% 100%

Divisione orizzontale

background-size: 100% 50%

Esempio

.class {
   background-image: url("");
   background-color: #fff;
   background-repeat: no-repeat;
   background-size: 50% 100%;
}

come posso impostare questo sfondo al centro
Vaibhav Ahalpara

1
prova: background-position: center center
Jan Ranostaj,

3

Uno dei modi per implementare il problema per inserire una sola riga all'interno del div:

background-image: linear-gradient(90deg, black 50%, blue 50%);

Ecco un codice dimostrativo e altre opzioni (orizzontale, diagonale, ecc.), Puoi fare clic su "Esegui snippet di codice" per vederlo dal vivo.

.abWhiteAndBlack
{
  background-image: linear-gradient(90deg, black 50%, blue 50%);
  height: 300px;
  width: 300px;
  margin-bottom: 80px;
}

.abWhiteAndBlack2
{
  background-image: linear-gradient(180deg, black 50%, blue 50%);
  height: 300px;
  width: 300px;
  margin-bottom: 80px;
}

.abWhiteAndBlack3
{
  background-image: linear-gradient(45deg, black 50%, blue 50%);
  height: 300px;
  width: 300px;
  margin-bottom: 80px;
}
Vertical:

  <div class="abWhiteAndBlack">
  </div>


Horizonal:

  <div class="abWhiteAndBlack2">
    
  </div>


Diagonal:

  <div class="abWhiteAndBlack3">
    
  </div>


2

L'opzione più a prova di proiettile e semanticamente corretta sarebbe quella di utilizzare pseudo-elemento ( ::aftero ::before) a posizionamento fisso . Usando questa tecnica non dimenticare di impostare gli z-indexelementi all'interno del contenitore. Inoltre, quella content:""regola per lo pseudo-elemento è necessaria, altrimenti non verrà renderizzata.

#container {...}

#content::before {
    content:"";
    background-color: #999;
    height: 100%;
    left: 0px;
    position: fixed;
    top: 0px;    
    width: 50%; 
    z-index: 1;
}


#content * {
  position: relative;
  z-index:2;
}

Esempio live: https://jsfiddle.net/xraymutation/pwz7t6we/16/


1

.background{
 background: -webkit-linear-gradient(top, #2897e0 40%, #F1F1F1 40%);
 height:200px;
 
}

.background2{
  background: -webkit-linear-gradient(right, #2897e0 50%, #28e09c 50%);

 height:200px;
 
}
<html>
<body class="one">

<div class="background">
</div>
<div class="background2">
</div>
</body>
</html>


0

Questo è un esempio che funzionerà sulla maggior parte dei browser.
Fondamentalmente usi due colori di sfondo, il primo a partire dallo 0% e terminando al 50% e il secondo a partire dal 51% e finendo al 100%

Sto usando l'orientamento orizzontale:

background: #000000;
background: -moz-linear-gradient(left,  #000000 0%, #000000 50%, #ffffff 51%, #ffffff 100%);
background: -webkit-gradient(linear, left top, right top, color-stop(0%,#000000), color-stop(50%,#000000), color-stop(51%,#ffffff), color-stop(100%,#ffffff));
background: -webkit-linear-gradient(left,  #000000 0%,#000000 50%,#ffffff 51%,#ffffff 100%);
background: -o-linear-gradient(left,  #000000 0%,#000000 50%,#ffffff 51%,#ffffff 100%);
background: -ms-linear-gradient(left,  #000000 0%,#000000 50%,#ffffff 51%,#ffffff 100%);
background: linear-gradient(to right,  #000000 0%,#000000 50%,#ffffff 51%,#ffffff 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#000000', endColorstr='#ffffff',GradientType=1 );

Per diverse regolazioni è possibile utilizzare http://www.colorzilla.com/gradient-editor/


0

se si desidera utilizzare linear-gradientcon il 50% di altezza:

background: linear-gradient(to bottom, red 0%, blue 100%) no-repeat;
background-size: calc(100%) calc(50%);
background-position: top;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.