On a vu comment fabriquer un cercle avec border-radius. On va essayer d'aller un peu plus loin en donnant un peu de volume à nos cercles de façon à ce qu'ils aient un peu plus de consistance.
Les boules
La différence entre un cercle et une "pseudo" sphère tient en peu de chose. Ce n'est qu'une question d'habillage. En général, on va partir d'un cercle noir sur lequel on va appliquer un dégradé circulaire plus ou moins important. Le plus compliqué va être de choisir les couleurs.
<style>
#ball1 {
width: 200px;
height: 200px;
border-radius: 50%;
background-color: black;
background: radial-gradient(circle at 20% 20%, rgba(255, 127, 255, 0.5), rgba(0, 0, 0, 0.8) 85%);
}
</style>
<div id="ball1">
</div>
On commence par créer un cercle noir ayant un diamètre de 200 pixels sur lequel on applique notre dégradé. Sur les pages "Formulaires" et "Photos", nous avions vu l'utilisation de linear-gradient. Ici nous allons parler de sa cousine radial-gradient. Les deux servent à faire des dégradés. On parlera également de repeating-linear-gradient ainsi que de repeating-radial-gradient afin d'avoir la famille au complet.
Dans l'exemple, nous utilisons un dégradé circulaire dont le point de départ est situé à 20% horizontalement et verticalement du coin supérieur gauche de ball1. Si nous ne voulons pas d'un dégradé circulaire, on remplace circle par ellipse. Si nous voulons que le dégradé débute au centre de notre boîte, il suffit d'omettre "at 20% 20%". Les valeurs ne sont pas forcément exprimées en pourcentages, elles peuvent être en pixels, centimètres, point etc.
Les deux couleurs (il peut y en avoir plus) du dégradé sont un rose moyen et le noir. Le rose à une transparence de 50% et le noir une transparence de 80% ce qui, mélangé au noir du background-color donne les tons plus ou moins violacés de notre sphère. Le dernier pourcentage (85%), indique que le dégradé s'arrête à 85% de la limite du cercle.
Plutôt qu'un long discours barbant, je vais vous montrer quelques exemples de dégradés.
background: linear-gradient(red, blue);
background: linear-gradient(to left, red, blue);
background: linear-gradient(45deg, red, blue);
background: repeating-linear-gradient(45deg, red, red 5px, blue 5px, blue 10px);
background: repeating-linear-gradient(yellow 5px, green 10px, red 15px);
background: radial-gradient(yellow, red);
background: radial-gradient(at 25px 25px, yellow, green);
background: radial-gradient(farthest-side at center left, yellow, green);
background: radial-gradient(closest-side at center 20%, yellow, green);
background: radial-gradient(farthest-corner at 60% 60%, yellow, green);
background: radial-gradient(closest-corner at 60% 60%, yellow, green);
background: repeating-radial-gradient(circle, yellow 10px, green, red 40px);
background:
repeating-linear-gradient(0deg, rgba(255, 0, 0, 0.5), rgba(0, 0, 255, 0.5) 20px),
repeating-linear-gradient(90deg, yellow, green 20px);
Voilà un aperçu de ce que l'on peut faire avec les dégradés. Si les douze premiers exemples ne posent pas de problème particulier, le dernier mérite une explication. Vous avez deux fonctions (on peut en utiliser plus) qui se suivent. Elles sont séparées par une virgule. On peut considérer que les effets sont empilés. Celui qui est décrit en premier se retrouve en haut de la pile et le dernier se retrouve au fond. Cela rend inévitable l'utilisation des couleurs rgba(). Si vous utilisez des couleurs "normales" pour l'effet sur le dessus de la pile, il sera le seul à s'afficher à l'écran. Seul le dernier de la liste peut se permettre d'utiliser des couleurs opaques.
A propos des 7ème, 8ème et 9ème exemples, il faut ajouter -webkit- et -o- devant radial-gradiant pour Chrome et Opera. Firefox fonctionne sans préfixe vendeur. Pour ce qui est d'Internet Explorer (version 11), c'est toujours sans espoir. J'ai regardé sur MSDN, il faut mettre une virgule après circle; Il suffit de le savoir. Tout le reste fonctionne sans problème.
L'intérêt de l'empilement des effets est de pouvoir créer des textures. A gauche, on a un exemple qui n'est sans doute pas le meilleur mais qui illustre ce que je veux dire. La boule a pratiquement la même structure que celle du dernier exemple sur laquelle s'applique une couche d'un bleu léger avec radial-gradient.
L'ombre est légèrement vers la droite et c'est sans doute ici qu'est la plus grande difficulté. Il faut la positionner de façon à ce que l'ensemble garde une certaine cohérence.
<style>
#ball2 {
width: 200px;
height: 200px;
border-radius: 50%;
background:
radial-gradient(circle at 40% 5%, rgba(220, 220, 220, 1), rgba(0, 0, 128, 0.9) 98%),
repeating-linear-gradient(0deg, rgba(255, 0, 0, 0.5), rgba(0, 0, 255, 0.5) 20px),
repeating-linear-gradient(90deg, yellow, green 20px);
}
#ombre {
position: relative;
width: 160px;
height: 40px;
top: 175px;
left: 50px;
border-radius: 50%;
background: radial-gradient(gray, rgba(255, 255, 255, 0) 60%);
}
</style>
<div id="ball2">
<div id="ombre"></div>
</div>
Je vais essayer d'être clair dans ce que je vais vous raconter. Un peu plus haut, j'ai parlé d'empilement. Pour pouvoir gérer correctement les empilements, il faut que les objets soient "positionnés" à l'aide de la propriété position:.
En général, on utilise trois types de positionnement plus un qui ne sert qu'à mettre la propriété position: dans le style.
- position: absolute L'objet est positionné par rapport au conteneur dans lequel on le positionne
- position: relative L'objet est positionné par rapport à son emplacement naturel (emplacement où serait l'objet si on ne le positionnait pas.
- position: fixed L'objet reste à la place où on le positionne même si la page est redimensionnée ou bien si elle défile (voir le code)
- position: static L'objet se place comme si on n'indiquait rien
<style>
#encart {
position: fixed;
right: 0px;
bottom: 0px;
width: 150px;
height: 100px;
border: 1px solid black;
background-color: rgba(0, 0, 255, 0.3);
}
</style>
<div id="encart">
Un car à fond<br>
passe sur un pont.<br>
Le pont pète.<br>
La roue pète.<br>
Le car nage.
</div>
Si la propriété position: nous permet de positionner les objets en X et en Y, la propriété z-index: va nous permettre de les positionner en profondeur.
Première
Deuxième
Troisième
Première
Deuxième
Troisième
<style>
#divFond2 {
float: left;
width: 600px;
height: 400px;
border-style: dashed;
border-width: 2px;
border-color: black;
background-color: lightcyan;
}
#div12 {
position: relative;
left: 60px;
top: 20px;
width: 400px;
height: 120px;
background-color: lightpink;
}
#div22 {
position: relative;
z-index: 3;
left: 160px;
top: -30px;
width: 250px;
height: 30px;
background-color: yellow;
transform: rotate(-90deg);
}
#div32 {
position: relative;
left: 200px;
top: -60px;
width: 180px;
height: 180px;
background-color: rgba(200, 255, 0, 0.5);
}
</style>
<!-- DIV de fond -->
<div id="divFond2">
<div id="div12">
Première
</div>
<div id="div22">
Deuxième
</div>
<div id="div32">
Troisième
</div>
<!-- Fin du DIV de fond -->
</div>
Si on compare les deux exemples plus haut, on voit que dans le premier, les balises <div> sont affichées dans l'ordre où elles apparaissent dans le code. La première est au-dessus de la deuxième qui est elle-même recouverte en partie par la troisième. Sur le deuxième exemple, on peut constater que le rectancle jaune est passé sur le dessus de la pile de div. Cela est dû à la ligne que j'ai mise en rouge dans le style de #div22 : z-index: 3;. La propriété z-index accepte des valeurs numériques. Plus la valeur est grande, plus notre objet va être placé haut sur la pile. Si vous devez mettre de nombreux objets sur votre page, plutôt que de mettre des valeurs qui se suivent directement (1, 2, 3...), utilisez à la place des valeurs espacées, 10, 20, 30 etc. par exemple. Cela vous permettra, si vous devez ajouter un objet, d'insérer cet objet sans avoir à renuméroter l'ensemble de vos objets.