Archivo de la categoría: CSS y Maquetación

CSS & maquetación

Chrome redimensiona mas imágenes dentro de una tabla.

Me ha pasado algo curioso y solo en chrome de momento. Tengo un texto en una celda y una imagen en la otra. El problema vino cuando usé un max-width:100% para las img en general. En ese momento toda imagen que estuviera dentro de un <td> pasó a redimensionarse:

broken

Ok, Chrome también tiene sus cositas. La solución ha sido la siguiente:

/* Quiero que todas las img usen como mucho el 100% */
img {
  max-width: 100%;
}
/* Pero si la imagen está dentro de un td anulamos el max-width para evitar ese comportamiento raro. */
table tr td > img {
  max-width: none;
}

Resultado:
fixed

Y todos felices. Chau!

CSS & maquetación

Front-end: Maquetar un buscador (input + botón) para que sea 100% fluido / responsive

La idea detrás de esto fue lograr que el buscador esté siempre al 100% del espacio que tenga disponible y no tener que preocuparme de dimensionar los input para que encajen y que el botón no caiga a dos lineas cuando se queda sin espacio.

Pueden ver como funciona si re dimensionan la ventana del navegador:

See the Pen vJBnL by Marcelo Tosco (@capynet) on CodePen.

CSS & maquetación

Front-end: Títulos multi linea con padding por cada una de las lineas

Así es como vemos un titulo cuando tiene aplicado un padding sin mas

texto-multilinea-error

Y asi es como queremos que se vea

titulo-con-padding-en-cada-linea

No voy a explicar toda la lógica que hay detrás de esto. Vayamos a la solución.

Este es el html. en div.titulo tenemos el background y en .highlight el background del texto, el padding que queremos que tenga y el hack mediante la propiedad box-shadow que es la que nos termina agregando los pedacitos de padding que nos falta entre lineas.

<div class="titulo">
    <span class="highlight">Títulos multi linea con padding por cada linea</span>
</div>
.titulo {
    padding-top: 32px;
    width: 700px;
    height: 200px;
    text-align: center;
    font-family: arial, helvetica, sans-serif;
    background: url('fondo.jpg') no-repeat 50% 50%;
}
.highlight {
    font-size: 50px;
    text-transform: uppercase;
    text-align: center;
    color: #fff;
    /*Esto es lo importante*/
    display: inline; /* Aseguramos que el elemento sea inline */
    background: black; /* Color de fondo del texto */
    line-height: 1.6em; /* Espaciado entre lineas */
    padding: 7px 0; /* padding deseado */
    box-shadow: 14px 0 0 black, -14px 0 0 black;
}

Del CSS que puse solo hagan caso a las lineas que tienen “/*Esto es lo importante*/“. El resto es decoración.

No comenté el box-shadow porque prefiero hacerlo aquí: La magia se da en box-shadow. Solo tienes que tocar dos parámetros. El color cámbialo de black al que hayas puesto en la propiedad background, y los valores 14px y -14px ajustalos para arriba o para abajo hasta que te guste el padding lateral que hay en cada una de las lineas.

Listo!

Artículo original: css-tricks.com

CSS & maquetación

CSS: Centrar vertical y horizontalmente un elemento sin saber su tamaño

Centrar un elemento cuando se sabe el tamaño que tiene es fácil. Pero y si el elemento que queremos centrar tiene un tamaño expresado en % o no tiene un tamaño especificado, ya no es tan fácil centrarlo.

Ahora que prácticamente IE8 ya no se usa, lo podemos quitar de la ecuación y usar CSS un poco mas avanzado.
Dicho lo anterior, ahora que podemos usar la propiedad transform: translate();, ya podemos centrar vertical y horizontalmente cualquier elemento.

<div class="centrado-porcentual">
  No nos hace falta conocer el tamaño de esta caja para poder centrarla vertical y horizontalmente :)
</div>
.centrado-porcentual {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    -webkit-transform: translate(-50%, -50%);
}

Resultado:
centrado-vert-hoz-transform

NOTA: si el elemento que quieres centrar está dentro de otro, recuerda que el padre tiene que tener una posición relativa.

Chau!

Idea original: css-tricks.com

Calcular el porcentaje de transparencia para “progid:DXImageTransform.Microsoft.gradient”

En versiones de IE <= 8 es normal tener que usar:

filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#d8ffffff', endColorstr='#d8ffffff');

para aplicar transparencia a un background. Pero como se puede ver, no está muy claro donde poner el porcentaje de transparencia que queremos.

En el ejemplo del principio el truco que estamos usando es aplican un degradado que va desde blanco a blanco, pero por delante de cada color tenemos “d8“, que corresponde al valor alpha de RGBA (AARRGGBB). Pero está en hexadecimal y nosotros estamos acostumbrados a usar valores decimales (tipo opacity: 0.5).

Para saber que valor tenemos que poner si queremos por ejemplo un 50% de opacidad simplemente tenemos que hacer esta cuenta:

255 * 0.5 = 127.5 (redondeando queda en 127).

A este resultado lo pasas por alguna aplicación que convierta valores decimales a hexadecimales como por ejemplo ésta lo que te va a dar “7F“. Y ya está, Nuestro filtro anterior modificado quedaría como:

Blanco al 50%:

filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#7Fffffff', endColorstr='#7Fffffff');

Chau!

CSS & maquetación

Crea tus iconfont a medida con IcoMoon

IcoMoon es genial, siempre que veo un iconfont o un pack de iconos armado con sprite tengo que sopesar si los KB que trae con sigo me va a compensar, al fin y al cabo suelo usar 5 o 10 iconos de los cientos que estos pack traen.

icomoon

Y acá es donde IcoMoon me enamoró. Podes seleccionar de entre un basto listado de iconos cuales querés y luego descargar un iconfont o iconpack que pese lo mínimo.

En este blog pueden ver en el footer que puse unos iconos muy lindos, pues son una iconfont que completa (css + .eot + .ttf + .svg + .woff) son 17.8kb (aunque estrictamente hablando en realidad por browser hablamos de una media de 5KB ya que no se cargan todas las variantes de la fuente).

Úsenlo que esta muy bueno!.
Chau!

Enlace a la APP

CSS & maquetación

Crear selectores dinámicos con scss/sass

Esta característica me encanta. SCSS/SASS (aka SCSS) nos permite crear selectores de forma dinámica.
Esto quiere decir que podemos reutilizar de una forma mucho mas eficiente y elegante nuestras estructuras CSS.

Por ejemplo, imagina que con CSS maquetas un menú que tiene esta estructura:

<div class="menu-principal">
    <ul>
        <li>
            <a href="/home">Inicio</a>
        </li>
    </ul>
</div>
#menu-principal {
    border-bottom: 5px solid #0062A0;
}
#menu-principal ul {
    border-bottom: 2px solid #F5E742;
}
#menu-principal ul li {
    background: none repeat scroll 0 0 #ADFF2F;
}
#menu-principal ul li a {
    color: #8B0000;
}

Ok, el problema con CSS es que reutilizar código imposible, simplemente no existe la encapsulación en el, y de ahí que hayan nacido compiladores CSS como SCSS (SASS).

En nuestro ejemplo vamos a crear una versión de nuestro CSS en SCSS para poder reutilizar las reglas CSS sin importar como se llame el contenedor (en este caso vemos que se llama “menu-principal”):

@mixin dinamico($selector) {
  #{$selector} {
  }
}
@include dinamico("#primary-menu");

Lo que hice acá es un mixin (una funcion) y luego la invoqué.
El resultado será:

#primary-menu {
}

La ventaja es obvia, podemos crear un mixin que genere estructuras comunes de menú (verticales, horizontales) sin importar el nombre del selector, siempre que el markup sea el mismo (ideal para Drupal, WordPress y cualquier programa que tenga un output estándar para sus estructuras HTML).

Hagamos el ejemplo inicial en SCSS:

@mixin menu-vertical($menu-selector) {
  #{$menu-selector} {
    border-bottom: 5px solid #0062A0;
    ul {
      border-bottom: 2px solid #f5e742;
      li {
        background: #adff2f;
        a {
          color: #8b0000;
        }
      }
    }
  }
}
@include menu-vertical("#menu-principal");

Listo, una vez declarado solo hemos usado ‘@include menu-vertical(“#menu-principal”);’ para generar todo el CSS usando “#menu-principal” como selector base, aunque nada nos impide usar ‘@include menu-vertical(“.otro-menu-de-otro-proyecto”);’ para aprovecharlo en otros proyectos.

Chau!

internet-explorer-logo

IE aplica degradé sobre imagenes transparentes [solución]

Tengo que decirlo: es alucinante los bug que tiene IE (da igual la versión, nunca terminan de solucionarlos).

El ultimo con el que me di es que si usas una imagen transparente para hacer un fondo transparente, se va a ver genial en todos los navegadores menos en Internet Explorer (7 y 8, el 9 no se)

Así es como debería verse:

Y asi es como se ve en IE:

Curioso… bueno googleando un poco di con la respuesta y es básicamente un comportamiento no deseado. Al señor no se le ocurre mejor idea que degradar un fondo transparente que se repita (background-repeat: repeat;) siempre que la imagen sea de 1pxX1px…. raro. Eso me va a enseñar a querer optimizar imagenes :P

por si no quedó claro, hay que hacer la misma imagen pero con por tamaño “prudente”: 10pxX10px para que IE no crea que tiene que degradar la imagen ¬¬

internet-explorer-logo

Solución al box-model en ie7 usando jQuery

Sé que hay soluciones hechas para este problema en particular, pero pesa 33k y solo necesitamos unas líneas como van a ver para lograr lo mismo…

Sabido es que a ie se la sudan los estándares y cuando los incorporan por lo general lo hacen taaarde.
La propiedad CSS “box-sizing” no es la excepción.

Ya sabemos que el siguiente CSS va a arreglar los desfases que se dan cuando un input que esta con un width:100%; dentro de un div que tiene un ancho fijado.

.elemento {
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
}

Y como comente en el post anterior, esta propiedad no está soportada en ie7.

Soluciones hay de todo tipo, pero lo cierto es que teniendo jQuery en todos mis desarrollos, se me hiso más que obvia la decisión de usar un script que arregle este bug en lugar de usar cosas más raras (archivos .htc por ejemplo).

Para implementar la solución solo necesitas poner este script:

$(document).ready(function () {
    if ($.browser.msie && ($.browser.version.substr(0, 1) == 7 || $("meta[content='IE=EmulateIE7']").length > 0)) {
        $(".ie7Fix-Box-model").each(function (i, v) {
            var el = $(v);
            //calculamos
            var pL = el.css("paddingLeft").replace("px", "") != "" ? el.css("paddingLeft").replace("px", "") : 0;
            var pR = el.css("paddingRight").replace("px", "") != "" ? el.css("paddingRight").replace("px", "") : 0;
            var bLW = el.css("borderLeftWidth").replace("px", "") != "" ? el.css("borderLeftWidth").replace("px", "") : 0;
            var bRW = el.css("borderRightWidth").replace("px", "") != "" ? el.css("borderRightWidth").replace("px", "") : 0;
            var newSize = el.width() - (parseInt(pL, 10) + parseInt(pR, 10) + parseInt(bLW, 10) + parseInt(bRW, 10));
            //le aplicamos el nuevo tamaño
            el.width(newSize);
        });
    }
});

Y ponerle la class “ie7Fix-Box-model” a todos los input que necesites arreglar.

Ver ejemplo (vean el codigo fuente)

CSS & maquetación

Como evitar que los input excedan el tamaño del div que los contiene

Siempre trato de ser practico y dar pocas explicaciones del porque llegamos a donde llegamos, así que si quieren saber porque falla pueden leer esto.

Para lograr que un input pase de esto:

A esto:

Al input que les está dando problemas pónganle los el siguiente selector:

.elemento{
	-moz-box-sizing: border-box;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

Básicamente va a sumar los padding y bordes que tenga aplicado el “elemento” a lo que el navegador considera un width del 100%.

NOTA: en ie7 no funciona para nada esta solución pero tranquilos que otro día pongo alguna solución para él.