033.2 Μάθημα 1
Πιστοποιητικό: |
Web Development Essentials |
---|---|
Έκδοση: |
1.0 |
Θέμα: |
033 Styling Περιεχομένου CSS |
Σκοπός: |
033.2 CSS Selectors και Εφαρμογή Style |
Μάθημα: |
1 απο 1 |
Εισαγωγή
Όταν γράφουμε έναν κανόνα CSS, πρέπει να πούμε στο πρόγραμμα περιήγησης το σε ποια elements εφαρμόζει αυτός ο κανόνας. Αυτό το κάνουμε καθορίζοντας έναν selector: ένα μοτίβο που μπορεί να ταιριάζει με ένα element ή μια ομάδα elements. Οι selectors διατίθενται σε πολλές διαφορετικές μορφές, οι οποίες μπορούν να βασίζονται στο όνομα του element, στα attributes του, στη σχετική τοποθέτησή του στη δομή του εγγράφου ή σε συνδυασμό αυτών των χαρακτηριστικών.
Styles Όλης της Σελίδας
Ένα από τα πλεονεκτήματα της χρήσης CSS είναι ότι δεν χρειάζεται να γράφετε μεμονωμένους κανόνες σε elements που μοιράζονται το ίδιο style. Ένας αστερίσκος εφαρμόζει τον κανόνα σε όλα τα elements της ιστοσελίδας, όπως φαίνεται στο ακόλουθο παράδειγμα:
* {
color: purple;
font-size: large;
}
Ο selector *
δεν είναι η μόνη μέθοδος για την εφαρμογή ενός κανόνα style σε όλα τα elements της σελίδας. Ένας selector που απλώς ταιριάζει με ένα element με το όνομα του tag του ονομάζεται type selector, επομένως οποιοδήποτε όνομα HTML tag όπως body
, p
, table
, em
, κ.λπ., μπορεί να χρησιμοποιηθεί ως selectors. Στο CSS, το style του parent κληρονομείται στα children elements. Έτσι, στην πράξη, η χρήση του selector *
έχει το ίδιο αποτέλεσμα με την εφαρμογή ενός κανόνα στο element body
:
body {
color: purple;
font-size: large;
}
Επιπλέον, η δυνατότητα cascading του CSS σάς επιτρέπει να ρυθμίσετε με ακρίβεια τις κληρονομημένες ιδιότητες ενός element. Μπορείτε να γράψετε έναν γενικό κανόνα CSS που ισχύει για όλα τα elements της σελίδας και, στη συνέχεια, να γράψετε κανόνες για συγκεκριμένα elements ή σύνολα απο elements.
Εάν το ίδιο element ταιριάζει με δύο ή περισσότερους αντικρουόμενους κανόνες, το πρόγραμμα περιήγησης εφαρμόζει τον κανόνα από τον πιο συγκεκριμένο selector. Πάρτε τους ακόλουθους κανόνες CSS ως παράδειγμα:
body {
color: purple;
font-size: large;
}
li {
font-size: small;
}
Το πρόγραμμα περιήγησης θα εφαρμόσει τα styles color: purple
και font-size: large
σε όλα τα elements μέσα στο element body
. Ωστόσο, εάν υπάρχουν li
elements στη σελίδα, το πρόγραμμα περιήγησης θα αντικαταστήσει το style font-size: large
με το style font-size: small
, επειδή ο selector li
έχει ισχυρότερη σχέση με το element li
από ό,τι κάνει ο selector body
.
Το CSS δεν περιορίζει τον αριθμό των ισοδύναμων selectors στο ίδιο stylesheet, επομένως μπορείτε να έχετε δύο ή περισσότερους κανόνες χρησιμοποιώντας τον ίδιο selector:
li {
font-size: small;
}
li {
font-size: x-small;
}
Σε αυτήν την περίπτωση, και οι δύο κανόνες είναι εξίσου συγκεκριμένοι για το element li
. Το πρόγραμμα περιήγησης δεν μπορεί να εφαρμόσει αντικρουόμενους κανόνες, επομένως θα επιλέξει τον κανόνα που θα εμφανιστεί αργότερα στο αρχείο CSS. Για να αποφευχθεί η σύγχυση, η σύσταση είναι να ομαδοποιήσετε όλες τις ιδιότητες που χρησιμοποιούν τον ίδιο selector.
Η σειρά με την οποία εμφανίζονται οι κανόνες στο stylesheet επηρεάζει τον τρόπο εφαρμογής τους στο έγγραφο, αλλά μπορείτε να παρακάμψετε αυτήν τη συμπεριφορά χρησιμοποιώντας έναν κανόνα important
. Εάν, για οποιονδήποτε λόγο, θέλετε να διατηρήσετε τους δύο ξεχωριστούς κανόνες li
, αλλά να επιβάλετε την εφαρμογή του πρώτου αντί του δεύτερου, σημειώστε τον πρώτο κανόνα ως σημαντικό:
li {
font-size: small !important;
}
li {
font-size: x-small;
}
Οι κανόνες που επισημαίνονται με !important
θα πρέπει να χρησιμοποιούνται με προσοχή, επειδή σπάνε το φυσικό cascading του stylesheet και καθιστούν πιο δύσκολη την εύρεση και τη διόρθωση προβλημάτων μέσα στο αρχείο CSS.
Περιοριστικοί Selectors
Είδαμε ότι μπορούμε να αλλάξουμε ορισμένες κληρονομημένες ιδιότητες χρησιμοποιώντας selectors που ταιριάζουν με συγκεκριμένα tags. Ωστόσο, συνήθως χρειάζεται να χρησιμοποιούμε διαφορετικά styles για elements του ίδιου τύπου.
Τα attributes των HTML tags μπορούν να ενσωματωθούν σε selectors για να περιορίσουν το σύνολο των elements στα οποία αναφέρονται. Ας υποθέσουμε ότι η σελίδα HTML στην οποία εργάζεστε έχει δύο τύπους unordered lists (<ul>
): ο ένας χρησιμοποιείται στο επάνω μέρος της σελίδας ως menu για τις ενότητες του ιστότοπου και ο άλλος τύπος χρησιμοποιείται για συμβατικές λίστες στο σώμα του κειμένου:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>CSS Basics</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/articles">Articles</a></li>
<li><a href="/about">About</a></li>
</ul>
<div id="content">
<p>The three rocky planets of the solar system are:</p>
<ul>
<li>Mercury</li>
<li>Venus</li>
<li>Earth</li>
<li>Mars</li>
</ul>
<p>The outer giant planets made most of gas are:</p>
<ul>
<li>Jupiter</li>
<li>Saturn</li>
<li>Uranus</li>
<li>Neptune</li>
</ul>
</div><!-- #content -->
<div id="footer">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/articles">Articles</a></li>
<li><a href="/about">About</a></li>
</ul>
</div><!-- #footer -->
</body>
</html>
Από προεπιλογή, κάθε αντικείμενο της λίστας έχει έναν μαύρο κύκλο στα αριστερά του. Μπορεί να θέλετε να αφαιρέσετε τους κύκλους από τη λίστα του top menu και να αφήσετε τους κύκλους στην άλλη λίστα. Ωστόσο, δεν μπορείτε απλά να χρησιμοποιήσετε τον selector li
γιατί με αυτόν τον τρόπο θα αφαιρεθούν επίσης οι κύκλοι στη λίστα μέσα στο τμήμα του σώματος κειμένου. Θα χρειαστείτε έναν τρόπο για να πείτε στο πρόγραμμα περιήγησης να τροποποιήσει μόνο τα αντικείμενα της λίστας που χρησιμοποιούνται στη μία λίστα, αλλά όχι στην άλλη.
Υπάρχουν διάφοροι τρόποι για να γράψετε selectors που ταιριάζουν με συγκεκριμένα elements στη σελίδα. Όπως αναφέρθηκε προηγουμένως, θα δούμε πρώτα πώς να χρησιμοποιήσουμε τα attributes των elements για να το κάνουμε αυτό. Για αυτό το παράδειγμα συγκεκριμένα, μπορούμε να χρησιμοποιήσουμε το attribute id
για να καθορίσουμε μόνο την top λίστα.
Το attribute id
εκχωρεί ένα μοναδικό αναγνωριστικό στο αντίστοιχο element, το οποίο μπορούμε να χρησιμοποιήσουμε ως το τμήμα selector του κανόνα CSS. Πριν γράψετε τον κανόνα CSS, επεξεργαστείτε το δείγμα αρχείου HTML και προσθέστε το id="topmenu"
στο element ul
που χρησιμοποιείται για το top menu:
<ul id="topmenu">
<li>Home</li>
<li>Articles</li>
<li>About</li>
</ul>
Υπάρχει ήδη ένα link
element στην ενότητα head
του εγγράφου HTML που δείχνει το stylesheet αρχείο style.css
στον ίδιο φάκελο, ώστε να μπορούμε να προσθέσουμε τους ακόλουθους κανόνες CSS σε αυτό:
ul#topmenu {
list-style-type: none
}
Ο hash χαρακτήρας χρησιμοποιείται σε έναν selector, μετά από ένα element, για να ορίσει ένα ID (χωρίς να τα χωρίζουν κενά). Το όνομα του tag στα αριστερά του hash είναι προαιρετικό, καθώς δεν θα υπάρχει άλλο element με το ίδιο ID. Επομένως, ο selector θα μπορούσε να γραφτεί ακριβώς ως #topmenu
.
Παρόλο που η ιδιότητα list-style-type
δεν είναι άμεση ιδιότητα του ul
element, οι ιδιότητες CSS του parent element κληρονομούνται από τα children του, επομένως το style που έχει εκχωρηθεί στο ul
element θα κληρονομηθεί από τα child li
elements.
Δεν έχουν όλα τα elements ID βάσει του οποίου μπορούν να επιλεγούν. Πράγματι, μόνο μερικά βασικά layout elements σε μια σελίδα αναμένεται να έχουν IDs. Πάρτε, για παράδειγμα, τις λίστες των πλανητών που χρησιμοποιούνται στο δείγμα κώδικα. Αν και είναι δυνατό να εκχωρήσετε μοναδικά IDs για κάθε μεμονωμένο επαναλαμβανόμενο element όπως αυτά, αυτή η μέθοδος δεν είναι πρακτική για μεγαλύτερες σελίδες με πολλά περιεχόμενα. Αντίθετα, μπορούμε να χρησιμοποιήσουμε το ID του parent element div
, ως selector για να αλλάξουμε τις ιδιότητες των εσωτερικών του elements.
Ωστόσο, το div
element δεν σχετίζεται άμεσα με λίστες HTML, επομένως η προσθήκη της ιδιότητας list-style-type
σε αυτό δεν θα έχει καμία επίδραση στα children του. Έτσι, για να αλλάξουμε τον μαύρο κύκλο στις λίστες μέσα στο div
περιεχόμενο σε κοίλο κύκλο, θα πρέπει να χρησιμοποιήσουμε έναν descendant selector:
#topmenu {
list-style-type: none
}
#content ul {
list-style-type: circle
}
Ο selector #content ul
ονομάζεται descendant selector επειδή αντιστοιχεί μόνο στα ul
elements, που είναι children του element του οποίου το ID είναι content
. Μπορούμε να χρησιμοποιήσουμε όσα επίπεδα descendance χρειάζεται. Για παράδειγμα, η χρήση του #content ul li
, θα ταιριάζει μόνο με τα li
elements που είναι descendants των ul
elements που είναι descendants του element του οποίου το ID είναι content
. Αλλά σε αυτό το παράδειγμα, ο μακρύτερος selector θα έχει το ίδιο αποτέλεσμα με τη χρήση του #content ul
, επειδή τα li
elements κληρονομούν τις ιδιότητες CSS που έχουν οριστεί στο parent ul
. Οι descendant selectors είναι μια ουσιαστική τεχνική καθώς το layout της σελίδας μεγαλώνει σε πολυπλοκότητα.
Ας υποθέσουμε ότι τώρα θέλετε να αλλάξετε την ιδιότητα font-style
των αντικειμένων της λίστας, στη λίστα topmenu
και στη λίστα στο footer div για να φαίνονται oblique. Δεν μπορείτε απλώς να γράψετε έναν κανόνα CSS χρησιμοποιώντας το ul
ως selector, γιατί θα αλλάξει επίσης τα αντικείμενα της λίστας στο content div. Μέχρι στιγμής, έχουμε αλλάξει ιδιότητες CSS χρησιμοποιώντας έναν selector κάθε φορά και αυτή η μέθοδος μπορεί επίσης να χρησιμοποιηθεί για αυτήν την εργασία:
#topmenu {
font-style: oblique
}
#footer ul {
font-style: oblique
}
Ωστόσο, οι ξεχωριστοί selectors, δεν είναι ο μόνος τρόπος για να το κάνετε. Το CSS μας επιτρέπει να ομαδοποιήσουμε selectors που μοιράζονται ένα ή περισσότερα styles, χρησιμοποιώντας μια λίστα selectors που χωρίζονται με κόμματα:
#topmenu, #footer ul {
font-style: oblique
}
Η ομαδοποίηση selectors, εξαλείφει την πρόσθετη εργασία της σύνταξης διπλότυπων styles. Επιπλέον, μπορεί να θέλετε να αλλάξετε ξανά την ιδιότητα στο μέλλον, και ίσως να μην θυμηθείτε να την αλλάξετε σε όλα τα διαφορετικά μέρη.
Classes [Κλάσεις]
Εάν δεν θέλετε να ανησυχείτε πολύ για την ιεραρχία των element, μπορείτε απλώς να προσθέσετε μια class
στο σύνολο των elements που θέλετε να προσαρμόσετε. Τα classes είναι παρόμοια με τα IDs, αλλά αντί να προσδιορίζουν μόνο ένα element στη σελίδα, μπορούν να προσδιορίσουν μια ομάδα elements που μοιράζονται τα ίδια χαρακτηριστικά.
Πάρτε το δείγμα σελίδας HTML που εργαζόμαστε, για παράδειγμα. Είναι απίθανο ότι σε πραγματικές σελίδες θα βρούμε δομές τόσο απλές, επομένως θα ήταν πιο πρακτικό να επιλέξετε ένα element χρησιμοποιώντας μόνο classes ή έναν συνδυασμό classes και descendancy. Για να εφαρμόσουμε την ιδιότητα font-style: oblique
στις λίστες menu χρησιμοποιώντας classes, πρέπει πρώτα να προσθέσουμε την ιδιότητα class
στα elements του αρχείου HTML. Θα το κάνουμε πρώτα στο top menu:
<ul id="topmenu" class="menu">
<li><a href="/">Home</a></li>
<li><a href="/articles">Articles</a></li>
<li><a href="/about">About</a></li>
</ul>
Και μετά στο footer menu:
<div id="footer">
<ul class="menu">
<li><a href="/">Home</a></li>
<li><a href="/articles">Articles</a></li>
<li><a href="/about">About</a></li>
</ul>
</div><!-- #footer -->
Με αυτό, μπορούμε να αντικαταστήσουμε την ομάδα selector #topmenu, #footer ul
με τον selector που βασίζεται σε class .menu
:
.menu {
font-style: oblique
}
Όπως και με τους selectors που βασίζονται σε ID, η προσθήκη του ονόματος του tag, στα αριστερά της τελείας στους selectors που βασίζονται σε class, είναι προαιρετική. Ωστόσο, σε αντίθεση με τα IDs, το ίδιο class υποτίθεται ότι χρησιμοποιείται σε περισσότερα από ένα element και δεν χρειάζεται καν να είναι του ίδιου τύπου. Επομένως, εάν το menu
class μοιράζεται μεταξύ διαφορετικών τύπων element, η χρήση του selector ul.menu
θα ταιριάζει μόνο με τα ul
elements που έχουν το class menu
. Αντίθετα, η χρήση του .menu
ως selector θα ταιριάζει με οποιοδήποτε element που έχει το class menu
, ανεξάρτητα από τον τύπο του.
Επιπλέον, τα elements μπορούν να συσχετιστούν με περισσότερα από ένα class. Θα μπορούσαμε να διαφοροποιήσουμε μεταξύ του top και του bottom menu προσθέτοντας ένα επιπλέον class σε καθένα από αυτά:
<ul id="topmenu" class="menu top">
Και στο footer menu:
<ul class="menu footer">
Όταν το class
attribute έχει περισσότερα από ένα class, πρέπει να διαχωρίζονται με κενά. Τώρα, εκτός από τον κανόνα CSS που μοιράζεται μεταξύ των elements του menu
class, μπορούμε να αντιμετωπίσουμε το top και footer menu χρησιμοποιώντας τα αντίστοιχα classes:
.menu {
font-style: oblique
}
.menu.top {
font-size: large
}
.menu.footer {
font-size: small
}
Λάβετε υπόψη ότι το .menu.top
διαφέρει από το .menu .top
(με κενό μεταξύ των λέξεων). Ο πρώτος selector θα αντιστοιχίσει elements που έχουν και τα δύο classes menu
και top
, ενώ ο δεύτερος θα αντιστοιχίσει elements που έχουν το class top
και ένα parent element με το class menu
.
Ειδικοί Selectors
Οι CSS selectors μπορούν επίσης να αντιστοιχίσουν δυναμικές καταστάσεις των elements. Αυτοί οι selectors είναι ιδιαίτερα χρήσιμοι για διαδραστικά elements, όπως hyperlinks. Μπορεί να θέλετε η εμφάνιση των hyperlinks, να τραβήξει την προσοχή του επισκέπτη, όταν ο δείκτης του ποντικιού κινείται πάνω τους.
Πίσω στη σελίδα του δείγματός μας, θα μπορούσαμε να αφαιρέσουμε τις υπογραμμίσεις από τους συνδέσμους στο top menu και να εμφανίσουμε μια γραμμή μόνο όταν ο δείκτης του ποντικιού μετακινηθεί πάνω από τον αντίστοιχο σύνδεσμο. Για να γίνει αυτό, γράφουμε πρώτα έναν κανόνα για να αφαιρέσουμε την υπογράμμιση από τους συνδέσμους στο top menu:
.menu.top a {
text-decoration: none
}
Στη συνέχεια χρησιμοποιούμε το pseudo-class :hover
πάνω στα ίδια elements, για να δημιουργήσουμε έναν κανόνα CSS που θα ισχύει μόνο όταν ο δείκτης του ποντικιού βρίσκεται πάνω από το αντίστοιχο element:
.menu.top a:hover {
text-decoration: underline
}
Ο pseudo-class selector :hover
δέχεται όλες τις ιδιότητες CSS των συμβατικών κανόνων CSS. Άλλα pseudo-classes περιλαμβάνουν το :visited
, το οποίο ταιριάζει με hyperlinks που έχουν ήδη επισκεφτεί και το :focus
, το οποίο ταιριάζει με elements φόρμας που έχουν λάβει focus.
Καθοδηγούμενες Ασκήσεις
-
Ας υποθέσουμε ότι μια σελίδα HTML έχει ένα stylesheet που σχετίζεται με αυτήν, που περιέχει τους δύο ακόλουθους κανόνες:
p { color: green; } p { color: red; }
Τι χρώμα θα εφαρμόσει το πρόγραμμα περιήγησης στο κείμενο μέσα στα
p
elements; -
Ποια είναι η διαφορά μεταξύ της χρήσης του ID selector
div#main
και του#main
; -
Ποιος selector ταιριάζει με όλα τα
p
elements που χρησιμοποιούνται μέσα σε έναdiv
με το attribute ID#main
; -
Ποια είναι η διαφορά μεταξύ της χρήσης του class selector
p.highlight
και.highlight
;
Ασκήσεις Εξερεύνησης
-
Γράψτε έναν κανόνα CSS που αλλάζει την ιδιότητα
font-style
σεoblique
. Ο κανόνας πρέπει να αντιστοιχεί μόνο μεa
elements που βρίσκονται μέσα στο<div id="sidebar"></div>
ή στο<ul class="links"></ul>
. -
Ας υποθέσουμε ότι θέλετε να αλλάξετε το style των elements των οποίων το
class
attribute έχει οριστεί σεarticle reference
, όπως στο<p class="article reference">
. Ωστόσο, ο selector.article .reference
δεν φαίνεται να αλλάζει την εμφάνισή τους. Γιατί ο selector δεν ταιριάζει με τα elements όπως αναμένεται; -
Γράψτε έναν κανόνα CSS για να αλλάξετε την ιδιότητα
color
όλων των συνδέσμων που επισκεφτήκατε στη σελίδα σεred
.
Σύνοψη
Αυτό το μάθημα καλύπτει τον τρόπο χρήσης των CSS selectors και τον τρόπο με τον οποίο το πρόγραμμα περιήγησης αποφασίζει ποια styles θα εφαρμόσει σε κάθε element. Όντας ξεχωριστό από το HTML markup, το CSS παρέχει πολλούς selectors για να ταιριάζουν μεμονωμένα selectors ή ομάδες selectors στη σελίδα. Το μάθημα περιλαμβάνει τις ακόλουθες έννοιες και διαδικασίες:
-
Styles ολόκληρης της σελίδας και style inheritance.
-
Styling elements ανα τύπο.
-
Χρησιμοποίηση του element ID και το class ως selector.
-
Σύνθετους selectors.
-
Χρησιμοποίηση pseudo-classes για δυναμικό style των elements.
Απαντήσεις στις Καθοδηγούμενες Ασκήσεις
-
Ας υποθέσουμε ότι μια σελίδα HTML έχει ένα stylesheet που σχετίζεται με αυτήν, που περιέχει τους δύο ακόλουθους κανόνες:
p { color: green; } p { color: red; }
Τι χρώμα θα εφαρμόσει το πρόγραμμα περιήγησης στο κείμενο μέσα στα
p
elements;Το χρώμα
red
. Όταν δύο ή περισσότεροι ισοδύναμοι selectors έχουν αντικρουόμενες ιδιότητες, το πρόγραμμα περιήγησης θα επιλέξει τον τελευταίο. -
Ποια είναι η διαφορά μεταξύ της χρήσης του ID selector
div#main
και του#main
;Ο selector
div#main
ταιριάζει με έναdiv
element που έχει το IDmain
, ενώ ο selector#main
ταιριάζει με το element που έχει το IDmain
, ανεξάρτητα από τον τύπο του. -
Ποιος selector ταιριάζει με όλα τα
p
elements που χρησιμοποιούνται μέσα σε έναdiv
με το attribute ID#main
;Ο selector
#main p
ήdiv#main p
. -
Ποια είναι η διαφορά μεταξύ της χρήσης του ID selector
div#main
και του#main
;Ο selector
p.highlight
αντιστοιχεί μόνο στα elements του τύπουp
που έχουν το classhighlight
, ενώ ο selector.highlight
ταιριάζει με όλα τα elements που έχουν το classhighlight
, ανεξάρτητα από τον τύπο τους.
Απαντήσεις στις Ασκήσεις Εξερεύνησης
-
Γράψτε έναν κανόνα CSS που αλλάζει την ιδιότητα
font-style
σεoblique
. Ο κανόνας πρέπει να αντιστοιχεί μόνο μεa
elements που βρίσκονται μέσα στο<div id="sidebar"></div>
ή στο<ul class="links"></ul>
.#sidebar a, ul.links a { font-style: oblique }
-
Ας υποθέσουμε ότι θέλετε να αλλάξετε το style των elements των οποίων το
class
attribute έχει οριστεί σεarticle reference
, όπως στο<p class="article reference">
. Ωστόσο, ο selector.article .reference
δεν φαίνεται να αλλάζει την εμφάνισή τους. Γιατί ο selector δεν ταιριάζει με τα elements όπως αναμένεται;Ο selector
.article .reference
θα ταιριάζει με τα elements που έχουν το classreference
που είναι descendants των elements που έχουν το classarticle
. Για να αντιστοιχίσετε elements που έχουν και τα δύο classesarticle
καιreference
, ο selector θα πρέπει να είναι.article.reference
(χωρίς κενό μεταξύ τους). -
Γράψτε έναν κανόνα CSS για να αλλάξετε την ιδιότητα
color
όλων των συνδέσμων που επισκεφτήκατε στη σελίδα σεred
.a:visited { color: red; }