Mejores prácticas de personalización de Twitter Bootstrap [cerrado]

285

Estoy trabajando con Bootstrap 2.0.3 usando MENOS. Quiero personalizarlo ampliamente, pero quiero evitar hacer cambios en la fuente siempre que sea posible, ya que los cambios en las bibliotecas son frecuentes. Soy nuevo en LESS, así que no sé cómo funciona su compilación por completo. ¿Cuáles son algunas de las mejores prácticas para trabajar con marcos basados ​​en LESS o LESS?

Joel Rodgers
fuente
¡Saludos desde el futuro! Las "mejores prácticas" de personalización de Bootstrap han cambiado en SASS basado en 3.xy 4.x: stackoverflow.com/a/50410667/171456
Zim

Respuestas:

180

Mi solución es similar a jstam, pero evito hacer cambios en los archivos de origen cuando es posible. Dado que los cambios en bootstrap serán frecuentes, quiero poder extraer la última fuente y hacer cambios mínimos manteniendo mis modificaciones en archivos separados. Por supuesto, no es completamente a prueba de balas.

  1. Copie bootstrap.less y variables.less en el directorio padre. Cambie el nombre de bootstrap.less a theme.less o lo que quiera. La estructura de directorios de su directorio debería verse así:

    /Website            
         theme.less
         variables.less
         /Bootstrap
         ...
  2. Actualice todas las referencias en theme.less para que apunten al subdirectorio bootstrap. Asegúrese de que su variables.less se haga referencia desde el padre y no desde el directorio de arranque de la siguiente manera:

    ...
    // CSS Reset
    @import "bootstrap/reset.less";
    
    // Core variables and mixins
    @import "variables.less"; // Modify this for custom colors, font-sizes, etc
    @import "bootstrap/mixins.less";
    
    // Grid system and page structure
    @import "bootstrap/scaffolding.less";
    @import "bootstrap/grid.less";
    @import "bootstrap/layouts.less";

    ...

  3. Agregue sus anulaciones CSS en el archivo theme.less inmediatamente después de donde se incluyen.

    ...
    // Components: Nav
    @import "bootstrap/navs.less";
    @import "bootstrap/navbar.less";
    
    // overrides
    .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner {
        border-radius: 0 0 0 0;
        padding: 10px;
    }
    
    .nav-tabs, .nav-pills {
        text-transform: uppercase;
    }
    
    .navbar .nav > li > a {
        text-shadow: none;
    }
    
    ...
  4. Enlace a theme.less en lugar de bootstrap.less en sus páginas HTML.

Siempre que salga una nueva versión, sus cambios deben ser seguros. También debe hacer una diferencia entre sus archivos de arranque personalizados cada vez que sale una nueva versión. Las variables y las importaciones pueden cambiar.

Joel Rodgers
fuente
¿Hay alguna razón específica para el # 3? ¿Qué sucede si todos sus CSS personalizados aparecen en la parte inferior después de todas las importaciones, en lugar de mezclarse después de cada importación?
AaronLS
2
@AaronLS: Eso también debería funcionar. Creo que el número 3 es para mantenerlo organizado.
Jonatan Littke
@joelrodgers ¿Por qué mixins.less no debe editarse directamente?
Joe Isaacson
¿Qué le parece incluir un archivo vacío de variables-custom.less (a través de @import) dentro de bootstrap.less? Luego, todos podrán personalizar las variables de Bootstrap predeterminadas y actualizarlas de forma segura. De todos modos, creo que esta característica debe incluirse absolutamente en Bootstrap.
adriendenat
36

Esto es algo con lo que he luchado también. Por un lado, quiero personalizar altamente el archivo variables.less con mis propios colores y configuraciones. Por otro lado, quiero cambiar los archivos Bootstrap lo más posible para facilitar el proceso de actualización.

Mi solución (por ahora) es crear un archivo LON addon e insertarlo en el bootstrap.lessarchivo después de importar las variables y mixins. Entonces algo como esto:

...

// CSS Reset
@import "reset.less";

// Core variables and mixins
@import "variables.less"; // Modify this for custom colors, font-sizes, etc
@import "mixins.less";

// Custom Addons
@import "addon-file.less"; // <--- My custom LESS addon

// Grid system and page structure
@import "scaffolding.less";

...

De esta manera, si quiero restablecer los colores de Bootstrap, las fuentes o agregar mixins adicionales, puedo. Mi código está separado pero se compilará dentro del resto de las importaciones de Bootstrap. No es perfecto, pero es un recurso provisional que me funcionó bien.

jstam
fuente
1
Buena solución. Esto es exactamente lo que hice con algunos cambios. Mira mi respuesta Fue demasiado largo para poner un comentario.
Joel Rodgers
También me gusta tu solución, Joel. Buena separación de su código versus el código del marco.
jstam
Dado que mixins hace referencia a variables, ¿necesitaría una importación personalizada de variables.less adicionales entre variables.less y mixins.less import? Para poder modificar variables como @baseFontSize. Ni siquiera sé lo suficiente como para saber si me ahogará declarar una variable del mismo nombre nuevamente.
AaronLS
Encontré que esta es la solución más útil porque, según una nueva copia de bootstrap, simplemente tenemos que agregar una línea nuevamente bootstrap.less, tomar nuestro archivo personalizado VS cambiar potencialmente muchas líneas si cambian los nombres de los archivos principales, etc. esta solución, recompilé mi JS minified usando gruñido y ¡todo está bien en el capó! ¡Personalizaciones que funcionan sin !importantdeclaraciones no amigables !
twknab
25

Por mi parte, solo tengo un archivo theme.lesscon una importación boostrap.less, y justo debajo anulo (incluso si parece malo usar MENOS, pero bueno, es más fácil de mantener) el valor de la variable que no quiero actualizar .

Esto funciona bien para tener valores personalizados para variables en variables.less

Después de eso compilo mi theme.lessarchivo en su lugarbootstrap.less

Ejemplo theme.less:

@import "path/to/my/bootstrap.less";  
@linkColor: #MyAwesomeColor;  
sam
fuente
1
Esta es la forma de 1) tener una copia del código de arranque que se puede actualizar a voluntad mientras todavía 2) poder imponer su propia configuración personalizada. Consulte stackoverflow.com/questions/13809895/… para obtener detalles sobre la estructura de carpetas.
Jeromy French
Me aseguré de poner esto antes de mi propio código menos para asegurar que bootstrap no lo anulara.
Aram Kocharyan
Esto funciono muy bien para mi. Acabo de señalar Koala en theme.less y se compila cada vez que guardo.
ow3n
En caso de que alguien esté usando la versión SASS, ¡cuidado con ! Default
prasanthv
5

Un enfoque mucho mejor (en mi humilde opinión) es tomar el ejemplo del proyecto github Bootswatch llamado swatchmaker . Este proyecto está diseñado específicamente para construir y administrar las docenas de temas de Bootstrap en el sitio web.

En Makefilelas compilaciones del proyecto swatchmaker.less(puede cambiarle el nombre a algo como customizations.less). Este archivo contiene un montón de importaciones:

@import "bootstrap/less/bootstrap.less";
@import "swatch/variables.less";
@import "swatch/bootswatch.less";
@import "bootstrap/less/utilities.less";

Puede cambiar el nombre de la swatchcarpeta y los bootswatch.lessarchivos a lo que considere apropiado.

Esto tiene sentido ya que puede actualizar Bootstrap sin afectar sus propios archivos. De hecho, Makefiletambién contiene comandos para obtener la última versión de Bootstrap. Consulte el archivo README en la página del proyecto para obtener más información.

Como watchrbeneficio adicional, el .lessarchivo README también sugiere que instale la gema que construirá automáticamente el proyecto cuando cambie un archivo.

aleemb
fuente
4

Si (Y SOLO SI) tiene el tiempo, puede hacerlo como yo. Mantengo mi propia versión modificada del marco (s) y con cada actualización del marco leo los documentos y compruebo la fuente en busca de modificaciones.

Esta solución puede sonar menos ideal a primera vista, pero tengo mis razones para hacerlo. No trabajo con uno, sino con una amalgama de muchos marcos, mejores prácticas, reinicios / hojas de estilo de normalización, etc. y siempre estoy seguro de que ninguna actualización cambiará los proyectos existentes de ninguna manera que no haya visto venir.

Estoy trabajando en y con mi propio marco personalizado por las siguientes razones.

  1. Me quito cada poquito, no necesito mantener cosas modulares y pequeñas
  2. Utilizo mi marco para trabajos de clientes y quiero a) saber con qué estoy trabajando exactamente mientras b) ser dueño de todo lo que vendo al cliente. No solo copio y uso marcos, sino que trato de comprenderlos y recrearlos
  3. Uso mi marco en combinación con un CMS y no puedo simplemente soltar y olvidar un marco en un proyecto / comenzar desde cero
Todos los bits iguales
fuente
Sí, lo entiendo, pero para mí las cosas están cambiando tan rápido que toda esta tecnología web se está volviendo un poco abrumadora de seguir.
Joel Rodgers
1
Como se mencionó: mi enfoque es solo para aquellos que controlan el desarrollo actual de múltiples marcos. Lo hago porque tengo que estar al tanto del desarrollo y los diferentes enfoques de los desafíos técnicos. Creo que esto es más adecuado para desarrolladores de frameworks que para autónomos que simplemente "quieren hacer el trabajo".
Todos los bits son iguales
4

Llegué a la misma solución que Joel:

Archivos menos personalizados

Tal como se describió anteriormente: creo copias locales para todos los archivos Less que estoy personalizando: como: "variables-custom.less", "alert-custom.less", "buttons-custom.less". Entonces puedo usar algunos estándares y tener mis propias adiciones. La desventaja es: cuando Bootstrap se actualizará, es realmente difícil migrar.

Pero hay algo más:

Anular estilos

Cuando busco flujos de trabajo, a menudo veo personas que sugieren simplemente anular los estilos. Por lo tanto, primero importa los archivos Less estándar y luego agrega sus declaraciones personalizadas en la parte inferior. La ventaja aquí es: es más fácil actualizar a una versión más nueva. La desventaja es: el archivo CSS compilado incluye todas las anulaciones. Algunos selectores CSS se definen dos veces. Por lo tanto, el navegador debe levantar un poco para descubrir qué aplicar en realidad. Eso no está realmente limpio.

Me pregunto por qué los preprocesadores no son lo suficientemente inteligentes como para resolver tales declaraciones dobles. ¿Hay algún mejor flujo de trabajo que me falta aquí?

Frank Lämmer
fuente
1
Veo que estás en lo cierto, pero siempre puedes ejecutar una utilidad de limpieza CSS en línea o localmente. Aquí hay una lista de ellos: stackoverflow.com/questions/135657/… De todos modos, es probable que no desee que se ejecute un compilador menos en el producto.
Joel Rodgers
Gracias por la respuesta, no sabía que hay herramientas de polvo. Genial, lo investigaré. En realidad, uso un compilador menos localmente de todos modos (CodeKit). No quiero compilar el CSS dos veces.
Frank Lämmer
2

Simplemente agregue @import "../../styles.less";(o donde sea que esté su hoja de estilo) a bootstrap.less en la parte inferior. Esto le permite usar mixins Bootstrap como .gradiento .border-radiusdentro de sus propios estilos.

dallen
fuente