2012-11-07 11 views
69

voglio essere in grado di effettuare le seguenti operazioni:Sass calcolare per cento meno px

height: 25% - 5px; 

Ovviamente quando faccio che ottengo l'errore:

Incompatible units: 'px' and '%'. 
+0

Cosa uscita * fare * si ottiene? – cimmanon

+0

Viene visualizzato l'errore "Valore proprietà non valido". In ogni browser, inclusa la versione di Canary di Chrome. –

+0

Se c'è una funzione Sass che mi fa diventare ciò che voglio, è che stavo giocando con 'calc' ... –

risposta

144

Sass non può eseguire operazioni aritmetiche su valori che non possono essere convertito da un'unità all'altra. Sass non ha modo di sapere esattamente quanto "100%" sia in termini di pixel o di qualsiasi altra unità. È qualcosa che solo il browser conosce.

È necessario utilizzare calc(). Check browser compatibility on Can I use...

.foo { 
    height: -webkit-calc(25% - 5px); 
    height: -moz-calc(25% - 5px); 
    height:   calc(25% - 5px); 
} 

Se i valori sono variabili, potrebbe essere necessario usare l'interpolazione trasformarli in stringhe (altrimenti Sass cerca solo di eseguire operazioni aritmetiche):

$a: 25%; 
$b: 5px; 

.foo { 
    width: -webkit-calc(#{$a} - #{$b}); 
    width: -moz-calc(#{$a} - #{$b}); 
    width:   calc(#{$a} - #{$b}); 
} 
+5

Direi che calc () non funziona affatto nella maggior parte dei browser. Le piattaforme mobili sono importanti tanto quanto i desktop. – dalgard

+2

Nessun argomento lì, ma contare i browser! Più supporto calc() di no, e ancor più lo supporteranno nel prossimo futuro! – chrisgonzalez

+3

Avevo problemi di larghezza usando una variabile all'interno delle funzioni calc, ma ho trovato qui: http: // stackoverflow.com/questions/13542164/using-variables-in-sass-percentage-function che potrei fare riferimento alla variabile in questo modo: 'calc (25% - # {$ var})'. – mlunoe

2

SE si conosce la larghezza del il contenitore, puoi fare così:

#container 
    width: #{200}px 
    #element 
    width: #{(0.25 * 200) - 5}px 

Sono consapevole che in molti casi #contenitore potrebbe avere un parente larghezza. Quindi questo non funzionerebbe.

2

Ci scusiamo per la rivitalizzazione del thread precedente - L'allungamento della bussola con uno: dopo lo pseudo-selettore potrebbe essere adatto al tuo scopo, ad es. se si desidera un div per riempire larghezza da sinistra a (50% + 10px) dello schermo è possibile utilizzare (in SASS sintassi rientrato):

.example 
    background: red 
    +stretch(0, -10px, 0, 0) 
    &:after 
     +stretch(0, 0, 0, 50%) 
     content: ' ' 
     background: blue 

L': dopo elemento riempie il 50% alla destra di .Esempio (lasciando disponibile il 50% per la larghezza di .example), quindi .example viene esteso a quella larghezza più 10 px.

+1

c'è un mix minore o meno per questo da qualche parte? calc non sembra funzionare molto bene. – v3nt

11

C'è una funzione calc in SCSS [in fase di compilazione] e in CSS [in fase di esecuzione]. Probabilmente stai invocando il primo anziché il secondo.

Per ovvi motivi, le unità di missaggio non funzioneranno in fase di compilazione, ma verranno eseguite in fase di esecuzione.

È possibile forzare quest'ultimo utilizzando unquote, una funzione SCSS.

.selector { height: unquote("-webkit-calc(100% - 40px)"); } 
5
$var:25%; 
$foo:5px; 
.selector { 
    height:unquote("calc(#{$var} - #{$foo})"); 
} 
+1

Grazie per aver postato una risposta a questa domanda! Le risposte al solo codice sono scoraggiate su Stack Overflow, perché un dump del codice senza contesto non spiega come o perché la soluzione funzionerà, rendendo difficile per il poster originale (o per eventuali futuri lettori) capire la logica alla base. Per favore, modifica la tua domanda e includi una spiegazione del tuo codice in modo che gli altri possano beneficiare della tua risposta. Grazie! –

+0

Questo mi ha salvato. width: unquote ("calc (100% - # {$ leftnav-width})"); – httpete