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