2013-05-28 8 views
10

Sto cercando di generare alcuni sprite con SASS Compress dove voglio applicare il layout intelligente per il file sprite come la documentazione http://compass-style.org/help/tutorials/spriting/sprite-layouts/generare sprite con bussola con la disposizione intelligente e la spaziatura

Questa grande opera:

$sprites: sprite-map("sprite/*.png", $spacing: 20px); 

Ma quando aggiungo il layout si rompe; nessuna spaziatura e nessuna disposizione intelligente:

$sprites: sprite-map("sprite/*.png", $layout: smart, $spacing: 

Come posso applicare il layout intelligente allo sprite generato?

Aggiornamento Dopo qualche tempo ho avuto questo lavoro:

$sprite-spacing: 20px; 
$sprite-layout: smart; 
@import "sprite/*.png"; 
@include all-sprite-sprites; 

Ma ora non può ottenere la spaziatura per funzionare. Lo sprite è intelligente ma senza spaziature.

+1

quando si utilizza il layout intelligente, la spaziatura non può essere impostato. – agustibr

risposta

13

Il motivo per cui non è possibile ottenere la spaziatura per lavorare con il layout intelligente è perché il layout intelligente semplicemente non supporta la spaziatura. La spaziatura ha solo effetti sui layout orizzontale e verticale.

Detto questo, è possibile aggiungere supporto autonomamente se si è disposti a applicare il codice della bussola. Dovrai sostituire il metodo nel file layout_methods.rb, che può essere trovato a lib/compass/sass_extensions/sprites/layout_methods.rb (relativo alla directory di installazione della bussola).

Il metodo aggiornato dovrebbe essere simile a questo:

def calculate_smart_positions 
    fitter = ::Compass::SassExtensions::Sprites::RowFitter.new(@images) 
    current_y = 0     
    width = 0 
    height = 0 
    last_row_spacing = 9999 
    fitter.fit!.each do |row| 
    current_x = 0     
    row_height = 0 
    row.images.each_with_index do |image, index| 
     extra_y = [image.spacing - last_row_spacing,0].max 
     if index > 0 
     last_image = row.images[index-1] 
     current_x += [image.spacing, last_image.spacing].max 
     end 
     image.left = current_x 
     image.top = current_y + extra_y 
     current_x += image.width 
     width = [width, current_x].max 
     row_height = [row_height, extra_y+image.height+image.spacing].max 
    end 
    current_y += row.height 
    height = [height,current_y].max 
    last_row_spacing = row_height - row.height 
    current_y += last_row_spacing 
    end 
    @width = width 
    @height = height 
end 

Si noti che questo a volte potrebbe non produrre un layout ottimale, perché è solo applicando la spaziatura dopo l'algoritmo di raccordo fila ha già deciso come gli sprite sono divisi in filari. Spero che dovrebbe essere abbastanza buono per la maggior parte dei casi però.

Devo anche menzionare che non ho assolutamente nessuna esperienza di programmazione in ruby, quindi questo potrebbe essere un codice estremamente mal scritto. Sembra funzionare comunque.

+0

@TommySorensen Questa patch non ha funzionato per te? –

+0

Funziona perfettamente, ma sto cercando una soluzione in cui non ho bisogno di cambiare i file della bussola me stesso. Non sono l'unico sviluppatore di questo progetto. Ottimo lavoro con il codice rubino! –

+1

@TommySorensen Intendo assolutamente presentare questo come una patch per il progetto della bussola - stavo solo aspettando un feedback sul fatto che funzionasse o meno. Se sono disposti ad accettare il codice nella sua forma attuale è un'ulteriore domanda, ma penso che almeno sia in condizioni migliori rispetto a quella di un'altra richiesta di pull. –

1

quando si utilizza il layout intelligente, non è possibile impostare la spaziatura #718.

Ma c'è una richiesta di pull per risolvere il problema: Smart layout now considers spacing, should fix #718

+0

La richiesta pull è quello che voglio, ora posso solo aspettare che sia –

+0

# 718 unita in una bussola o conosci lo stato? –

+0

Non ancora :( > No, questo non è stato unito a questo è stato creato contro stabile e deve essere ridefinito per padroneggiare poiché l'API interna ne ha modificato alcuni e ci sono alcuni problemi di qualità del codice. Http://git.io/wrUNLg – agustibr

0

Ecco una soluzione semplice che ho creato si comporta molto bene Check it on GitHub

+0

Supporta allineamento verticale e orizzontale con padding tra ogni immagine? –

+0

Se si imposta il layout dello sprite su verticale o orizzontale, supporterà la spaziatura se si manterrà il layout intelligente non supporterà alcuna spaziatura tra le immagini, cioè la configurazione della bussola e non puoi farcela pensando a questo. –

Problemi correlati