Utilisation des transitions CSS dans la disposition de la grille CSS

J'essaie d'obtenir mon en-tête collant pour avoir un effet de transition afin qu'il facilite plutôt que juste un mouvement instantané.

Qu'est-ce que je fais de mal?

Voici ma version de travail:

Http://codepen.io/juanmata/pen/RVMbmr

, Fondamentalement, le code suivant ajoute la classe minuscule de ma classe wrapper, cela fonctionne bien.

$(window).on('load', function() {
    $(window).on("scroll touchmove", function () {
        $('.wrapper').toggleClass('tiny', $(document).scrollTop() > 0);
    });
});

Voici la partie CSS:

.wrapper {
    grid-template-rows: 80px calc(75vh - 80px) 25vh 80px;
    -o-transition: all 0.5s;
    -moz-transition: all 0.5s;
    -webkit-transition: all 0.5s;
    transition: all 0.5s;
}
.tiny {
    grid-template-rows: 40px calc(75vh - 40px) 25vh 80px;
}

Donc l'en-tête rétrécit comme il se doit mais il n'y a pas d'animation, ai-je manqué quelque chose ou les transitions ne fonctionnent-elles tout simplement pas avec la grille?

Voici un lien vers les documents CSS-grid.

Https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout

$(window).on('load', function() {
  $(window).on("scroll touchmove", function() {
    $('.wrapper').toggleClass('tiny', $(document).scrollTop() > 0);
  });
});
* {
	margin:0;
	padding:0;
}

.wrapper {
	display: grid;
	grid-gap: 0px;
	grid-template-columns: 1fr 1fr 1fr 1fr;
	grid-template-rows: 80px calc(75vh - 80px) 25vh 80px;
	grid-template-areas:
		"head head head head"
		"main main main main"
		"leader leader leader leader"
		"foot foot foot foot";
	background-color: #fff;
	color: #444;
}
.tiny {
	grid-template-rows: 40px calc(75vh - 40px) 25vh 80px;
}
.box {
	background-color: #444;
	color: #fff;
	border-radius: 5px;
	font-size: 150%;
}
.box .box {
	background-color: lightcoral;
}

.head {
	grid-area: head;
	background-color: #999;
	z-index: 2;
	display: grid;
	grid-gap: 0px;
	grid-template-columns: 20% 1fr;
	-o-transition: all 0.5s;
	-moz-transition: all 0.5s;
	-webkit-transition: all 0.5s;
	transition: all 0.5s;
	position: sticky;
	top: 0;
}

.logo{
        height: inherit;
        grid-column: 1;
        grid-row: 1;
        background-color:red;
        position: relative;
        overflow: hidden;
    }
.logo img {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        display: block;
        max-width: 100%;
        height: auto;
    }
.main {
	grid-area: main;
	/* CSS Grid */
	z-index: 1;
	grid-column: head-start / head-end;
	grid-row: head-start / leader-start;
	background-color: red;
}
.leader {
	grid-area: leader;
	z-index:1;
	display: grid;
	grid-gap: 0px;
	grid-template-columns: repeat(4, 1fr  );
}
.foot {
	grid-area: foot;
	z-index:1;
}
<div class="wrapper">
  <div class="box head">
    <div class="box logo">
      <a href="#"><img src="https://unsplash.it/200/300/?random" /></a>
    </div>
    <div class="box nav">nav</div>
  </div>
  <div class="box main">main</div>
  <div class="box leader">
    <div class="box leader-1">1</div>
    <div class="box leader-2">2</div>
    <div class="box leader-3">3</div>
    <div class="box leader-4">4</div>
  </div>
  <div class="box foot">foot</div>
</div>
21
demandé sur TylerH 2017-05-11 12:45:19

5 réponses

Selon la spécification, la transition devrait travailler sur grid-template-columns et grid-template-rows.

7.2. Dimensionnement explicite de la piste: le grid-template-rows et grid-template-columns propriétés

Animables: comme une simple liste de longueur, pourcentage, ou calc, à condition les seules différences sont les valeurs de la longueur, pourcentage, ou calc composants dans la liste

Donc, si mon interprétation est correcte, tant que les seules modifications sont aux valeurs des propriétés, sans changements à la structure de la règle, les transitions devraient fonctionner. mais ils ne le font pas .


Mise à JOUR

Cela fonctionne mais n'est jusqu'à présent implémenté que dans Firefox. Suivez ici pour d'autres mises à jour du navigateur. https://codepen.io/matuzo/post/animating-css-grid-layout-properties

~ une contribution dans les commentaires par @bcbrian


Voici un test I création:

grid-container {
  display: inline-grid;
  grid-template-columns: 100px 20vw 200px;
  grid-template-rows: repeat(2, 100px);
  background-color: black;
  height: 230px;
  transition: 2s;
  
  /* non-essential */
  grid-gap: 10px;
  padding: 10px;
  box-sizing: border-box;
}

grid-container:hover {
  grid-template-columns: 50px 10vw 100px;
  grid-template-rows: repeat(2, 50px);
  background-color: red;
  height: 130px;
  transition: 2s;
}

grid-item {
  background-color: lightgreen;
}
<grid-container>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
  <grid-item></grid-item>
</grid-container>

JsFiddle démo

Dans le test, la transition fonctionne sur la hauteur et la couleur de fond, mais pas sur grid-template-rows ou grid-template-columns.

17
répondu Michael_B 2017-12-12 12:02:50

Comme une solution de contournement, vous pouvez travailler avec la taille des éléments de la grille au lieu de grid-template-columns ou grid-template-rows.

Vous pourriez faire:

grid-container {
  display: inline-grid;
  grid-template-columns: 100px 20vw 200px;
  background-color: black;
  height: 230px;
  transition: 2s;
  
  /* non-essential */
  grid-gap: 10px;
  padding: 10px;
  box-sizing: border-box;
}

grid-container:hover {
  background-color: red;
  height: 130px;
}

grid-item {
  height: 100px;
  transition: height 2s;
  background-color: lightgreen;
}

grid-container:hover .first-row {
  height: 25px;
}

grid-container:hover .last-row {
  height: 75px;
}
<grid-container>
  <grid-item class='first-row'></grid-item>
  <grid-item class='first-row'></grid-item>
  <grid-item class='first-row'></grid-item>
  <grid-item class='last-row'></grid-item>
  <grid-item class='last-row'></grid-item>
  <grid-item class='last-row'></grid-item>
</grid-container>

Voici un autre exemple 2x2: https://codepen.io/erik127/pen/OvodQR

Et voici un exemple plus complet où vous pouvez ajouter plus de colonnes ou de lignes: https://codepen.io/erik127/pen/rdZbxL

, Malheureusement, il ya beaucoup de javascript, ce serait bien si grid-template-columns et grid-template-rows serait animables.

Un autre l'alternative qui pourrait fonctionner dans certains cas d'utilisation (si vos éléments de grille ne couvrent pas plusieurs lignes) est l'utilisation de flexbox avec une grille.

4
répondu Erik 2018-04-16 10:22:49

Une autre approche consiste à utiliser transform. Cela pourrait même être mieux parce que transform along w / opacity peut atteindre 60fps car il est accéléré par GPU au lieu de CPU accéléré (le navigateur doit faire moins de travail).

Voici un exemple: https://codepen.io/oneezy/pen/YabaoR

.sides {
  display: grid;
  grid-template-columns: 50vw 50vw;
}

.monkey { animation: 0.7s monkey cubic-bezier(.86,0,.07,1) 0.4s both; }
.robot { animation: 0.7s robot cubic-bezier(.86,0,.07,1) 0.4s both; }

@keyframes monkey {
  0% { transform: translate(-50vw); }
  100% { transform: 0; }
}

@keyframes robot {
  0% { transform: translate(50vw); }
  100% { transform: 0; }
}
0
répondu Oneezy 2018-04-13 11:40:25

Il existe un moyen de redimensionner les éléments de la grille lors de la transition en utilisant uniquement CSS, mais si vous voulez le redimensionner, vous devez utiliser %correctement, mais dans vos exemples, le problème existe à cause de la position collante. Vous devez ajouter de la hauteur sur votre élément .head, puis changer de hauteur après avoir ajouté la classe .tiny. Ici vous pouvez vérifier comment je l'ai corrigé (je suppose que c'est le résultat que vous vouliez avoir):

Violon

Michael réponse devez utiliser %s'dans votre exemple, car il a effet "blink" sur hover, si changé en valeurs de px sur %, il fonctionnera parfaitement sur le redimensionnement. Voici cet exemple changé sur % ' S:

Violon

0
répondu Michał Smoczyński 2018-05-26 13:18:07

Pour l'instant, la transition sur le modèle de grille ne fonctionne pas. Mais vous pouvez utiliser transform comme ceci:

JsFiddle

var button = document.querySelector("#btnToggle");
button.addEventListener("click",function(){
	var content = document.querySelector(".g-content");
  if(content.classList.contains("animate"))
    content.classList.remove("animate");
  else
	  content.classList.add("animate");
});
html,body{
  width:100%;
  height:100%;
  padding:0;
  margin:0;
}

.g-content{
  display:grid;
  height:100%;
  grid-template-columns: 200px 1fr;
  grid-template-rows:60px 1fr 30px;
  grid-template-areas: 
    "g-header g-header"
    "g-side g-main"
    "g-footer g-footer";
 overflow-x:hidden;
}

.g-header{
  grid-area:g-header;
  background:#2B4A6B;
  display:grid;
  grid-template-columns: max-content 1fr;
}

.g-header button{
  align-self:center;
  margin:0 5px;
}

.g-side{
  grid-area:g-side;
  background:#272B30;
  transition:all 0.5s;
}

.g-main{
  grid-area:g-main;
  background:#FFFFFA;
  transition:all 0.5s;
}

.g-footer{
  grid-area:g-footer;
  background:#7E827A
}

.animate .g-main{
  width:calc(100% + 200px);
  transform:translateX(-200px);
}

.animate .g-side{
  transform:translateX(-200px);
}  
<div class="g-content">
  <div class="g-header">
    <button id="btnToggle">
    Toggle
    </button>
  </div>
  <div class="g-side">
  </div>
  <div class="g-main">
  test
  </div>
  <div class="g-footer">
  </div>
</div>
0
répondu Emre HIZLI 2018-07-13 06:55:21