2011-08-29 4 views
12

Estoy buscando hacer un bucle for dentro de Less. ¿Es posible hacer esto dentro de Less? Sé que tiene la capacidad de evaluar js pero a este grado?¿Puedes hacer un javascript para el bucle dentro de LESS css?

+1

LESS es simplemente un precompilador de CSS. El resultado final es simple CSS. No veo a dónde entra Javascript? –

+2

@Pekka: LESS se puede ejecutar dinámicamente, tanto en el lado del cliente en el navegador como en el lado del servidor a través de Node.js ([más aquí] (http://lesscss.org/)). Parte de su sintaxis es, de hecho, evaluar una expresión de JavaScript, por ejemplo (del lado del cliente): '@height: \' document.body.clientHeight \ ';' –

+0

@ T.J. ah, ¿qué sabes? Interesante, gracias. –

Respuesta

24

Recomendaré obtener el pedido Twitter Bootsrap. Están construyendo su sistema de grillas de esa manera. Se repiten, con recursividad, en un mixin menos, en lugar de escribir cada clase que necesitan.

La parte interesante está en el archivo mixins.less, en el directorio menos, debajo del comentario "// The Grid" (línea 516). La parte interesante es:

#grid { 

    .core (@gridColumnWidth, @gridGutterWidth) { 

     .spanX (@index) when (@index > 0) { 
     (~"[email protected]{index}") { .span(@index); } 
     .spanX(@index - 1); 
     } 
     .spanX (0) {} 

     ... 

     .span (@columns) { 
     width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)); 
     } 
... 

cual se le llama en el archivo grid.less en menos directorio de esta manera:

#grid > .core(@gridColumnWidth, @gridGutterWidth); 

que producen (entre otras cosas):

.span12 { 
    width: 940px; 
} 
.span11 { 
    width: 860px; 
} 
.span10 { 
    width: 780px; 
} 
... 

en bootstrap.css línea 170.

Para @gridColumnWidth, @gridGutterWidth y el resto de variables check var archivo iables.less (línea 184)

Asegúrese de tener instalada la última versión del compilador de nodo lessc.

+4

Gracias por eso. Si alguien tiene problemas para entender esto/necesita una explicación más detallada: http://blog.thehippo.de/2012/04/programming/do-a-loop-with-less-css/ – TheHippo

+0

Acabo de ver esto en Bootstrap anoche y me voló la mente y luego tuve que implementarlo en mi propia biblioteca de cuadrícula. ¡Tan genial! – kalisjoshua

+1

¡Me alegra que lo encuentre útil @kalisjoshua! Anímate siempre es bienvenido :) – AlessMascherpa

2

No hay nada acerca de los bucles en the docs, pero ya que se puede acceder de JavaScript expresiones a través de acentos abiertos, siempre se puede definir una función en el script (no el código de menos, pero JavaScript   — por ejemplo, si en un navegador, que había script tener un elemento separado) que hace el bucle y luego acceder a ella, por ejemplo:

@height: `doMyLoop()` 

depende de lo que estamos tratando de lograr con el bucle. Si desea que el ciclo genere reglas CSS, sospecho que no tiene suerte.

+1

Estoy intentando crear un bucle que se crea en una cuadrícula de 24 columnas. Básicamente, quiero que pase 24 veces y escriba las clases de la grilla. .grid_1, .grid_2, ...., .grid_24 –

+0

Esto se puede hacer con el ejemplo dado por AlessMascherpa arriba con pequeños mods, aunque la salida baja (10,9,8 ...) vs. arriba (1, 2,3 ...), funciona solo como algo estilístico. – augurone

1

Esto es un hack pero ... Agregue esto a su archivo menos.

@testColor: green; 

unusedclass { 
    unknownprop: ~`loopCss(10,".group{{i}} { background-color: @{testColor}; }")` 
} 

Crear un archivo JavaScript loopCss.js con la siguiente función:

function loopCss(count,cssTemplate) { 
    // end the existing unused class 
    var result = "0;}\n"; 
    // Add your custom css 
    for(var i=0; i<count; i++) result += cssTemplate.replace("{{i}}",i) +"\n"; 
    // Handle the close bracket from unused class 
    result += "unusedclass {"; 
    return result; 
} 

ahora incluyen los loopCss.js ante sus less.js y debería funcionar.

Cuestiones relacionadas