28172 sujets

CSS et mise en forme, CSS3

Bonjour/bonsoir à tous !

Il y a quelques temps je suis tombée sur un site d'histoire de l'art qui utilise des images réagissant au rollover pour présenter les liens vers ses articles. Au passage de la souris, l'image "s'agrandit" à partir du centre dans les quatre directions sans décaler les div adjacentes.

Par curiosité, j'ai essayé de reproduire cet effet avec de simples images, en vain... !

Je vous mets un lien vers la page avec l'effet en question pour montrer ce que je veux dire : http://arthistoryproject.com/artists/

En observant le comportement de la div au survol de la souris, ce n'est en fait pas l'"image" qui s'agrandit, mais plutôt la div qui la contient et qui révèle les parties masquées (avec un overflow: hidden ?). Cette div semble en contenir deux qui occupent chacune 50% de la hauteur : une avec l'image et l'autre avec du texte.

J'ai depuis perdu le code que j'avais écrit pour m'exercer, mais dans l'idée j'avais essayé de reproduire l'effet ainsi :


<div id="box_container">
     <div id="image"><img src="image1.png"></div>
     <div id="texte"><h1>blabla titre</h1><p>blabla paragraphe</p></div>
</div>


CSS :


#box_container {
     width: 300px;
     height: 400px;
     overflow: hidden;
}
#image {
     width: 350px;
     height: 450px;
}
#box_container:hover {
    transform: scale(1.1);
    -webkit-transform: scale(1.1);
    transition: 500ms;
    -webkit-transition: 500ms;
}


De cette manière, je voulais faire en sorte que ce ne soit pas l'image qui soit zoommée ou qui s'agrandisse, mais que ce soit uniquement son parent (le box_container en overflow: hidden) qui s'agrandisse et révèle les parties cachées de l'image (donc celles qui dépassent les dimensions de son parent box_container).

Malheureusement, cette méthode ne fait qu'agrandir l'image avec son contenant, au lieu du contenant tout seul. J'ai essayé de bidouiller avec les "position:relative" et "absolute" pour empêcher l'image de s'agrandir, mais jusque-là ça n'a rien donné. Bref, je sèche complètement Smiley lol

Si quelqu'un a une idée pour reproduire cet effet, je suis très preneuse. Merci pour votre aide et bonne journée Smiley lol
Bonjour !

Une idée, oui, c'est faisable... avec la propriété clip... qui est dépréciée à présent. Par contre, je n'ai pas l'impression que c'est cette technique qui ait été utilisé dans l'exemple que vous citez...

J'ai un peu galéré car pour utiliser clip, il faut mettre l'élément 'à rogner' en position : absolute... et je ne trouve pas non plus la syntaxe de clip terriblement évidente.

Je vous donne le CodePen dont je me suis inspirée :
http://codepen.io/iamvdo/pen/mextn

Smiley smile
Bonjour,

L'effet est sympa en effet. L'élément parent dispose d'une marge de 12px qui est annulée si :hover, le tout est appuyé par un paramétrage de transition disposé sur plusieurs éléments dans le code :
transition: all .3s ease-in-out;

Ceci étant dit, au vu des répétitions, l'intégrateur n'a pas du regarder de très près le code de sortie de son préprocesseur...

Voici l'ensemble du code :
.listItem {
    background-color: transparent;
    position: relative;
    width: 33.33%;
    display: block;
    height: 564px;
    -webkit-transition: none;
    -moz-transition: none;
    -ms-transition: none;
    -o-transition: none;
    transition: none;
    float: left
}
.listItem .itemBox {
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    -ms-transition: all .3s ease-in-out;
    -o-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out;
    overflow: hidden;
    margin: 12px;
    height: 540px;
    background-color: #fff;
    -webkit-box-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0);
    -moz-box-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0);
    box-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0)
}
.listItem .frame {
    overflow: hidden
}
.listItem .frame .plus {
    position: absolute;
    top: 15px;
    right: 15px;
    height: 40px;
    width: 40px;
    background-color: rgba(0, 0, 0, .2);
    color: #fff;
    text-align: center;
    font-size: 30px;
    padding-top: 16px;
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    -ms-transition: all .3s ease-in-out;
    -o-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out;
    opacity: 0;
    border: 2px solid #fff
}
.listItem .frame img {
    width: 100%;
    height: auto
}
.listItem .artistListProfile {
    position: absolute;
    top: 180px;
    left: 28%;
    margin-left: -60px;
    height: 100px;
    width: 100px;
    background-size: cover;
    background-position: center center;
    border-radius: 70px;
    z-index: 5
}
.listItem .itemBackground {
    height: 300px;
    width: 100%;
    overflow: hidden;
    position: relative;
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    -ms-transition: all .3s ease-in-out;
    -o-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out
}
.listItem .itemBackground div {
    margin: -12px -12px 0 -12px;
    height: 100%;
    bottom: 0;
    line-height: 0;
    overflow: hidden;
    background-size: cover;
    background-position: center center;
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    -ms-transition: all .3s ease-in-out;
    -o-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out
}
.listItem .itemInfo {
    color: #222;
    padding: 20px 30px 20px;
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    -ms-transition: all .3s ease-in-out;
    -o-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out
}
.listItem .itemInfo h3 {
    position: relative;
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    -ms-transition: all .3s ease-in-out;
    -o-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out
}
.listItem .itemInfo h3 a {
    color: #222
}
.listItem .itemInfo h3 a:hover {
    color: #2752cc
}
.listItem .itemInfo p {
    font-size: 24px;
    font-weight: 300;
    line-height: 1.3;
    max-width: 86%;
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    -ms-transition: all .3s ease-in-out;
    -o-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out
}
.listItem .itemInfo .smallHeader {
    display: block;
    line-height: 18px;
    margin-top: 10px
}
.listItem .itemInfo .smallHeader a {
    color: #979797
}
.listItem .itemInfo .smallHeader a:hover {
    color: #2752cc
}
.listItem .itemInfo.noPortrait {
    padding: 0 30px 20px
}
.listItem:hover .itemBox {
    margin: 0;
    height: 564px;
    position: relative;
    z-index: 4;
    -webkit-box-shadow: 0 10px 30px -10px rgba(0, 0, 0, .3);
    -moz-box-shadow: 0 10px 30px -10px rgba(0, 0, 0, .3);
    box-shadow: 0 10px 30px -10px rgba(0, 0, 0, .3)
}
.listItem:hover .itemBox .itemBackground {
    width: 400px;
    width: 100%
}
.listItem:hover .itemBox .itemBackground div {
    margin: 0
}
.listItem:hover .itemBox .itemInfo {
    padding: 32px 42px 20px
}
.listItem:hover .itemBox .itemInfo h3 {
    color: #2752cc
}
.listItem:hover .itemBox .itemInfo p {
    color: #2752cc
}
.listItem:hover .itemBox .itemInfo.noPortrait {
    padding: 12px 42px 20px
}
body.alphabetical .listItem .itemInfo .mediumHeader .name {
    float: left;
    display: inline-block;
    margin-right: 6px
}
body.alphabetical .listItem .itemInfo .mediumHeader .name:after {
    content: ','
}
.listItem.artwork {
    padding: 1%;
    background-color: transparent;
    min-height: 0;
    height: auto
}
.listItem.artwork .artLink {
    display: block;
    line-height: 0;
    position: relative
}
.listItem.artwork .artLink .plus {
    position: absolute;
    top: 15px;
    right: 15px;
    height: 40px;
    width: 40px;
    background-color: rgba(0, 0, 0, .2);
    color: #fff;
    text-align: center;
    font-size: 30px;
    padding-top: 16px;
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    -ms-transition: all .3s ease-in-out;
    -o-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out;
    opacity: 0;
    border: 2px solid #fff
}
.listItem.artwork img {
    margin: 0 auto;
    width: 100%;
    cursor: -webkit-zoom-in;
    height: auto !important
}
.listItem.artwork .itemInfo {
    background-color: #fff
}
.listItem.artwork .artLinks {
    display: none
}
.listItem.artwork .description {
    display: none;
    font-size: 14px;
    line-height: 1.4em;
    margin-bottom: 6%;
    color: #ccc;
    margin-top: 6%
}
.listItem.artwork .description .sourceLink {
    display: inline-block;
    margin-top: 15px
}
.listItem.writing {
    height: auto;
    padding: 1%
}
.listItem.writing .itemInfo {
    padding: 55px 40px 35px 30px;
    background-color: #fff
}
.listItem.writing .artistListProfile {
    height: 80px;
    width: 80px;
    position: relative;
    top: auto;
    left: auto;
    margin: 0 15px 15px 0
}
.listItem.writing p {
    font-size: 20px;
    line-height: 1.4em;
    font-weight: 300;
    margin-bottom: 30px
}
.listItem.wide {
    width: 100%;
    height: 324px;
    min-height: 324px
}
.listItem.wide .itemBox {
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    -ms-transition: all .3s ease-in-out;
    -o-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out;
    overflow: hidden;
    margin: 12px;
    height: 300px
}
.listItem.wide .itemBox .itemBackground {
    float: left;
    width: 180px;
    height: 324px;
    margin: 0;
    z-index: 2
}
.listItem.wide .itemBox .itemBackground div {
    margin-right: 12px
}
.listItem.wide .itemBox .itemInfo {
    padding: 30px 30px 0 210px;
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    -ms-transition: all .3s ease-in-out;
    -o-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out;
    position: relative
}
.listItem.wide .itemBox .itemInfo h3 {
    font-size: 34px;
    font-weight: 200
}
.listItem.wide .itemBox .itemInfo p {
    max-width: 90%;
    margin-top: 20px;
    font-size: 18px
}
.listItem.wide .artistListProfile {
    top: 32px;
    left: 140px;
    position: absolute
}
.listItem.wide:hover .itemBox {
    margin: 0;
    height: 324px
}
.listItem.wide:hover .itemBox .itemBackground {
    margin: 0
}
.listItem.wide:hover .itemBox .itemBackground div {
    margin-right: 0
}
.listItem.wide:hover .itemBox .itemInfo {
    padding: 42px 30px 0 222px
}
.listItem.collection {
    height: 164px
}
.listItem.collection .itemBox {
    height: 140px
}
.listItem.collection .itemBox .itemInfo {
    padding: 0 30px 20px
}
.listItem.collection:hover .itemBox {
    margin: 0;
    height: 164px
}
.listItem.collection:hover .itemBox .itemInfo {
    padding: 12px 42px 20px
}
.listItem.collection:hover .itemBox .itemInfo h3 {
    color: #2752cc
}
.listItem.fade {
    opacity: .2
}
.listItem.hover {
    opacity: 1
}
.listItem:hover .artLink .plus {
    opacity: 1
}
Merci pour vos réponses claires et détaillées !

Zelena : j'ai essayé diverses solutions à partir de ta suggestion, mais je n'ai pas réussi à réutiliser ton code de manière à reproduire l'effet de "fenêtre qui s'ouvre" sur l'image. Je dois dire que je suis encore débutante en CSS. Par contre, j'ai appris beaucoup sur la propriété clip ! merci

Olivier : ah oui... l'intégrateur n'y est pas allé de main morte sur les lignes de code ! Je crois saisir l'idée, mais mes tentatives ont été... comment dire... assez dysfonctionnels Smiley lol

Du coup, j'ai essayé de repartir du début en simplifiant le HTML au maximum. j'ai réussi à reproduire le même effet en utilisant une bordure sur un span (de la couleur du background), qui se réduit progressivement à zéro au passage de la souris. Bon c'est du bricolage mais l'illusion est là.
Le seul problème est une légère "saccade" lors de l'agrandissement/rétrécissement de la bordure (même avec une transition linéaire) que je n'ai pas réussi à résoudre Smiley fache
En mettant une transition linéaire, on voit bien qu'il y a une sorte de "pallier" à l'allée et au retour. Si quelqu'un a une idée...

Je vous poste le code au cas où quelqu'un voudrait l'utiliser ou s'en inspirer pour un de ses projets :


<a class="wrap">
     <img src="img/affiche1.png">
     <span></span>
</a>


html, body {
	margin: 0;
	padding: 0;
	background: #EEE;
}
     .wrap {margin: 0 0 5px 5px;
     cursor: pointer;
     position: relative;
     float: left; 
}
.wrap img {
     display: block; 
}
.wrap span {
     position: absolute;
     top: 0; right: 0; bottom: 0; left: 0;
     border: solid 10px #EEE;
     transition: all .3s ease-in-out;
     -webkit-transition: all .3s ease-in-out;
}
.wrap:hover span, .wrap:focus span {
     border: solid 0px #EEE;
     transition: all .3s ease-in-out;
     -webkit-transition: all .3s ease-in-out;
}