Mostrando las entradas con la etiqueta css. Mostrar todas las entradas
Mostrando las entradas con la etiqueta css. Mostrar todas las entradas

2017/12/04

CSS: Checkbox hack para controles personalizados

¿Cómo aplicar un estilo como respuesta a un click, usando sólamente CSS?

Se puede hacer con el checkbox hack.

Principio

  • Un label asociado a un input puede recibir el click por él
    • Puede haber varios labels para un mismo input
    • Ocultando el input (difícil de personalizar), queda el label para contener un control más fácil de personalizar
  • La pseudoclass :checked permite ubicar un checkbox seleccionado
  • El selector aaa + bbb permite seleccionar un bbb que esté (declarado) inmediatamente después de un aaa

Patrón 1

HTML:
<input id="checkbox-control" type="checkbox">
<label for="checkbox-control">Control</label>

CSS:
#checkbox-control:checked + label {...}

Patrón 2

HTML:
<label for="checkbox-control">Control</label>
<input id="checkbox-control" type="checkbox">
<div class="target">Target</div>

CSS:
#checkbox-control:checked + .target {...} 

Patrón 3

HTML:
<input id="checkbox-control" type="checkbox">
<label for="checkbox-control">Control</label>
<div class="target">Target</div>

CSS:
#checkbox-control:checked + label {...}
#checkbox-control:checked + label + .target {...}

Ideas de aplicación

  • Checkbox personalizado
    • Toggle
  • Tabs
  • Dropdown menu
  • Dot control para slider
  • Árbol desplegable
Ver unos ejemplos en A check studio, en CodePen

Referencias




2017/06/02

Jugando con asteriscos en CSS

Inspirado por el logo de JWT, se me ocurrió jugar a formar asteriscos como una rotación de una barra.

Logo JWT


Para el caso de 6 líneas, probé crear con Sass un mixin que escriba el código repetitivo.

2016/10/12

Posicionando el footer con Flexbox

Una forma de posicionar el footer, con Flexbox.

Cómo hacer que el footer esté siempre al fondo de la página, aún cuando el contenido sea mínimo.

Idea

  • El container usa display: flex
    • flex-direction: column para indicar disponer los elementos verticalmente
    • justify-content: space-between para que los elementos se separen hasta ocupar toda el área
      • Para que área tenga toda la altura, el html, body y el mismo container tienen height: 100%
  • Para indicar la altura de un elemento dentro del flex, se puede usar algo como flex-basis: 50px
    • Para indicar que el elemento no se pueda contraer, flex-shrink: 0
  • Para indicar que main ocupe toda la altura posible, flex: 1 (por default los demas están en 0)
 

2014/11/20

Luces de espera con CSS3

Algunos ejemplos de luces de espera usando animaciones CSS (hacer click en Result):

Light Waiting

Ring Light Waiting

Iris Lights Waiting

Iris Lights Waiting (Infinite shape)

2014/04/24

Un background con inline css es contenido funcional

Se prefiere que en el HTML esté el contenido y en el CSS la presentación.

De ese modo, viven independientes. Es posible cambiar el .css por otro y dar un aspecto totalmente nuevo a la página.

Una imagen en background se considera presentación. No le corresponde un tag ni un nodo de texto. Pero quizás se pueda hablar de contenido funcional.

Una imagen que es contenido:

index.html
<div class="foto"> <img src="imagen.jpeg" /> </div>

Si ahora pusiera la imagen como background definido en CSS:

style.css
.foto {
 background: url('imagen.jpg') no-repeat;
}

index.html
<div class="foto"> </div>

Al hacer eso, imagen.jpg deja de ser contenido y pasa a ser presentación.

Pero, si el css no estuviera en un archivo aparte, sino inline:

index.html
<div class="foto" style="background: url('imagen.jpg') no-repeat;"> </div>

Entonces, imagen.jpg se podría considerar como contenido.

Cierto que está definido usando CSS, pero es inline, está pegado al HTML y en el flujo de trabajo se puede tratar de modo similar a un img. Es como si fuera contenido.

Estas serían formas de definir contenido de manera no tradicional:
  • Usando background en inline css
  • Usando un inline script
    <div class="texto"><script>document.write('Hola Mundo!');</script></div>



2012/07/05

L Button

¿Es posible hacer hover de un botón con forma que no sea rectangular (por ejemplo, con forma de L)?

Aquí un ensayo de la idea: http://jsfiddle.net/rulokc/evbhg/

2012/05/25

Vertical Site

Introducción
La motivación fue hacer un site similar a:
Revisando believein (pude bajar el site usando wget, Firebug y un poco de paciencia), me resultaba un poco difícil encontrar la clave del comportamiento que veía.

Encontré una aproximación en Curtain.js. Sin embargo, cuando requería modificar la presentación, también me resultaba un poco difícil encontrar dónde hacerla.

Decidí reinventar la rueda de este caso, para tratar de comprender las ideas del proceso de solución.

Los sites que revisé me dieron pistas.

En este tutorial trato de resumir el proceso.

vertical-site@github

Simple HTML
  • Todo el contenido está presente en el mismo documento.
  • El contenido se divide en secciones a las que denomino pages.
  • Cada page es el destino de un link del menú. Esto permite una navegación simple a enlaces internos.
Aplicando estilos básicos:

index.html
style.css

Nav fixed
  • Se fijan los elementos de navegación: cabecera y menú.
    En simple_html, estaban dentro de page-0 (para permitir ver el menú cuando se fuera a HOME). Como ahora serán siempre visibles, eso no es necesario.
  • Se implementa un indicador de posición, que señale en el menú la página activa.
    • En el menú, aparece resaltado el link a.active
    • El link se activa si el url cambia
    • El url cambia
      • cuando se ingresa a mano
      • cuando se hace click en un enlace del menú
      • cuando se hace scroll
    • El plugin address permite responder ante un cambio del url.
index.html
style.css
script.js

Scrollto
  • Scroll animado suave.

index.html
style.css
script.js

(continuará...)

2011/04/23

Cómo sombrear filas alternas con CSS3

A esta forma de presentar filas se le suele llamar cebra.

Caso Tabla

HTML
<table class="zebra">
  <thead>
    <tr>
      <th>Col0</th>
      <th>Col1</th>
      <th>Col2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Item</td>
      <td>Item</td>
      <td>Item</td>
    </tr>
    <tr>
      <td>Item</td>
      <td>Item</td>
      <td>Item</td>
    </tr>
    <tr>
      <td>Item</td>
      <td>Item</td>
      <td>Item</td>
    </tr>
  </tbody>
</table>

CSS
table.zebra tbody tr:nth-child(2n+1) {
  background-color: #eef;
}

Normalmente, las tablas presentan sus celdas con un borde. Para ocultarlo, se puede usar el atributo html border="0". Sin embargo, también se puede hacer usando estilos, con algo como:

table.zebra {
  border-collapse: collapse;
  border-spacing: 0;
}

Caso Lista

HTML
<ul class="zebra">
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
</ul>

CSS
ul.zebra li:nth-child(2n+1) {
  background-color: #eef;
}

Normalmente, las listas presentan sus filas con un bullet. Para ocultarlo, se puede usar estilos, con algo como:

ul.zebra {
  list-style: none;
  padding: 0;
}

2011/04/07

Cómo definir un selector CSS que requiera dos clases


El problema que tenía involucraba bloques similares a:

proyectos-vista_1
<div class="view view-proyectos view-display-id-page_1">
  ...
</div>

proyectos-vista_2
<div class="view view-proyectos view-display-id-page_2">
  ...
</div>

noticias-vista_1
<div class="view view-noticias view-display-id-page_1">
  ...
</div>

noticias-vista_2
<div class="view view-noticias view-display-id-page_2">
  ...
</div>

Necesitaba aplicar un estilo únicamente al bloque proyectos-vista_1. Podría ser más fácil si éste tuviera un id, pero no lo tenía (así lo construye Drupal, en este caso).

La solución la encontré en este artículo. Consiste en usar un selector como:

.view-proyectos.view-display-id-page_1 {
  ...
}

Qué sencillo. No me lo imaginaba :-) Ojalá te sirva de ayuda tambien.

Referencia
Defining A CSS Selector That Requires A Multi-Class Union

2011/02/16

Cómo centrar un bloque en una página 2

En el artículo Cómo centrar un bloque en una página, contaba sobre un método que venía utilizando para lograr centrar un bloque en una página.

Ayer, un amigo me mostró una página posicionada de ese modo que no cabía en la ventana de su navegador Safari. Este mostraba el centro pero no permitía alcanzar la cabecera, ni siquiera usando la barra de scroll. En otros navegadores, como Firefox, Chrome e incluso Internet Explorer, si un bloque no cabe en la ventana, se muestra lo que quepa, de arriba hacia abajo. Pero en el suyo lo hacía desde el centro hacia afuera.

Comprobé que otras páginas que había hecho usando ese método presentaban el mismo problema cuando las veía con Safari y reducía las dimensiones de la ventana.

Buscando la explicacion a esto, encontré el artículo Easy Vertical Centering with CSS, que muestra un método diferente a los usuales, bastante simple y que, sorprendentemente, funciona en todos los navegadores en los que lo he probado, incluyendo Firefox 3.6, Chrome 9, Safari 5, IE8 e IE6.

La idea
La idea básica es mover el top del bloque de contenido al centro de la página y luego corregir el desplazamiento subiéndolo la mitad de la altura del bloque de contenido.

Usualmente, en el bloque de contenido, se usa algo como:

#page {
  width: 960px;
  height: 684px;
  position: absolute;
  top: 50%;
  left: 50%;
  margin-top: -342px;
  margin-left: -480px;
}

Pero presenta el problema del que estamos hablando, que cuando la página es mas alta que la ventana es difícil alcanzar la cima.

Hay otro método que usa una técnica ingeniosa: usar un bloque flotante para jalar al bloque de contenido. Una propiedad del bloque flotante es que jalará mientras se pueda; si algo se interpone (como otro bloque o el borde de la ventana), dejara de hacerlo. Es justamente lo que se necesita.

Aquí, el HTML de una página que usa ese método:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Page Center</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
html, body {
 height: 100%;
 margin: 0;
 padding: 0;
}
body {
 background-color: #eed;
 min-width: 960px;
 min-height: 683px;
}
#vertical-float {
 float: left;
 height: 50%;
 margin-top: -342px; /* half vertical height*/
 width: 100%;
}
#page {
 clear: both;
 background: #fff;
 width: 960px;
 height: 683px;
 margin: 0 auto;
 overflow: auto;
}
</style>
</head>
<body>
<div id="vertical-float"></div>
<div id="page-wrapper">
  <div id="page">
    <h1>Content</h1>
  </div>
</div>
</body>
</html>

Observar que la información de la altura del bloque de contenido (#page) está presente tanto en el bloque de contenido como en el bloque auxiliar (#vertical-float).

Referencias

2010/08/13

Una forma de maquetear

El patrón base de la técnica que describo es usar un elemento posicionado absolutamente dentro de otro posicionado relativamente o absolutamente.

El uso de una imagen guía de fondo y la aplicación de transparencia a los elementos que queremos calzar es de mucha ayuda para posicionarlos con precisión.

Ojalá le sirva de ayuda en este tipo de tareas. Se agradecen comentarios y sugerencias.

Lea más aquí: http://www.scribd.com/doc/35824410/Una-forma-de-maquetear


2010/07/09

Cómo centrar un bloque en una página

Centrar un bloque tanto horizontal como verticalmente es algo que se requiere a veces. Lo ideal es que el centrado se acomode automáticamente cuando la ventana del navegador se redimensiona. La solución podría ser más fácil, pero la familia IE, dificulta un poco el problema.

Nota
Estas soluciones funcionan en la mayoría de navegadores, incluso en IE6, pero recientemente encontré que no es así en Safari. Puede encontrar un método alternativo, que funciona en todos los navegadores, en el artículo Cómo centrar un bloque en una página 2.
    Soluciones
    • En los navegadores estandar (principalmente no-IE6), para lograr que un bloque, por ejemplo #content, de 400px por 100px, quede centrado en la página, se le puede aplicar los siguientes estilos:

          #content {
            width: 400px;
            height: 100px;
            position: absolute;
            top: 0; right: 0; bottom: 0; left: 0;
            margin: auto;
            overflow: auto;
        }

      El truco aquí es que el margin: auto también sirve para el centrado vertical si se especifica height, position: absolute, y además top: 0; right: 0; bottom: 0; left: 0;
      Una limitacion de esta solución es que la altura es fija. El overflow: auto es para que, cuando el contenido haga que #content sobrepase la altura especificada, aparezca un scroll.
    • En IE6, lo anterior no funciona. Es necesario colocar #content dentro de un #container, y usar los siguientes estilos:

          #container {
            position: absolute;
            top: 50%;
        }
        #content {
            width: 400px;
            height: 100px;
            position: relative;
            margin: 0 auto;
            top: -50%;
            overflow: none;
        }

      Aqui se usa la técnica de mover el top del #container hacia abajo el 50% de la altura de su contenedor, body, y luego el top del #content 50% hacia arriba de la altura del mismo #content (debería ser de su contenedor, #container, pero este es un bug de IE6, paradójicamente util para resolver este problema mejor que en el caso estándar, pues permite que la altura vaya más allá del inicial de 100px mientras el bloque se acomoda automáticamente siempre en el centro).
    • En IE7, lo anterior no funciona (así que hay cosas que funcionan diferente en IE6, IE7 y IE8). Es necesario agregar un #container2, y usar los siguientes estilos:

        #container {
          position: absolute;
          height: 50%;
          width: 100%;
        }
        #container2 {
          width: 100%;
          position: absolute;
          bottom: 0;      
        }
        #content {
          background-color: gold;
          width: 400px;
          height: 100px;
          overflow: auto;
          position: relative;
          margin: 0 auto;
          top: 50%;
        }

    • Para combinar estas soluciones en un paquete que funcione para ambos casos, se puede usar la técnica del hack underscore.
      La idea de la técnica es simple e ingeniosa: Normalmente, una propiedad css que comienza con un _, #, un punto, o un número es ignorada por los navegadores estándar (de hecho, anteponer un número al nombre de la propiedad es un truco util para desactivarla), pero IE6 filtra la cadena quitándole ese primer caracter, si es _ o #, para usárla normalmente. De ese modo, sólo para IE6, _position, o #position, se vuelven position, por ejemplo. Del mismo modo, IE7 filtra el punto y .position se vuelve position.
      Asi, luego de tener las cosas listas para los navegadores estándar, se puede intentar agregar o sobrescribir lo que necesitemos para IE6 e IE7, como se muestra a continuación:

        #container {
          _position: absolute;
          _top: 50%;
          .position: absolute;
          .height: 50%;
          .width: 100%;
        }
        #container2 {
          .width: 100%;
          .position: absolute;
          .bottom: 0;      
        }
        #content {
          background-color: gold;
          width: 400px;
          height: 100px;
          position: absolute;
          top: 0; right: 0; bottom: 0; left: 0;
          margin: auto;
          overflow: auto;
          _position: relative;
          _margin: 0 auto;
          _top: -50%;
          _overflow: none;
          .position: relative;
          .margin: 0 auto;
          .top: 50%;
        }

    Referencias

    2010/06/11

    Zen Coding para editar HTML+CSS

    Zen Coding permite construir rápidamente bloques de código HTML y CSS a partir de secuencias mnemotecnicas.

    Por ejemplo, html:4s puede expandirse para producir todo el esqueleto de una página HTM4 strict.

    La siguiente secuencia:

    div#page>div.logo+ul#navigation>li*5>a

    Puede ser expandida para producir:

    <div id="page">
    <div class="logo"></div>
    <ul id="navigation">
    <li><a href=""></a></li>
    <li><a href=""></a></li>
    <li><a href=""></a></li>
    <li><a href=""></a></li>
    <li><a href=""></a></li>
    </ul>
    </div>

    Zen Coding es un plugin disponible para Notepad++, Aptana y Dreamweaver, entre otros. Está disponible en Zen Coding.

    Zen Coding con Notepad++

    La versión para Notepad++ puede descargarse de http://code.google.com/p/zen-coding/downloads/list.

    En mi caso, descargue Zen.Coding-Notepad++.v0.6.1.zip, cuyo contenido copié en el directorio plugins del árbol de Npp (C:\Program Files (x86)\Dev\Notepad++\plugins).
    Zen Coding usa Npp Scripting, que permite extender Npp mediante javascript.
    Luego de eso, la siguiente vez que se inicie Npp encontrará el menú Zen Coding.

    El uso básico es sencillo. Puede escribir una secuencia y luego expandirla presionando CTRL+E.