I am trying to get my sticky header to have a transition effect so it eases in rather than just a snap movement.
What am I doing wrong?
Here's my a working version:
http://codepen.io/juanmata/pen/RVMbmr
Basically the following code adds the class tiny to my wrapper class, this works fine.
$(window).on('load', function() { $(window).on("scroll touchmove", function () { $('.wrapper').toggleClass('tiny', $(document).scrollTop() > 0); }); });
Here's the CSS part:
.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; }
So the header does shrink as it should but there is no animation, have I missed something or does transitions simply not work with grid?
Here's a link to the css-grid docs.
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>
Animate with transitionsUsing transitions is one way to animate your grid rows and columns. If your design adjusts the grid structure to cater to different viewports, as long as the number of rows and columns remain the same throughout, you'll see the rows and columns animate to their new sizes.
Building a Responsive Grid-View First ensure that all HTML elements have the box-sizing property set to border-box . This makes sure that the padding and border are included in the total width and height of the elements. Read more about the box-sizing property in our CSS Box Sizing chapter.
According to the spec, transitions should work on grid-template-columns
and grid-template-rows
.
7.2. Explicit Track Sizing: the
grid-template-rows
andgrid-template-columns
propertiesAnimatable: as a simple list of length, percentage, or calc, provided the only differences are the values of the length, percentage, or calc components in the list
So, if my interpretation is correct, as long as the only changes are to the values of the properties, with no changes to the structure of the rule, transitions should work. But they don't.
UPDATE
This does work but is so far only implemented in Firefox. Follow here for other browser updates. https://codepen.io/matuzo/post/animating-css-grid-layout-properties
~ a contribution in the comments by @bcbrian
Here's a test I created:
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 demo
In the test, the transition works on the height and background color, but not on grid-template-rows
or grid-template-columns
.
As a workaround, you can work with the size of the grid items instead with grid-template-columns
or grid-template-rows
.
You could do:
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>
Here's another 2x2 example: https://codepen.io/erik127/pen/OvodQR
and here a more extensive example where you can add more columns or rows: https://codepen.io/erik127/pen/rdZbxL
Unfortunately it's a lot of javascript, it would be nice if grid-template-columns
and grid-template-rows
would be animatable.
Another alternative which might work in some usecases (if your grid items don't span multiple rows) is the use of flexbox together with a grid.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With