CSS

20 mar, 2014

Pré-processadores CSS e Seletores Parent

Publicidade

Trabalhar com sites e web apps que requerem suporte de exibição da direita para a esquerda (RTL) é difícil porque garantir que o RTL será mostrado corretamente é um pouco complicado, devido ao fato que nós ou não temos as propriedades e valores CSS para fazer isso ou que o suporte existente ainda não é largamente utilizado. Temos valores como start para text-align e propriedades como –moz-margin-start, mas eles não são suportados em todo lugar, apesar de RTL ser um aspecto importante no aspecto global.

Então, o que podemos fazer, afinal? Repetir os seletores com um novo valor RTL e algumas vezes um offset:

/* 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ê tem que mudar sua estrutura CSS aninhada, deve lembrar de fazer isso para o bloco RTL em separado também
  • Se você tem que compensar a regra original, precisa lembrar de fazer isso e inserir uma nova regra

Mexendo com Stylus, eu encontrei uma solução excelente para curar todos esses problemas com um simples mixin:

/* 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 faz entrar em um estado de euforia. Ao invés de ter que copiar e manter a estrutura aninhada, o mixin me permite setar os valores de propriedade para LTR (exibição da esquerda para a direita) e RTL no mesmo local do código, evitando a necessidade de criar blocos RTL separados. E este cenário, de apenas mudar as propriedades dependendo da direção, cobre 95% dos cenários de direção.

Eu sei que LESS também funciona para este padrão, mas não tenho certeza se SASS faz. O que é legal também é que o RTL não é o único cenário onde isso é útil: você poderia usar isso para coisas baseadas em features, como classes CSS Modernizr:

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

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

Sensacional! Essa simples estrutura faz com que codar o CSS e organizar diferentes estados seja um milhão de vezes mais fácil! Em um mundo ideal, os valores e propriedades “start” estariam no lugar correto, mas, até lá, use esse tipo de estratégia para facilitar a sua vida!

***

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