Aller au contenu principal
Guillaume Duverger Code & graphisme

CSS card Grid layout / container queries

Pierre Martin

Développeur front-end




<div class="demo">

<div class="cadre-demo">

<div class=entete-photo>
<img src="image.jpg" alt>
</div>

<div class=profil-photo>
<img src="image.jpg" alt>	
</div>

<div class=demo-info>

<h3>Pierre Martin </h3>
<h4>Développeur front-end</h4>

<div class=actions>

<a href="">contact</a>
<a href="">portfolio</a>

</div>

</div>

<div class=demo-social>

<a href="" title="Twitter"><svg></svg></a>
<a href="" title="Flux"><svg></svg></a>
<a href="" title="Youtube"><svg></svg></a>

</div>
			
		
</div>

</div>	







*,*::after,*::before{box-sizing:border-box}	
	
:root{
		
--grid-card: "entete" minmax(200px,1fr) "corps" 1fr/1fr;
--zone-1:entete;
--zone-2:corps;
--couleur-1:violet;
--couleur-2:#6753ea;
--couleur-3:white;
--couleur-4:#585858;
--gradient:var(--couleur-1),50%,var(--couleur-2);		
	}	
.demo{	

margin: 2rem auto;
max-width: 960px;
padding:1rem;
container: carte /  inline-size;

}
	
	
.cadre-demo {


display:grid;
grid-template:var(--grid-card);
border-radius: 0.5ch;
box-shadow: .05rem .1rem .3rem -.03rem rgba(0, 0, 0, 0.20);
padding:1rem;
background-color:var(--couleur-3);
color:var(--couleur-4)
}

.cadre-demo>*{z-index:1}

.entete-photo{
	
display:grid;
grid-area:var(--zone-1);


}
	
.entete-photo::before{
	
opacity: .5;
content:'';
background: linear-gradient(45deg,var(--gradient));
grid-area: 1/1;
	}	
	
	
.demo-info{
	
display:grid;
grid-area:var(--zone-2);
	
}
	

	
.entete-photo img{

grid-area:1/1;
height: 100%;
width:100%;
object-fit: cover;
	
	}
	
	
.profil-photo{

grid-area:var(--zone-1);
place-self: end start;
margin-bottom: -10cqi;
margin-left:1rem;

	}

.profil-photo img{
display:block;	
outline:5px solid var(--couleur-3);	
width:var(--lg-profil,20cqi);
aspect-ratio:1;
object-fit: cover;
border-radius:9999px;
clip-path: var(--clip-profil)
}

	
.cadre-demo h3{
	
place-self: start;
margin:.5rem 0 0 25cqi;
font-size: clamp(1.25rem, 4cqi, 2rem);
	
}	
	
.cadre-demo h4{
	

place-self: center;	
font-size: clamp(1rem, 3cqi, 1.5rem);
	
	}
	

.actions{
	
display: grid; 
grid-auto-flow: column; 
grid-auto-columns: 1fr;
gap:1rem;
text-align: center;
width: max-content; 
place-self:end center;
	
}
	
.demo-social{
	
grid-area:var(--zone-1);
place-self: end;
	
	}
	
	
.actions a{
	
position:relative;	
text-transform: uppercase;
font-size: clamp(1rem, 2cqi, 1.25rem);
border-radius: 9999px;
padding:.5rem 2rem;
text-decoration: none;
background-color: var(--bg-bouton,#6753ea);
color:var(--couleur-3);

	
}
	

	
.actions a::after{
content: "";
border-radius:inherit;
position: absolute;
z-index: -1;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 0 0.25em 0.25em rgba(255, 255, 255, 0.31);
opacity: 0;
transition:opacity .4s linear,box-shadow .4s ease-in;
	}
	

	
.demo-social{
	
display: flex;

	}
	
.demo-social a{
	
display: flex;
margin:.5rem;

}
	
.demo-social svg{
	
fill:#5a5a5a;
background-color: var(--couleur-3);
border-radius:.25rem;
width:clamp(1rem, 3cqi, 1.5rem);
height:clamp(1rem, 3cqi, 1.5rem)
	
	}		
	
@container carte (min-width: 640px) {
	
.cadre-demo {
	  
--grid-card: "entete corps" 300px /auto 300px;
	  
  }
	
	
.demo-social{
	
justify-self: center;

	
	}	
	

.profil-photo img{
	
outline:unset;
--clip-profil:polygon(20% 0%, 100% 0, 100% 100%, 0% 100%);
grid-area:1/1;
border-radius:unset;
--lg-profil:100%;

	
}

	
.entete-photo img{display:none}
	
	
.entete-photo::before{
	
background:linear-gradient(to right,var(--gradient));
	
	}
	
.demo-info{

--zone-2:var(--zone-1);
place-self:center;
padding:1rem;
place-content:center;
	
}	

.demo-info>*{margin:1rem 0}
	
.profil-photo{
	
display:grid;
margin:unset;
--zone-1:var(--zone-2);

}
	
.profil-photo::before{
	
grid-area:1/1;
content:'';
z-index:1;
opacity: .5;
background:linear-gradient(to left,var(--gradient))
	
}	

	
.cadre-demo h3 {
	
margin:unset;
justify-self: center;
	
	}
 
.actions{
--zone-2:var(--zone-1);
	
	}
	
.actions a{
	
--bg-bouton:var(--couleur-3);
color:var(--couleur-4);
	
	}
	
.actions a:is(:focus,:hover)::after{opacity:1}
	}