Maison >interface Web >tutoriel CSS >Un examen plus approfondi des sélecteurs en CSS
Cet article vous amènera à comprendre les sélecteurs en CSS, à présenter la syntaxe des sélecteurs simples, des sélecteurs composés, des sélecteurs complexes et des priorités des sélecteurs.
Comprenons d'abord la syntaxe des sélecteurs, puis examinons de plus près les fonctionnalités associées qui se cachent derrière.
Sélecteur simple
*
div svg|a
tagName
(nom de la balise) dans l'élément HTML
SVG
MathML
Si nous voulons sélectionner des éléments spécifiques en SVG ou MathML, nous devons utiliser une seule barre verticale |
:
a
On peut donc penser que le sélecteur de type n'est qu'une simple chaîne de texte.class-name
est le sélecteur de classe, et c'est aussi l'un des plus classiques .
.class
#id
et ajoutez le nom de l'ID pour sélectionner un ID#
[attr=value]
attr=value
devant le signe égal ici pour signifier comme class , peut supporter une séquence de valeurs séparées par des espaces : ~
Si vous ajoutez une seule barre verticale avant le signe égal, cela signifie que cet attribut commence par cette valeur : attr~=value
attr|=value
:hover
, c'est principalement le statut particulier de certains attributs:
::before
un double deux-points ::
Sélecteur complexe
Un sélecteur composé peut être transformé en sélecteur complexe en utilisant un connecteur au milieu. Un sélecteur complexe sélectionne en fonction de la structure d'un élément.
Je suis également entré en contact avec la priorité du sélecteur dans le concept précédent "Apprendre les principes de fonctionnement des navigateurs dans un combat réel". Nous examinons ici plus en profondeur le concept de priorité du sélecteur.
Comptage de sélecteurs simples
On part d'un cas, la priorité du sélecteur est de compter tous les sélecteurs simples contenus dans un sélecteur. Ainsi, la liste de sélecteurs n'est pas considérée comme un sélecteur complet (c'est-à-dire des sélecteurs séparés par des virgules), car le milieu de la liste de sélecteurs est constitué de sélecteurs complexes séparés par des virgules pour un comptage simple des sélecteurs.
Exemple :
#id div.a#id
specificity
tableau [inline-style个数
,ID 选择器个数
,class 选择器个数
,tagName 选择器个数
]specificity = [0, 2, 1, 1]
N=1000000
, alors S=2000001000001
, c'est la specificity
priorité du sélecteur dans cet exemple L ike IE L'ancienne version d'IE6, car pour pour sauvegarder La valeur de la mémoire N n'est pas assez grande, donc une valeur de 255 est prise comme N, donc quelque chose de très intéressant se produit. Par exemple, nos 256 classes sont équivalentes à un ID. Plus tard, la plupart de nos navigateurs ont choisi 65536, et pratiquement aucun quota n'a été dépassé. Parce que la norme dit seulement d'utiliser une valeur relativement grande, mais nous devons considérer la question de l'utilisation temporaire de la mémoire, nous prendrons donc un nombre relativement entier en hexadécimal, qui est généralement une puissance entière de 256 (car 256 est exactement un octet ).
La pseudo-classe est en fait un simple sélecteur pour beaucoup de contenu.
Lien/Action
:any-link
—— Peut correspondre à n'importe quel hyperlien :link
—— Hyperliens qui n'ont pas encore été visités :link :visited
—— Correspond à tous les hyperliens visités :hover
—— L'état après que l'utilisateur place la souris sur l'élément, avant qu'il ne puisse ne prend effet que sur les hyperliens, mais maintenant il peut être utilisé dans de nombreux éléments :active
—— Auparavant, il n'était efficace que sur les hyperliens Après avoir cliqué, le lien actuel prendra effet :focus
—— C'est là que l'accent est mis sur l'état dans. cet élément est généralement utilisé pour les balises d'entrée. En fait, tout élément pouvant obtenir le focus peut être utilisé :target
- pour créer un lien vers la cible actuelle, mais pour les balises d'ancrage a
. le HASH actuel pointe vers la balise a
actuelle, la target
pseudo-classe sera activée Une fois
:link
ou:visited
utilisés, on ne pourra plus changer les attributs autres que la couleur du texte de cet élément. Pourquoi est-il conçu de cette façon ? Parce qu'une fois que nous utilisons des attributs liés à la mise en page, par exemple, si nous augmentons la taille de:visited
, cela affectera la planification. De cette façon, nous pouvons utiliser l'API JavaScript pour savoir si le lien a été visité. Mais si nous pouvons savoir si le lien a été visité, nous pouvons alors savoir quels sites Web l’utilisateur a visités, ce qui porte un coup fatal à la sécurité du navigateur. Je voudrais donc rappeler à tout le monde qu’il ne faut pas penser que faire des choses expressives n’a rien à voir avec la sécurité. En fait, la sécurité est une considération globale. CSS peut également provoquer des failles de sécurité.
Arborescence
:empty
—— Cet élément a-t-il des éléments enfants :nth-child()
—— De quel enfant de l'élément parent s'agit-il :nth-last-child()
—— Comme nth-child
, mais à partir de maintenant, on compte en avant ? :first-child :last-child :only-child
:nth-child
est une pseudo-classe très complexe, qui prend en charge une syntaxe. Par exemple, vous pouvez écrire impair et pairevent
ouodd
entre parenthèses, ou vous pouvez écrire4N+1
,3N-1
, et ceux-ci correspondront respectivement. . La forme d'un entier. Comme il s'agit d'un sélecteur relativement complexe, nous ne voulons pas y écrire d'expressions trop complexes. Nous l'utilisons uniquement pour traiter des expressions paires et impaires, telles que 1 de plus lorsque tous les 3, 1 de plus que 4, etc.
En fait, ces deux sélecteurs
empty
,nth-last-child
,last-child
,only-child
détruisent le problème de timing du calcul CSS que nous avons mentionné précédemment dans "Apprentissage des principes du navigateur dans la mise en œuvre". On peut imaginer que lorsqu'on démarre le calcul des étiquettes, on ne sait définitivement pas s'il y a des sous-étiquettes.empty
L'impact n'est pas particulièrement important, mais la relation delast-child
est en fait assez influente. Par conséquent, la navigation a effectué un traitement spécial lors de leur mise en œuvre. Soit le navigateur ne l'implémente pas particulièrement bien, soit le navigateur nécessite plus de performances pour l'implémenter. Il est donc recommandé d’éviter de les utiliser en grande quantité.
Type logique
Voici une suggestion chaleureuse à tout le monde, Je ne vous recommande pas d'écrire le sélecteur trop compliqué, Nous pouvons souvent ajouter plus de classes à résolvez-le. Si notre sélecteur est écrit de manière trop complexe, cela signifie que la structure HTML est dans une certaine mesure déraisonnable. Nous faisons cela non seulement pour éviter des problèmes au projet de navigateur, ni pour les performances, mais aussi pour le bien de notre propre structure de code, nous ne devrions donc pas avoir de sélecteurs trop complexes. Les pseudo-éléments CSS
sont divisés en 4 types
::before
et ::after
êtes dedans Insérez un pseudo-élément avant et après le contenu de l'élément. Une fois les attributs avant et après appliqués, un attribut appelé content
peut être écrit dans la déclaration (les éléments généraux ne peuvent pas écrire l'attribut content). L'attribut de content
est comme un véritable élément DOM. Il peut générer des boîtes et participer à la composition et au rendu ultérieurs. Nous pouvons donc déclarer des attributs comme border
, background
et ainsi de suite pour lui.
peut être compris comme : Le pseudo élément ajoute un élément inexistant à l'interface.
Les mécanismes de
::first-line
et ::first-letter
sont différents. Ces deux-là existent réellement dans le contenu. Comme son nom l'indique, ils sélectionnent la « première ligne » et sélectionnent la « première lettre ». Ils ne sont pas un élément inexistant, ils enferment une partie du texte pour que l'on puisse y faire quelques traitements.
avant et après
Dans notre concept, on peut penser que le sélecteur avec le pseudo-élément before ajoutera un élément devant le contenu de l'élément réellement sélectionné. Il suffit de transmettre son contenu. ajoutez-y du contenu textuel. (Ici, nous pouvons également attribuer content: ''
au pseudo-élément comme vide) Nous pouvons donc spécifier l'attribut d'affichage pour avant et après de n'importe quelle manière, tout comme différents éléments.
Lorsque nous implémentons certains composants, nous utilisons souvent cette méthode pour ajouter du contenu décoratif à la page d'une manière qui ne pollue pas l'arborescence DOM mais peut réellement créer des effets visuels.
<div> <::before/> content content content content content content content content content content content content content content content content <::after/> </div>
première lettre et première ligne
first-letter
équivalent à avoir un élément qui renferme la première lettre dans le contenu. Ceci first-letter
Nous pouvons déclarer divers attributs à volonté, mais nous ne pouvons pas modifier son contenu. Nous aurions tous dû voir l'effet que la première lettre d'un journal sera plus grande puis flottera. En CSS, nous pouvons utiliser le sélecteur de pseudo-élément ::first-letter
. L'utiliser pour l'implémenter sera plus stable et le code sera plus élégant que l'utilisation de JavaScript.
<div> <::first-letter>c</::first-letter>ontent content content content content content content content content content content content content content content content </div>
first-line
est pour le line
après la composition. En fait, cela n'a rien à voir avec le first line
dans notre code source. Si nos navigateurs proposent des largeurs de rendu différentes, first-line
le nombre d'éléments qu'il enfermera finalement dans les deux environnements sera différent. Ainsi, lorsque nous utilisons ce sélecteur, nous devons l'utiliser en fonction des besoins. Il est très probable que l'effet de rendu sur notre machine de développement et sur la machine de l'utilisateur soit différent !
<div> <::first-line>content content content content content</::first-line> content content content content content content content content content content content content </div>
En fait, les attributs disponibles de ces deux sélecteurs sont également différents :
attributs disponibles de première ligne
première lettre Propriétés disponibles
Écrivez une fonction de correspondance. Il accepte deux paramètres, le premier paramètre est une propriété de chaîne de sélection et le deuxième paramètre est un élément HTML. Vous pouvez considérer cet élément tel qu’il doit être dans une arborescence DOM. Utilisez des sélecteurs et des éléments DOM pour déterminer si l'élément actuel peut correspondre à notre sélecteur. (Vous ne pouvez utiliser aucune fonction de navigateur intégrée, utilisez uniquement les API parent et enfants du DOM pour déterminer si un élément peut correspondre à un sélecteur.) Voici un exemple d'appel.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Match Example —— by 三钻</title> </head> <body> <div> <b> <div class="class classA" id="id">content</div> </b> </div> </body> <script language="javascript"> /** * 匹配选择器 */ function matchSelectors(selector, element) { // 先匹配当前元素是否匹配 let tagSelector = selector.match(/^[\w]+/gm); let idSelectors = selector.match(/(?<=#)([\w\d\-\_]+)/gm); let classSelectors = selector.match(/(?<=\.)([\w\d\-\_]+)/gm); /** * 实现复合选择器,实现支持空格的 Class 选择器 * -------------------------------- */ // 检查 tag name 是否匹配 if (tagSelector !== null) { if (element.tagName.toLowerCase() !== tagSelector[0]) return false; } // 检测 id 是否匹配 if (idSelectors !== null) { let attr = element.attributes['id'].value; if (attr) { for (let selector of idSelectors) { if (attr.split(' ').indexOf(selector) === -1) return false; } } } // 检测 class 是否匹配 if (classSelectors !== null) { let attr = element.attributes['class'].value; if (attr) { for (let selector of classSelectors) { if (attr.split(' ').indexOf(selector) === -1) return false; } } } return true; } /** * 匹配元素 */ function match(selector, element) { if (!selector || !element.attributes) return false; let selectors = selector.split(' ').reverse(); if (!matchSelectors(selectors[0], element)) return false; let curElement = element; let matched = 1; // 递归寻找父级元素匹配 while (curElement.parentElement !== null && matched < selectors.length) { curElement = curElement.parentElement; if (matchSelectors(selectors[matched], curElement)) matched++; } // 所有选择器匹配上为 匹配成功,否则是失败 if (matched !== selectors.length) return false; return true; } let matchResult = match('div #id.class', document.getElementById('id')); console.log('Match example by 三钻'); console.log('matchResult', matchResult); </script> </html>
Pour plus de connaissances sur la programmation, veuillez visiter : Vidéo de programmation ! !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!