Alex Team FORMATION CSS DEFINITION (WIKIPEDIA) : CSS (CASCADING STYLE SHEETS : FEUILLES DE STYLE EN CASCADE) EST UN LANGAGE INFORMATIQUE QUI SERT A DECRIRE LA PRESENTATION DES DOCUMENTS HTML ET XML. LES STANDARDS DEFINISSANT CSS SONT PUBLIES PAR LE WORLD WIDE WEB CONSORTIUM (W3C). INTRODUIT AU MILIEU DES ANNEES 1990, CSS DEVIENT COURAMMENT UTILISE DANS LA CONCEPTION DE SITES WEB ET BIEN PRIS EN CHARGE PAR LES NAVIGATEURS WEB DANS LES ANNEES 2000. SOMMAIRE Histoire et enjeux du CSS ........................................................................................................................................ 4 L’histoire du standard ......................................................................................................................................... 4 Un concept parmi d'autres, présent dès l'origine du web .............................................................................. 4 Les premiers développements – CSS 1............................................................................................................ 4 CSS2, des ambitions précipitées...................................................................................................................... 4 CSS 2.1, retour aux implémentations .............................................................................................................. 4 CSS3, implémentation modulaire ................................................................................................................... 4 Les enjeux............................................................................................................................................................ 5 Séparer la structure d'un document de ses styles de présentation ................................................................ 5 Décliner les styles de présentation selon le récepteur ................................................................................... 5 Permettre la cascade des styles ...................................................................................................................... 6 Principes techniques et syntaxe de CSS .................................................................................................................. 7 Les concepts fondamentaux ............................................................................................................................... 7 Sélecteurs et blocs de règles ........................................................................................................................... 7 Propriétés et valeurs ....................................................................................................................................... 7 Boites et flux CSS ............................................................................................................................................. 7 Points techniques ................................................................................................................................................ 7 La propriété « display » ................................................................................................................................... 7 Les blocs flottants ......................................................................................................................................... 10 Positionnement ............................................................................................................................................. 11 Collapsing ...................................................................................................................................................... 11 Unités de mesure .......................................................................................................................................... 13 Priorités des sélecteurs ................................................................................................................................. 14 Point sur les sélecteurs ..................................................................................................................................... 14 Sélecteurs compatibles IE6 ........................................................................................................................... 14 Sélecteurs compatibles IE7 ........................................................................................................................... 17 Sélecteurs compatibles IE8 ........................................................................................................................... 20 Cibler le dispositif de visualisation .................................................................................................................... 21 @media ......................................................................................................................................................... 21 Hack CSS ........................................................................................................................................................ 22 Les plus gros bugs et particularités d’IE6 et IE7 ............................................................................................ 22 Critiques et avenir du standard CSS ...................................................................................................................... 25 Les limites du CSS .............................................................................................................................................. 25 Indépendance de la présentation et de la structure ..................................................................................... 25 Accessibilité ................................................................................................................................................... 25 Simplicité ....................................................................................................................................................... 26 Un avant gout de CSS 3 ..................................................................................................................................... 26 Implémentations propriétaires (navigateur) ................................................................................................ 26 Quelques propriétés ..................................................................................................................................... 26 Font-face ....................................................................................................................................................... 29 Modèles de boite flexible .............................................................................................................................. 29 BONUS : LessCSS ................................................................................................................................................... 33 Variables ............................................................................................................................................................ 33 Mixins ................................................................................................................................................................ 33 Nested Rules ..................................................................................................................................................... 33 Operations......................................................................................................................................................... 34 HISTOIRE ET ENJEUX DU CSS Les origines des CSS sont liées à trois alternatives majeures : - HTML est-il un format de structuration ou un format mixte de mise en forme et de structuration ? Les choix de présentation de l'auteur doivent-ils avoir la primauté sur ceux de l'utilisateur ? La réponse aux besoins est-elle un format de description de la mise en forme, ou un langage de transformation ? L’HISTOIRE DU STANDARD UN CONCEPT PARMI D'AUTRES, PRESENT DES L'ORIGINE DU WEB - - En 1992, le premier navigateur Web (« WorldWideWeb », renommé par la suite « Nexus ») recoure à un mécanisme permettant de déterminer le rendu des polices de caractères, des couleurs ou de l'alignement du texte. Il ne s'agit cependant pas de styles déterminés par l'auteur du document. Les premières implémentations HTML ne comportant pas non plus d'éléments de présentation. Courant 1994-1995, le tout nouveau Netscape Navigator introduit les premiers éléments HTML de présentation, tandis qu'apparaissent concurremment les premières propositions de formats de styles externes. LES PREMIERS DEVELOP PEMENTS – CSS 1 - - La spécification CSS1 finale est publiée le 17 décembre 1996, et définit une cinquantaine de propriétés tout en ayant en vue une compatibilité ascendante. En 1996, Internet Explorer 3.0 est le premier navigateur commercial à implémenter partiellement CSS alors que celle-ci est encore en cours de formulation. Netscape Navigator milite quant à lui pour le JSSS. En 2000, Internet Explorer 5.0 pour Macintosh lancé en mars 2000, basé sur Tasman, un moteur de rendu spécifique sans rapport avec Trident, est le premier navigateur à supporter complètement (à plus de 99 %) CSS1. Il introduit également le système de Doctype Switching. CSS2, DES AMBITIONS PRECIPITEES - Interruption du développement d'Internet Explorer, navigateur dominant du marché, de 2001 à 2006. Håkon Lie écrivait en effet en 2005 : « 2001 est un tournant pour CSS. C'est l'année où Microsoft produit Internet Explorer 6.0 qui offre une prise en charge fonctionnelle, bien qu'incomplète et buggée, de CSS (…). Aucun autre navigateur n'a été capable de concurrencer WinIE en termes de nombre d'utilisateurs. WinIE a, de ce fait, déterminé le sous-ensemble de CSS utilisable par les auteurs. La prise en charge limitée de CSS par WinIE, combinée à un monopole de fait en matière de navigateur Web, est actuellement le plus grave problème du déploiement de CSS. » CSS 2.1, RETOUR AUX IMPLEMENTATIONS - Les retours d'implémentation de CSS2 conduisent le groupe de travail CSS du W3C à rédiger à partir de 2001 une version révisée CSS 2.1 (« CSS Level 2, Revision 1 »), sur la base de ce qui était effectivement adopté par les différents navigateurs. CSS3, IMPLEMENTATION MOD ULAIRE Le développement du troisième niveau des feuilles de styles en cascade commence dès 1999, parallèlement à celui de CSS 2.1. En 2008, aucun module CSS 3 n'est considéré comme terminé par le W3C, et l'implémentation dans les navigateurs est donc marginale, souvent à titre de test, comme les fonctions -moz-xxx du moteur Gecko, dont le préfixe limite l'utilisation aux seuls navigateurs basés sur Gecko. LES ENJEUX SEPARER LA STRUCTURE D'UN DOCUMENT DE SES ST YLES DE PRESENTATION L'un des objectifs majeurs de CSS est de permettre la mise en forme hors des documents. Il est par exemple possible de ne décrire que la structure d'un document en HTML, et de décrire toute la présentation dans une feuille de style CSS séparée (cf Zen Garden). Les styles sont appliqués au dernier moment, dans le navigateur web des visiteurs qui consultent le document. Cette séparation fournit un certain nombre de bénéfices, permettant d'améliorer l'accessibilité, de changer plus facilement de présentation, et de réduire la complexité de l'architecture d'un document. Ainsi, les avantages des feuilles de style sont multiples : - - - La structure du document et la présentation peuvent être gérées dans des fichiers séparés. La conception d'un document se fait dans un premier temps sans se soucier de la présentation, ce qui permet d'être plus efficace. Dans le cas d'un site web, la présentation est uniformisée : les documents (pages HTML) font référence aux mêmes feuilles de styles. Cette caractéristique permet de plus une remise en forme rapide de l'aspect visuel. Un même document peut donner le choix entre plusieurs feuilles de style, par exemple une pour l'impression et une pour la lecture à l'écran. Certains navigateurs web permettent au visiteur de choisir un style parmi plusieurs. Le code HTML est considérablement réduit en taille et en complexité, puisqu'il ne contient plus de balises ni d'attributs de présentation. DECLINER LES STYLES DE PRESENTATION SELON LE RECEPTEUR CSS permet de définir le rendu d'un document en fonction du média de restitution et de ses capacités (type de moniteur ou de dispositif vocal), de celles du navigateur (texte ou graphique), ainsi que des préférences de son utilisateur. Les feuilles de styles peuvent être différenciées pour les médias suivants, selon CSS2.1 : - all : quel que soit le média screen : écrans d'ordinateur de bureau print : pour l'impression papier handheld : écrans de très petite taille et clients aux capacités limitées (ex: WAP, mais pas iPhone) projection : quand le document est projeté tv : quand le document est affiché sur un appareil de type télévision speech : pour le rendu via une synthèse vocale (remplaçant aural, initialement prévu par CSS2.0 puis déprécié par CSS2.1) Dans chaque média, les styles de présentation déterminés par l'auteur du document se combinent avec ceux par défaut de l'agent utilisateur et ceux issus des préférences de l'utilisateur et de sa configuration personnelle. Les capacités du récepteur peuvent être prises en compte par les auteurs, à destination des agents utilisateurs implémentant le module CSS3 « media queries » : celui-ci permet de conditionner la prise en compte d'une feuille de style à des contraintes concernant notamment la résolution ou la capacité de restitution des couleurs. PERMETTRE LA CASCADE DES STYLES La « cascade » est la combinaison de différentes sources de styles appliqués à un même document, selon leur degré respectif de priorité. Différents modes de cascade peuvent se combiner : - - - par origine des styles, issus de l'agent utilisateur, de l'auteur et de l'utilisateur. La priorité supérieure accordée aux styles de l'utilisateur est un des facteurs principaux de l'accessibilité des documents présentés à l'aide de CSS. par média : une feuille de style générique peut s'appliquer à plusieurs média de restitution (affichage à l'écran, impression, projection) et être combinée avec des feuilles propres à chaque média. selon l'architecture d'un ensemble de documents web : une feuille de style générique peut s'appliquer à la totalité des pages d'un site web, être combinée avec des feuilles propres à chaque rubrique de celui-ci, ainsi qu'avec des styles propres à telle ou telle page spécifique. selon l'architecture des feuilles elles-mêmes : une feuille de style externe au document peut être combinée à une feuille de style interne et à des styles appliqués directement à chaque élément qui le compose (styles « en ligne »). Une feuille de style peut également importer une ou plusieurs autres feuilles externes. PRINCIPES TECHNIQUES ET SYNTAXE DE CSS LES CONCEPTS FONDAMENTAUX SELECTEURS ET BLOCS DE REGLES Les propriétés sont regroupées par blocs de règles, délimités par les accolades {}. Chaque bloc est précédé d'un sélecteur désignant les éléments structurels auxquelles les propriétés concernées doivent être appliquées : p { font-size: 110%; font-family: Helvetica, sans-serif; } Bien que ce code CSS ne décrive pas la totalité de la présentation d'un document, il constitue à lui seul une feuille de style à part entière. Il fixe pour les éléments p (paragraphe), le paramètre de taille à la valeur 110% et le paramètre de police à la valeur Helvetica, ou, si Helvetica est indisponible, une police générique sans serifs. PROPRIETES ET VALEUR S Les propriétés CSS ont été établies selon un compromis entre deux contraintes opposées : faciliter la lecture des feuilles de styles par les agents utilisateurs en multipliant les propriétés individuelles, ou faciliter leur écriture par les auteurs en recourant à un nombre plus réduit de propriétés combinées. Par exemple, la position d'une image d'arrière-plan est déterminée par une propriété unique (background-position), combinant les deux valeurs d'abscisse et d'ordonnée, et non par deux propriétés distinctes. De même, il existe des propriétés raccourcies permettant aux auteurs de simplifier l'écriture d'une série de propriétés : le raccourci font permet, par exemple, de résumer en une seule règle l'ensemble des propriétés de police de caractères, de taille, de hauteur de ligne, de casse, de graisse et d'italique. BOITES ET FLUX CSS Le rendu d'un document stylé est déterminé par les concepts de boîte et de flux. Le moteur de rendu CSS établit une « structure de formatage » reflétant l'arbre logique du document. Chaque élément de cette structure génère une ou plusieurs zones dotées de propriétés d'affichage paramétrables. L'affichage s'effectue à partir du flux des boîtes successivement générées pour chaque élément tel qu'il apparaît dans l'ordre linéaire de la structure de formatage. POINTS TECHNIQUES LA PROPRIETE « DISPLAY » Selon les cas de figures, ces différents types de boîtes : - - peuvent avoir des propriétés de marges, de bordure, d'arrière-plan, de largeur ou de hauteur, etc. Dans un rendu vocal, des propriétés équivalentes permettent de déterminer des pauses dans la lecture avant ou après le contenu, de choisir une voix, de régler son débit ou son niveau sonore. peuvent être déplacées par rapport à leur position par défaut dans le flux, ou avoir un comportement particulier dans celui-ci (permettre un rendu en colonnes adjacentes, se superposer aux boîtes voisines, ou être masquées par exemple). DISPLAY : NONE Un élément display : none est retiré entièrement du flux. Du coup on ne le voit plus, il ne prend plus aucune place, comme s’il n’existait pas. DISPLAY : BLOCK Les éléments de rendu CSS block se placent toujours l'un en dessous de l'autre par défaut (comme un retour chariot). Par exemple: une suite de paragraphes (balise <p>). Par ailleurs, un élément "bloc" occupe automatiquement, par défaut, toute la largeur disponible dans son conteneur et peut être dimensionné à l'aide des propriétés telles que width, height, min-width, ou min-height, … L’imbrication des éléments caractéristiques d’un block sont souvent mal comprises. Par exemple : un bloc avec un fond bleu, une largeur de 100px et un padding de 10px aura une « largeur bleue » de 120px, car le fond contient la largeur et le padding. DISPLAY : INLINE Les éléments de rendu inline se placent toujours l'un à côté de l'autre afin de rester dans le texte (par exemple la balise <strong>). Par défaut, il n'est pas prévu qu'ils puissent se positionner sur la page, ni de leur donner des dimensions (hauteur, largeur, profondeur) : leur taille va être déterminée par le texte ou l'élément qu'ils contiennent, de sorte à prendre la plus petite taille possible. Certaines propriétés de marges peuvent être appliquées aux éléments, comme les marges latérales. DISPLAY : INLINE-BLOCK Les éléments de rendu inline-block conservent les mêmes caractéristiques que les "inline", mais peuvent être dimensionnés, par exemple la balise <input>. An inline block is placed inline (ie. on the same line as adjacent content), but it behaves as a block. The real use of this value is when you want to give an inline element a width. In some circumstances some browsers don't allow a width on a real inline element, but if you switch to display: inline-block you are allowed to set a width. Fonctionne sur IE 6, mais uniquement si appliqué à un élément qui est naturellement inline (ex : <span>) DISPLAY : TABLE Les éléments de rendu table, table-row, table-cell possèdent le même comportement que les éléments de tableaux et cellules (<table>, <tr>, <td>). Ils permettent de centrer les contenus verticalement et d'avoir des hauteurs identiques entre éléments frères, par exemple la balise <td>. Il existe également inline-table, table-row-group, table-column, table-column-group, table-header-group, tablefooter-group, et table-caption. LES BLOCS FLOTTANTS La propriété float demeure sans doute, malgré des qualités intrinsèques évidentes, la propriété la plus mal comprise mais surtout, la plus mal employée des CSS. Sa simplicité d'utilisation apparente recèle pourtant certaines subtilités fondamentales et lui confère malheureusement un choix inconsciemment systématique pour toute disposition d'éléments en plusieurs colonnes. ROLE & DETOURNEMENT DES FLOTTANTS La propriété float existe avant tout pour répondre à un besoin typographique précis: la création d'habillages. Un habillage est une pratique courante dans le média print consistant à "enrouler" un texte autour d'un élément (graphique ou texte); il était normal de retrouver cette ouverture de mise en page dans notre média favori. À l'instar du positionnement absolu, un élément flottant adopte par défaut la largeur qu'occupe son contenu. Le principe de base est simple: un élément flottant est ôté partiellement du flux et placé à l'extrême gauche (float:left) ou droite (float:right) de son conteneur, forçant par la même occasion tout contenu du flux qui suit à l'envelopper. Deux objets flottants dans la même direction se rangeront côte à côte, seul un contenu demeuré dans le flux qui les succède immédiatement initiera l'habillage. C'est justement ce caractère hâtif de disposition adjacente de blocs qui est la cause d'une mauvaise et sur-utilisation de cette propriété trop souvent écartée de son application originale. NETTOYER LES FLOTTANTS La propriété clear s'utilise conjoitement aux float et permet à un élément (qui peut être d'ailleurs lui-même flottant) de ne plus subir le comportement d'habillage dicté par un objet flottant qui le précède directement et, par conséquent, de se caler en-dessous de ce dernier. Le clear autorise un nettoyage des flottants exclusivement à gauche (clear:left), à droite (clear:right) ou les deux simultanément (clear:both). POSITIONNEMENT STATIC Tout bloc non positionné explicitement est positionné en static. Il est positionné par rapport au flux, et ne peut être déplacé. De ce fait, un élément static ignore les valeurs top, bottom, left, ou right. La position statique (position:static) correspond simplement à la valeur par défaut d'un élément du flux. Il n'y a que peu d'intérêt à la préciser, si ce n'est dans le but de rétablir dans le flux un élément en particulier parmi une série qui serait positionnée hors du flux. RELATIVE Un élément positionné en relative a initialement le même positionnement qu’un élément static, sauf qu’il peut être décalé grâce aux valeurs top, bottom, left, et/ou right. Un élément déplacé de restitue pas la place qu’il prenait, un espace vide peut donc être visible. L’intérêt de ce positionnement reste limité, on souhaite rarement décaler un élément par rapport à sa position d’origine. Néanmoins, le positionnement relatif a un autre effet très intéressant, qui justifie le plus souvent son utilisation : servir de conteneur au positionnement absolu. ABSOLUTE Un élément positionné en absolute est retire du flux. Il est positionné par rapport à son bloc « conteneur ». Un bloc conteneur est un bloc qui n’est pas positionné en static, donc de type relative, absolute ou fixed. Dans le cas où il n’y en a pas, c’est le bloc « html » qui tient le rôle de conteneur. C’est la cause principale de la confusion de ce positionnement avec le positionnement fixed, car sans l’utilisation de conteneur le point d’origine est similaire. Puisqu’un élément positionné en absolute est sorti du flux, la place qu’il prenait est restituée. FIXED Un élément positionné en fixed est retire du flux et positionné par rapport à la fenêtre du navigateur. Du coup, il conserve sa position même si on scroll sur la page. COLLAPSING MARGIN-COLLAPSE Si vous travaillez sur du CSS de manière régulière, vous avez sans doute déjà rencontré ce problème. Je vous présente l’énoncé. En considérant ces balises : <div> <p>This is a paragraph within a <code>div</code></p> </div> Et ce bout de CSS : div { background-color: #3C75AE; color: #fff; margin-top: 10px; } p { margin-top: 20px; margin-bottom: 20px; border: 1px solid #EB6B0E; } En regardant rapidement, on peut s’attendre à obtenir ceci : Sauf qu’en réalité, on obtient ca : Quelle est la cause ? Le phénomène du margin-collapsing (fusion des marges). Les agents utilisateurs qui le supportent considère que les marges verticales des éléments fils ou frères fusionnent si aucun autre élément se met en travers, les marges les plus petites étant éliminées. Illustration : La plupart du temps, ce phénomène correspond au résultat escompté. Un cas typique serait les balises <p>, il n’est pas souhaitable pour des paragraphes avec une marge de 10px que le premier paragraphe soit espacé des 10px puis les autres de 20px (dans ce cas, les marges côte à côte ne font qu’une). Pour rappel, un bloc est constitué d’une marge, d’une bordure et d’un padding. Pour contrer la fusion des marges, il suffit d’intercaller entre la marge du parent et celle du fils une bordure ou un padding. Exemple : div { background-color: #3C75AE; color: #fff; margin-top: 10px; padding-top: 1px; padding-bottom: 1px; } BORDER-COLLAPSE Le border-collapse est similaire au margin collapse, mais s’applique sur les bordures et n’est pas actif par défaut. Très utile pour les <table>, les bordures des cellules d’un tableau, lorsqu’il n’y a pas de cellspacing, fusionnent. De ce fait, une bordure d’1px n’en fera pas visuellement 2px lorsque les cellules sont adjacentes. UNITES DE MESURE ABSOLUES Les unités absolues s’appuie sur des dimensions réelles. Il existe plusieurs unités de longueurs absolues : - pt, point (mesure typographique). Le point est égal à 1/72 de pouce. pc, pica (mesure typographique). Un pica est égal à 12 points. in, pouce (inch). Un pouce est égal à 2.54 cm, 6 picas est égal à pouce. cm, centimètre mm, millimètre RELATIVES Il existe plusieurs unités de longueurs relatives : - px, une quantité de pixels, en fonction de l'appareil de visualisation. em, m-length. ex, x-height. %, en fonction de la valeur de la propriété du parent. L'unité relative em se base sur la hauteur de la police (fonte). L'unité relative em est nommée "cadratin" en typographie française. Anciennement le cadratin correspond à la hauteur d'un caractère de plomb utilisé dans l'imprimerie. Par défaut, l'unité relative em prendra comme hauteur de la taille de police (font) du navigateur spécifiée par défaut ou par l'utilisateur (via la roulette de la souris / affichage->taille de texte). Autrement, l'unité relative em se basera sur la valeur de font-size du bloc parent. L'unité relative em ne varie pas suivant la fonte (police). En règle générale notre navigateur est paramétré sur une taille moyenne ce qui correspond à la valeur de fontsize medium (pour le w3c), cependant cette valeur par défaut varie suivant le navigateur par exemple Internet explorer à une valeur à small. Dans le cas d'éléments imbriqués l'unité relative em se base sur la valeur de 'font-size' du bloc parent. L'unité relative 1em correspond à 100% de la taille de la police par défaut. L'unité relative 1.2em correspond à 120% de la taille de la police par défaut. L'unité relative 0.7em correspond à 70% de la taille de la police par défaut. Mettre vos tailles de polices en unité relative em améliore l'accessibilité de vote site web. PRIORITES DES SELECTEURS Pour permettre la cascade des styles, des règles de calcul de spécificité permettent au moteur de rendu CSS de déterminer le degré de priorité à appliquer à différents sélecteurs visant concurremment un même élément, et de trier ainsi les règles à lui appliquer. Ce calcul repose sur la somme des valeurs données aux différents sélecteurs simples formant le sélecteur contextuel : - chaque type de sélecteur simple a sa valeur de priorité : 0,0,0,1 pour un élément, 0,0,1,0 pour une classe, 0,1,0,0 pour un identifiant unique id. la mention !important ajoutée dans la règle donne une spécificité de 1,0,0,0. l'origine du style est déterminante en dernier ressort : un attribut style présent dans le document HTML a la priorité sur les autres sources de styles auteur, afin de permettre les surcharges locales des styles communs à une série de pages web. D'autre part, à priorités égales, un style utilisateur l'emporte sur un style auteur, qui l'emporte sur le style par défaut de l'agent utilisateur. POINT SUR LES SELECTEURS Les sélecteurs sont utilisés à longueur de journée pour le CSS, mais souvent mal maitrisés. Voici une synthèse d’un article de NetTuts : http://net.tutsplus.com/tutorials/html-css-techniques/the-30-css-selectors-you-mustmemorize/ Les sélecteurs compatibles IE9, issus du CSS3, ne sont pas présentés dans cette synthèse. Il est intéressant de les connaitre car ils sont compatibles avec jQuery. SELECTEURS COMPATIBLES IE6 1. * * { margin: 0; padding: 0; } Let’s knock the obvious ones out, for the beginners, before we move onto the more advanced selectors. The star symbol will target every single element on the page. Many developers will use this trick to zero out the margins and padding. While this is certainly fine for quick tests, I’d advise you to never use this in production code. It adds too much weight on the browser, and is unnecessary. The * can also be used with child selectors. #container * { border: 1px solid black; } This will target every single element that is a child of the #container div. Again, try not to use this technique very much, if ever. 2. #X #container { width: 960px; margin: auto; } Prefixing the hash symbol to a selector allows us to target by id. This is easily the most common usage, however be cautious when using id selectors. Ask yourself: do I absolutely need to apply an id to this element in order to target it? id selectors are rigid and don’t allow for reuse. If possible, first try to use a tag name, one of the new HTML5 elements, or even a pseudo-class. 3. .X .error { color: red; } This is a class selector. The difference between ids and classes is that, with the latter, you can target multiple elements. Use classes when you want your styling to apply to a group of elements. Alternatively, use ids to find a needle-in-a-haystack, and style only that specific element. 4. X Y li a { text-decoration: none; } The next most comment selector is the descendant selector. When you need to be more specific with your selectors, you use these. For example, what if, rather than targeting all anchor tags, you only need to target the anchors which are within an unordered list? This is specifically when you’d use a descendant selector. Pro-tip – If your selector looks like X Y Z A B.error, you’re doing it wrong. Always ask yourself if it’s absolutely necessary to apply all of that weight. 5. X a { color: red; } ul { margin-left: 0; } What if you want to target all elements on a page, according to their type, rather than an id or classname? Keep it simple, and use a type selector. If you need to target all unordered lists, use ul {}. 19. X:HOVER div:hover { background: #e3e3e3; } Oh come on. You know this one. The official term for this is user action pseudo class. It sounds confusing, but it really isn't. Want to apply specific styling when a user hovers over an element? This will get the job done! Keep in mind that older version of Internet Explorer don't respond when the :hover pseudo class is applied to anything other than an anchor tag. You'll most often use this selector when applying, for example, a border-bottom to anchor tags, when hovered over. a:hover { border-bottom: 1px solid black; } Pro-tip - border-bottom: 1px solid black; looks better than text-decoration: underline; 21. X::PSEUDOELEMENT p::first-line { font-weight: bold; font-size: 1.2em; } We can use pseudo elements (designated by ::) to style fragments of an element, such as the first line, or the first letter. Keep in mind that these must be applied to block level elements in order to take effect. A pseudo-element is composed of two colons: :: TARGET THE FIRST LETTER OF A PARAGRAPH p::first-letter { float: left; font-size: 2em; font-weight: bold; font-family: cursive; padding-right: 2px; } This snippet is an abstraction that will find all paragraphs on the page, and then sub-target only the first letter of that element. This is most often used to create newspaper-like styling for the first-letter of an article. TARGET THE FIRST LINE OF A PARAGRAPH p:first-line { font-weight: bold; font-size: 1.2em; } Similarly, the ::first-line pseudo element will, as expected, style the first line of the element only. "For compatibility with existing style sheets, user agents must also accept the previous one-colon notation for pseudo-elements introduced in CSS levels 1 and 2 (namely, :first-line, :first-letter, :before and :after). This compatibility is not allowed for the new pseudo-elements introduced in this specification." - Source SELECTEURS COMPATIBLES IE7 6. X:VISITED AND X:LINK a:link { color: red; } a:visted { color: purple; } We use the :link pseudo-class to target all anchors tags which have yet to be clicked on. Alternatively, we also have the :visited pseudo class, which, as you’d expected, allows us to apply specific styling to only the anchor tags on the page which have been clicked on, or visited. 7. X + Y ul + p { color: red; } This is referred to as an adjacent selector. It will select only the element that is immediately preceded by the former element. In this case, only the first paragraph after each ul will have red text. 8. X > Y div#container > ul { border: 1px solid black; } The difference between the standard X Y and X > Y is that the latter will only select direct children. For example, consider the following markup. <div id="container"> <ul> <li> List Item <ul> <li> Child </li> </ul> </li> <li> List Item </li> <li> List Item </li> <li> List Item </li> </ul> </div> A selector of #container > ul will only target the uls which are direct children of the div with an id of container. It will not target, for instance, the ul that is a child of the first li. For this reason, there are performance benefits in using the child combinator. In fact, it’s recommended particularly when working with JavaScript-based CSS selector engines. 9. X ~ Y ul ~ p { color: red; } This sibling combinator is similar to X + Y, however, it’s less strict. While an adjacent selector (ul + p) will only select the first element that is immediately preceded by the former selector, this one is more generalized. It will select, referring to our example above, any p elements, as long as they follow a ul. 10. X[TITLE] a[title] { color: green; } Referred to as an attributes selector, in our example above, this will only select the anchor tags that have a title attribute. Anchor tags which do not will not receive this particular styling. But, what if you need to be more specific? Well… 11. X[HREF="FOO"] a[href="http://net.tutsplus.com"] { color: #1f6053; /* nettuts green */ } The snippet above will style all anchor tags which link to http://net.tutsplus.com; they’ll receive our branded green color. All other anchor tags will remain unaffected. Note that we’re wrapping the value in quotes. Remember to also do this when using a JavaScript CSS selector engine. When possible, always use CSS3 selectors over unofficial methods. This works well, though, it’s a bit rigid. What if the link does indeed direct to Nettuts+, but, maybe, the path is nettuts.com rather than the full url? In those cases we can use a bit of the regular expressions syntax. 12. X[HREF*="NETTUTS"] a[href*="tuts"] { color: #1f6053; /* nettuts green */ } There we go; that’s what we need. The star designates that the proceeding value must appear somewhere in the attribute’s value. That way, this covers nettuts.com, net.tutsplus.com, and even tutsplus.com. Keep in mind that this is a broad statement. What if the anchor tag linked to some non-Envato site with the string tuts in the url? When you need to be more specific, use ^ and &, to reference the beginning and end of a string, respectively. 13. X[HREF^="HTTP"] a[href^="http"] { background: url(path/to/external/icon.png) no-repeat; padding-left: 10px; } Ever wonder how some websites are able to display a little icon next to the links which are external? I’m sure you’ve seen these before; they’re nice reminders that the link will direct you to an entirely different website. This is a cinch with the carat symbol. It’s most commonly used in regular expressions to designate the beginning of a string. If we want to target all anchor tags that have a href which begins with http, we could use a selector similar to the snippet shown above. Notice that we’re not searching for http://; that’s unnecessary, and doesn’t account for the urls that begin with https://. Now, what if we wanted to instead style all anchors which link to, say, a photo? In those cases, let’s search for the end of the string. 14. X[HREF$=".JPG"] a[href$=".jpg"] { color: red; } Again, we use a regular expressions symbol, $, to refer to the end of a string. In this case, we’re searching for all anchors which link to an image — or at least a url that ends with .jpg. Keep in mind that this certainly won’t work for gifs and pngs. 15. X[DATA-*="FOO"] a[data-filetype="image"] { color: red; } Refer back to number eight; how do we compensate for all of the various image types: png, jpeg,jpg, gif? Well, we could create multiple selectors, such as: a[href$=".jpg"], a[href$=".jpeg"], a[href$=".png"], a[href$=".gif"] { color: red; } But, that’s a pain in the butt, and is inefficient. Another possible solution is to use custom attributes. What if we added our own data-filetype attribute to each anchor that links to an image? <a href="path/to/image.jpg" data-filetype="image"> Image Link </a> Then, with that hook in place, we can use a standard attributes selector to target only those anchors. a[data-filetype="image"] { color: red; } 16. X[FOO~="BAR"] a[data-info~="external"] { color: red; } a[data-info~="image"] { border: 1px solid black; } Here’s a special one that’ll impress your friends. Not too many people know about this trick. The tilda (~) symbol allows us to target an attribute which has a spaced-separated list of values. Going along with our custom attribute from number fifteen, above, we could create a data-info attribute, which can receive a space-separated list of anything we need to make note of. In this case, we’ll make note of external links and links to images — just for the example. <a href="path/to/image.jpg" data-info="external image"> Click Me, Fool </a> With that markup in place, now we can target any tags that have either of those values, by using the ~ attributes selector trick. /* Target data-info attr that contains the value "external" */ a[data-info~="external"] { color: red; } /* And which contain the value "image" */ a[data-info~="image"] { border: 1px solid black; } Pretty nifty, ay? 26. X:FIRST-CHILD ul li:first-child { border-top: none; } This structural pseudo class allows us to target only the first child of the element's parent. You'll often use this to remove borders from the first and last list items. For example, let's say you have a list of rows, and each one has a border-top and a border-bottom. Well, with that arrangement, the first and last item in that set will look a bit odd. Many designers apply classes of first and last to compensate for this. Instead, you can use these pseudo classes. SELECTEURS COMPATIBLES IE8 18. X:AFTER The before and after pseudo elements kick butt. Every day, it seems, people are finding new and creative ways to use them effectively. They simply generate content around the selected element. Many were first introduced to these classes when they encountered the clear-fix hack. .clearfix:after { content: ""; display: block; clear: both; visibility: hidden; font-size: 0; height: 0; } .clearfix { *display: inline-block; _height: 1%; } This hack uses the :after pseudo element to append a space after the element, and then clear it. It's an excellent trick to have in your tool bag, particularly in the cases when the overflow: hidden; method isn't possible. For another creative use of this, refer to my quick tip on creating shadows. According to the CSS3 Selectors specification, you should technically use the pseudo element syntax of two colons ::. However, to remain compatible, the useragent will accept a single colon usage as well. CIBLER LE DISPOSITIF DE VISUALISATION @MEDIA DEFINITION Le média va vous permettre de spécifier le support pour lequel est destiné un ensemble de propriétés css. Par exemple, vous pouvez avoir des propriétés css destinées à l'affichage sur l'écran et d'autres propriétés css destinées à l'impression de la page. Exemple de code : <style media="screen">/*Affichage écran*/</style> <style media="print">/*impression*/</style> COMMENT LE SPECIFIER? Vous pouvez spécifier un ou des médias grâce à l'attribut HTML ou XHTML MEDIA : Exemple de code : <link media="print" href="macss.css"/> <style media="screen,print"> </style> Vous pouvez spécifier un ou des médias dans la css même grâce à la règle @import ou @media : Exemple de code : @import url("testimport.css"); @media screen, print{} LES TYPES LES PLUS COURANTS - all, convient pour tous les appareils ; screen, pour principalement les moniteurs couleurs ; print, destiné à un support paginé opaque et aux documents vus sur écran en mode aperçu avant impression. handheld, pour les appareils portatifs (typiquement ceux avec petits écrans à bande passante limitée, type smartphone) ; HACK CSS De part la complexité d’interprétation et d’implémentation de certaines règles CSS, les navigateurs n’ont pas choisis la même implémentation, ce qui peut dans des cas extrêmes provoquer des différences de rendu. A chaque problème sa solution, il est possible notamment de profiter de bugs dans l’interprétation des sélecteurs pour cibler un ou plusieurs navigateurs bien précis. Le hack le plus courant, utilisé pour cibler IE6, est d’utiliser un underscore devant une propriété exclusive à ce navigateur : div { height: 100px ; _height: 80px ; } LES PLUS GROS BUGS ET PARTICULARITES D’ IE6 ET IE7 En débuguant vos pages pour IE 7 et surtout pour IE 6, vous observerez de nombreux comportements étranges voir aberrants (enfin, nombreux pour un site important ou un design complexe). Les plus caractéristiques sont des disparitions d'éléments, certains décalages inexpliqués (mais pas tous), ou des problèmes de «dessin» (où Internet Explorer n'arrive pas à bien dessiner tout l'élément, par exemple une partie des bordures et de la couleur de fond est invisible ou «mangée»). TRANSPARENCE PNG Internet Explorer 6 ne gère pas la transparence sur le PNG. A l’époque, ce n’était pas d’actualité. A l’époque également, Microsoft prenait une part active dans le développement de nouvelles fonctionnalités liées au CSS. Fier défenseur de DirectX, il introduit cette propriété : filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=scale, src='image.png'); Cette propriété n’a absolument rien de standard et a la fâcheuse tendance à empêcher de cliquer sur les liens à l’intérieur du bloc. Un exemple de solution plus avancée : http://labs.unitinteractive.com/unitpngfix.php . Ne vous y trompez pas, en coulisse c’est la même méthode qui est utilisée mais de façon plus intelligente. D’autres solutions : http://www.alsacreations.com/article/lire/81-transparence-png-ie6.html MODELE DE BLOC Le modèle de bloc d’Internet Explorer 6 a été corrigé. Néanmoins, pour conserver la compatibilité avec Internet Explorer 5, il existe un mode « quirks ». Voici une explication en image : Comme vous le voyez, dans l’ancien modèle de bloc le width comprenait l’ensemble de la partie visible (donc border et padding inclus) alors que le modèle W3C ne considère que la partie utile au contenu. C’est un peu comme considérer que le volume d’une boite en carton se mesure à l’aspect exterieur ou la capacité de contenance. En CSS3, une propriété a pour vocation d’adopter ce comportement : box-sizing: border-box; De plus, la propriété « inline-block » est disponible mais ne peut être appliquée qu’à des éléments nativement « inline » tel les span. HASLAYOUT Le HasLayout est un mécanisme internet d'Internet Explorer 6 et 7, qui provoque de nombreux problèmes de rendu (bugs d'affichage) ou à l'inverse permet d'en éviter ou corriger. C’est une spécificité du navigateur Internet Explorer pour Windows, qui affecte les versions 5 à 7 incluses. Il s'agit d'un mécanisme interne du moteur de rendu d'Internet Explorer. Le HasLayout intervient dans le positionnement des éléments et plus généralement dans le calcul de l'affichage des pages web. Bref, c'est une question de cuisine interne. Pourquoi s'en occuper, s'il s'agit de cuisine interne? Eh bien parce que cette cuisine-là n'est pas invisible, et que ses conséquences se font sentir dans nos pages web. En effet, ce mécanisme est lié à de nombreux bugs de rendu d'Internet Explorer. CONCRETEMENT, QU'EST-CE-QUE C'EST? Les explications détaillées sur le HasLayout peuvent être trouvées dans l'article On Having Layout. On retiendra surtout que, pour Internet Explorer, tout élément d'une page HTML peut avoir deux états: soit il a le layout, soit il ne l'a pas. Et suivant le cas, l'élément en question ne réagira pas de la même manière. Dans certains contextes, un élément ne s'affichera correctement que s'il a le layout. Dans d'autres, il faudra éviter qu'il l'ait sous peine de voir se déclencher un bug de rendu! Mais qui a le layout? Par défaut, la grande majorité des éléments HTML n'ont pas le layout. Un élément obtient le layout lorsque l'on lui affecte certaines propriétés CSS. Les plus courantes sont les propriétés CSS width (avec toute valeur autre que auto) et height (avec toute valeur autre que auto). Pour une liste exhaustive, consultez les liens donnés précédemment. HEIGHT ET MIN-HEIGHT Internet Explorer 6 a une drôle de façon de gérer la propriété height. Deux problèmes principaux - Lorsque la hauteur est très petite (de l’ordre de 2 ou 3 px) la hauteur n’est pas respectée. Peut être corrigé en utilisant font-size : 0 IE6 ne supporte pas min-height, par contre par défaut la propriété height a un comportement très proche (ce qui peut s’avérer utile). Peut être résolu en utilisant overflow : hidden CRITIQUES ET AVENIR DU STANDARD CSS LES LIMITES DU CSS INDEPENDANCE DE LA PRESENTATION ET DE LA STRUCTURE CSS ambitionnait initialement l'indépendance entre structure et présentation d'un document. Ainsi, le site du CSS Zen Garden, créé en 2003 par Dave Shea, se veut la démonstration de la possibilité de modifier librement le rendu affiché d'une même page web, uniquement grâce à CSS et sans aucune modification de son code HTML : il présente, en décembre 2006, 986 désigns différents de sa page d'accueil. Cependant, la plupart de ces designs reposent en tout ou partie sur le remplacement du contenu textuel de la page par des images CSS qui le reproduisent en enrichissant son aspect : la liberté graphique repose toujours partiellement sur la transformation du texte en image. D'autre part, le CSS Zen Garden reste un exercice de style limité à un document unique, à la structure doublée d'éléments et attributs sémantiquement neutres, qui ne servent qu'à donner appui à des sélecteurs CSS. S'il existe de nombreux exemples de documents HTML pour lesquels plusieurs feuilles de style ont été développées, il n'existe guère d'exemples de feuilles de style génériques, indépendantes de la structure du document. Les styles par défaut des agents utilisateurs en sont un exemple, mais limité à des effets typographiques simples, sans définition de mise en page. En général, les feuilles de style dépendent étroitement de la structure du document à styler et sont difficilement réutilisables sur des documents différemment structurés. C'est davantage à travers la création de design patterns HTML CSS que s'exploite cette indépendance potentielle des styles envers la structure spécifique des documents. Plus généralement, les difficultés et le manque d'implémentation d'une partie des propriétés CSS limitent la liberté de mise en page, et conduisent à l'utilisation de propriétés contraignantes quant à la structure HTML (par exemple, la propriété float impose un ordre précis du contenu ainsi mis en colonne ; de nombreux effets de rendu reposent d'autre part sur une surcharge de balisage sémantiquement neutre, tel que div et span). ACCESSIBILITE CSS favorise l'accessibilité d'une page web en donnant en dernier ressort à l'utilisateur le contrôle du rendu d'un document dans son navigateur : il est ainsi possible de l'adapter à des contraintes ou à des préférences concernant par exemple la taille d'affichage des caractères ou les couleurs. En séparant structure et présentation, CSS favorise également l'écriture de documents structurés de manière sémantique, potentiellement plus exploitables par les aides techniques : la liberté de présentation des éléments de titrage permet par exemple de respecter strictement l'ordre hiérarchique formel de ceux-ci, ce qui permet en retour aux aides techniques d'en établir une table des matières navigable. Enfin, en donnant aux auteurs les moyens d'enrichir la mise en forme du texte, CSS permet de limiter le recours aux textes mis en images. Cependant, certaines utilisations de CSS peuvent également compromettre l'accessibilité du contenu : - - en substituant à celui-ci des pseudo-contenus qui ne sont accessibles qu'aux utilisateurs qui peuvent percevoir le rendu CSS visuel : c'est le cas par exemple des informations qui seraient véhiculées par des images d'arrière plan. en bouleversant la cohérence nécessaire entre l'ordre linéaire de l'information dans le contenu structuré et l'ordre visuel du rendu CSS affiché. Les aides techniques telles que les lecteurs d'écran - n'ont en effet accès qu'à cet ordre linéaire : une information qui ne prendrait son sens qu'en fonction de son positionnement CSS n'est pas compréhensible pour leurs utilisateurs. dans une démarche d'accessibilité fondée sur la pertinence de la structure HTML, l'éventail des possibilités de mise en forme de contenu avec CSS peut faire perdre de vue la nécessité de baliser le contenu à l'aide d'éléments signifiants. Il est par exemple possible de délimiter visuellement une citation en la mettant en italique ou en l'encadrant de guillemets, mais l'information sur l'origine de ce texte ne sera perceptible, au sens des normes d'accessibilité, que via l'utilisation des éléments q ou blockquote, qui sont les seuls permettant de définir une citation HTML et d'en indiquer la source via l'attribut approprié (cite). Les méthodes d'application des directives d'accessibilité des contenus web (RGAA, UWEM par exemple) définissent donc des règles d'usages des styles CSS. SIMPLICITE CSS répond à une volonté de disposer d'un format de présentation simple, tant dans ses fonctionnalités que dans sa syntaxe, afin d'en favoriser la manipulation directe par les auteurs et les utilisateurs. Cependant, cette simplicité est remise en cause par plusieurs facteurs : - - la difficulté à déterminer et à contrôler le résultat de la cascade lorsque les sources de styles se multiplient. Le rendu final d'un contenu précis dépend de la combinaison de plusieurs feuilles et peut alors devenir malaisé à faire évoluer. L'interdépendance des feuilles de styles peut rendre difficilement anticipable le résultat d'une modification apportée à l'une d'elle. Les auteurs sont alors placés devant un choix entre cette interdépendance qui optimise la quantité de code et la redondance de styles qui facilite sa maintenance. La difficulté à écrire des styles utilisateurs sans disposer de compétences avancées. Les utilisateurs sont en théorie les premiers bénéficiaires des CSS, qui leur donnent la possibilité d'adapter la présentation des pages web. Cependant, le mécanisme des styles se prête difficilement au développement d'environnements graphiques qui faciliteraient la manipulation des propriétés CSS. Dans la pratique, le recours aux styles utilisateur reste dès lors marginal. UN AVANT GOUT DE CSS 3 IMPLEMENTATIONS PROP RIETAIRES (NAVIGATEU R) Il fut un temps ou les navigateurs décidaient de nouvelles propriétés sans se soucier du standard. De nos jours ce n’est plus le cas et les navigateurs ont choisi de porter leur proposition ou implémentations prototype au sein d’un espace de nommage. Par exemple, la propriété « border-radius » issue du CSS3 existe sous le nom « moz-border-radius » pour Firefox. Voici une liste de correspondance : - Gecko/Firefox/Mozilla : -moz-property Webkit/Safari/Chrome : -webkit-property Opera : -o-property Internet Explorer : -ms-property Etant des implémentations prototype, elles diffèrent parfois du "modèle choisi par la norme. Par exemple border-top-left-radius devient -moz-border-radius-topleft sur Firefox mais -webkitborder-top-left-radius sur Webkit. QUELQUES PROPRIETES Plus de détails à ces adresse : - http://net.tutsplus.com/tutorials/html-css-techniques/10-css3-properties-you-need-to-be-familiarwith/ http://net.tutsplus.com/tutorials/html-css-techniques/11-classic-css-techniques-made-simple-withcss3/ Quelques éléments en vrac : BORDER-RADIUS BOX-SHADOW TEXT-SHADOW TEXT-STROKE MULTIPLE BACKGROUNDS BACKGROUND-SIZE body, html { height: 100%; } body { background: url(path/to/image.jpg) no-repeat; background-size: 100% 100%; } TEXT-OVERFLOW RESIZE TRANSITION div { opacity: 1; -webkit-transition: opacity 1s linear; } div:hover { opacity: 0; } FONT-FACE Font-face est un mécanisme CSS supporté depuis Internet Explorer 6 (et les navigateurs récents). Il permet d’embarquer des polices pour le rendu Web. A utiliser avec moderation (pour les titres par exemple) car c’est un téléchargement supplémentaire. @font-face { font-family: 'AdobeCaslonProBold'; src: url('acaslonpro-bold-webfont.eot'); src: local('☺'), url('acaslonpro-bold-webfont.woff') format('woff'), url('acaslonpro-bold-webfont.ttf') format('truetype'), url('acaslonprobold-webfont.svg#webfontlFGR816y') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'AdobeCaslonProBoldItalic'; src: url('acaslonpro-bolditalic-webfont.eot'); src: local('☺'), url('acaslonpro-bolditalic-webfont.woff') format('woff'), url('acaslonpro-bolditalic-webfont.ttf') format('truetype'), url('acaslonpro-bolditalicwebfont.svg#webfonttPjETEDk') format('svg'); font-weight: normal; font-style: normal; } Ensuite il suffit d’appeler la police normalement : div.titre { font-family : "AdobeCaslonProBoldItalic", serif; } Le lien vers le générateur : http://www.fontsquirrel.com/fontface/generator MODELES DE BOITE FLEXIBLE Plus de détails à cette adresse : http://jeremie.patonnier.net/post/2009/11/10/Le-modele-de-boite-flexible-enCSS-3 The Flexible Box Model, will finally allow us to get away from those mangy floats. Though it takes a bit of work to wrap your head around the new properties, once you do, it all should make perfect sense. Let’s construct a quick demo, and create a simple two-column layout. <div id="container"> <div id="main"> Main content here </div> <aside> Aside content here </aside> </div> Now for the CSS: we first need to instruct the container to be treated as a box. I’ll also apply a generic width and height, since we don’t have any actual content in play. #container { width: 960px; height: 500px; /* just for demo */ background: #e3e3e3; margin: auto; display: -moz-box; display: -webkit-box; display: box; } Next, let’s apply, for the demo, unique background colors to the #main div, and the aside. #main { background: yellow; } aside { background: red; } At this point, there’s not much to look at. One thing worth noting, though, is that, when set to display: box mode, the child elements will take up all vertical space; this is the default box-align value: stretch. Watch what happens when we explicitly state a width on the #main content area. #main { background: yellow; width: 800px; } Well that’s a bit better, but we still have this issue where the aside isn’t taking up all of the remaining space. We can fix this by using the new box-flex property. box-flex instructs the element to take up all available space. aside { display: block; /* cause is HTML5 element */ background: red; /* take up all available space */ -moz-box-flex: 1; -webkit-box-flex: 1; box-flex: 1; } With this property in place, regardless of the width of the #main content area, the aside will consume every spec of available space. Even better, you don’t have to worry about those pesky float issues, like elements dropping below the main content area. We’ve only scratched the surface here. Refer the Paul Irish’s excellent article for more information. Also, be careful when using this method, as it’s not fully supported, of course, in older browsers. In those cases, you can use feature detection or Modernizr to detect support, and provide the necessary fallbacks. BONUS : LESSCSS As an extension to CSS, LESS is not only backwards compatible with CSS, but the extra features it adds use existing CSS syntax. This makes learning LESS a breeze, and if in doubt, lets you fall back to CSS. VARIABLES Variables allow you to specify widely used values in a single place, and then re-use them throughout the style sheet, making global changes as easy as changing one line of code. @brand_color: #4D926F; #header { color: @brand_color; } h2 { color: @brand_color; } MIXINS Mixins allow you to embed all the properties of a class into another class by simply including the class name as one of its properties. It's just like variables, but for whole classes. Mixins can also behave like functions, and take arguments, as seen in the example bellow. .rounded_corners (@radius: 5px) { -moz-border-radius: @radius; -webkit-border-radius: @radius; border-radius: @radius; } #header { .rounded_corners; } #footer { .rounded_corners(10px); } NESTED RULES Rather than constructing long selector names to specify inheritance, in Less you can simply nest selectors inside other selectors. This makes inheritance clear and style sheets shorter. #header { color: red; a { font-weight: bold; text-decoration: none; } } OPERATIONS Are some elements in your style sheet proportional to other elements? Operations let you add, subtract, divide and multiply property values and colors, giving you the power to do create complex relationships between properties. @the-border: 1px; @base-color: #111; #header { color: @base-color * 3; border-left: @the-border; border-right: @the-border * 2; } #footer { color: (@base-color + #111) * 1.5; }