Introduction▲
L'idéal est d'avoir une page sans ascenseur car le pseudoélément :target provoque des sauts de page vers l'objet ciblé, ce qui serait gênant sur un site avec un scroll. Si besoin, cela peut être réglé avec une ligne de JavaScript que vous pourrez trouver à la fin de cet article.
Support▲
Visiteurs concernés | |
---|---|
Démo complète | 55.93 % |
Sans les transitions | 72.47 % |
Le HTML▲
Pour commencer, regardons un peu la structure HTML à utiliser. Elle consiste en un élément parent contenant différents sous-éléments, chacun correspondant à une image. Chacun de ces blocs image possède quelques fonctionnalités comme un bouton de fermeture, une image et un lien permettant de cliquer sur l'image pour l'agrandir. Chaque lien expand est lié au conteneur parent afin de pouvoir utiliser :target en CSS.
<div id
=
"images-box"
>
<div class
=
"holder"
>
<div id
=
"image-1"
class
=
"image-lightbox"
>
<span class
=
"close"
><a href
=
"#"
>
X</a></span>
<img src
=
"1.jpg"
alt
=
"earth!"
>
<a class
=
"expand"
href
=
"#image-1"
></a>
</div>
</div>
<div class
=
"holder"
>
<div id
=
"image-2"
class
=
"image-lightbox"
>
<span class
=
"close"
><a href
=
"#"
>
X</a></span>
<img src
=
"2.jpg"
alt
=
"earth!"
>
<a class
=
"expand"
href
=
"#image-2"
></a>
</div>
</div>
<div class
=
"holder"
>
<div id
=
"image-3"
class
=
"image-lightbox"
>
<span class
=
"close"
><a href
=
"#"
>
X</a></span>
<img src
=
"3.jpg"
alt
=
"earth!"
>
<a class
=
"expand"
href
=
"#image-3"
></a>
</div>
</div>
</div>
Le CSS▲
Le code CSS n'est pas très compliqué. Tout d'abord, appliquons des styles aux blocs image.
#images-box
{
/* La largeur totale du bloc conteneur, essentiellement pour le centrage */
width:
850
px;
margin:
0
px auto
;
position:
relative
;
top
:
70
px;
}
.image-lightbox
img {
/* Chaque image hérite ses dimensions de son parent */
width:
inherit
;
height:
inherit
;
z-index:
3000
;
}
.holder
{
/* Dimension des images, vous pouvez les modifier */
width:
250
px;
height:
166
px;
/* Flottement à gauche, donc l'ensemble est aligné à droite */
float:
left
;
margin:
0
20
px 0
0
;
}
.image-lightbox
{
/* Les dimensions héritent de .holder */
width:
inherit
;
height:
inherit
;
padding:
10
px;
/* Ombrage des blocs */
box-shadow:
0
px 0
px 10
px rgba(
0
,
0
,
0
,
0.1
);
background:
#fff
;
border-radius:
5
px;
/* Position absolue pour permettre de zoomer ultérieurement */
position:
absolute
;
top
:
0
;
font-family:
Arial,
sans-serif
;
/* Transitions pour rendre l'ensemble visuellement abouti */
-webkit-transition:
all
ease-in
0.5
s;
-moz-transition:
all
ease-in
0.5
s;
-ms-transition:
all
ease-in
0.5
s;
-o-transition:
all
ease-in
0.5
s;
}
Ensuite, nous appliquons des styles aux éléments internes. J'ai affecté aux <span> une propriété display: none; afin de ne faire apparaître les boutons de fermeture que lorsque l'utilisateur clique sur une image. Les ancres ont été prévues pour prendre tout l'espace disponible du parent, le rendant ainsi entièrement cliquable.
.image-lightbox
span {
display:
none
;
}
.image-lightbox
.expand
{
width:
100
%;
height:
100
%;
position:
absolute
;
top
:
0
;
z-index:
4000
;
background:
rgba(
0
,
0
,
0
,
0
);
/* Fixe un bogue d'IE */
left
:
0
;
}
.image-lightbox
.close
{
position:
absolute
;
width:
20
px;
height:
20
px;
right
:
20
px;
top
:
20
px;
}
.image-lightbox
.close
a {
height:
auto
;
width:
auto
;
padding:
5
px 10
px;
color:
#fff
;
text-decoration:
none
;
background:
#22272c
;
box-shadow:
inset
0
px 24
px 20
px -15px rgba(
255
,
255
,
255
,
0.1
),
inset
0
px 0
px 10
px rgba(
0
,
0
,
0
,
0.4
),
0
px 0
px 30
px rgba(
255
,
255
,
255
,
0.4
);
border-radius:
5
px;
font-weight:
bold
;
float:
right
;
}
.image-lightbox
.close
a:
hover
{
box-shadow:
inset
0
px -24px 20
px -15px rgba(
255
,
255
,
255
,
0.01
),
inset
0
px 0
px 10
px rgba(
0
,
0
,
0
,
0.4
),
0
px 0
px 20
px rgba(
255
,
255
,
255
,
0.4
);
}
Avant de passer à la gestion de :target, il reste un peu de positionnement à effectuer. Si vous souhaitez ajouter des images, il faudra compléter cette partie.
div#image
-
1
{
left
:
0
;
}
div#image
-
2
{
left
:
290px;
}
div#image
-
3
{
left
:
580px;
}
Le ciblage des éléments n'est pas particulièrement compliqué. Nous avons juste besoin de modifier les propriétés position et z-index ainsi que la propriété display de certains éléments.
div[
id^=
image]:
target
{
width:
450
px;
height:
300
px;
z-index:
5000
;
top
:
50
px;
left
:
200
px;
}
div[
id^=
image]:
target
.close
{
display:
block
;
}
div[
id^=
image]:
target
.expand
{
display:
none
;
}
div#image-1
:
target
,
div#image-2
:
target
,
div#image-3
:
target
{
left
:
200
px;
}
Et voilà ! Vous trouverez ci-dessous le code CSS complet si vous voulez le copier/coller.
Conclusions et remerciements▲
Cet article a été traduit avec l'aimable autorisation de inserthtml. L'article original : A CSS Only Image Gallery With Zooming! peut être vu sur le site de inserthtml.
Nous tenons à remercier _Max_ pour sa relecture attentive de cet article.