CSS

20 jan, 2014

Pré-processadores CSS e Parent Selectors

Publicidade

Trabalhar em web sites e web apps que necessitam de suporte RTL (Right-to-Left) é difícil, porque assegurar a exibição RTL correta é mais difícil pelo fato de que ou não temos valores e propriedades CSS para fazer isso, ou porque o suporte existente ainda não é amplamente utilizado. Temos valores como start para text-align e temos propriedades como -moz-margin-start, mas elas não são suportadas em todos os lugares, apesar de RTL ser um aspecto importante em sites globais.

Então, o que temos que fazer em última instância? Repetir os seletores com novos valores RTL e às vezes até mesmo compensar:

/* ltr / default */
.some {
	.thing {
		> .is {
			.here {
				margin-left: 20px;
			}
		}
	}
}

/* rtl */
html[dir=rtl] {
	.some {
		.thing {
			> .is {
				.here {
					margin-right: 20px;
					margin-left: 0;
				}
			}
		}
	}
}

Eu considero isso um pesadelo por algumas razões:

  • Se você tiver que mudar o padrão da estrutura CSS aninhada, você precisará se lembrar de fazê-la também para o bloco RTL.
  • Se você tiver que compensar a regra original, será preciso se lembrar de compensar a original e também ajustar a nova regra.

Ao consertar estilos, encontrei uma excelente solução para sanar todos esses problemas de uma vez com uma mistura simples:

/* mixin definition ; sets LTR and RTL within the same style call*/
bidi-style(prop, value, inverse-prop, default-value) {
	{prop}: value;

	html[dir=rtl] & {
		{inverse-prop}: value;
		{prop}: default-value;
	}
}

/* usage */
.some {
	.thing {
		> .is {
			.here {
				bidi-style(margin-left, 20px, margin-right, 0); /* setting LRT and RTL! */
			}
		}
	}
}

O mixin acima é simples, mas me deixa num estado de euforia. Em vez de ter que copiar e manter a estrutura aninhada, esse mixin me permite ajustar os valores das propriedades para LTR e RTL no mesmo lugar no código, evitando a necessidade de criar blocos RTL separados. E esse cenário, de uma simples troca de propriedades dependendo da direção, cobre 95% dos cenários de direções.

Eu sei que o LESS também favorece esse padrão, mas não estou certo de que SASS faz o mesmo. O que também é legal é que RTL não é o único cenário onde isso é útil; você pode usar isso também para coisas baseadas em recursos como classes CSS do Modernizr:

.gradient-background {
	background-image: linear-gradient(top, #555, #333);

	.no-cssgradients & {
		background: url("background.png")
	}
}

Brilhante! Essa estrutura simples torna escrever código CSS e organizar diferentes estados um milhão de vezes mais fácil. Em um mundo ideal, a propriedade e os valores “start” estariam no lugar, mas, até lá, use esse tipo de estratégia para tornar a sua vida mais fácil!

***

Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://davidwalsh.name/stylus-parent-selectors