Использование CSS-переходов в макете CSS-сетки
Я пытаюсь получить мой липкий заголовок, чтобы иметь эффект перехода, поэтому он облегчает, а не просто щелчковое движение.
что я делаю не так?
вот моя рабочая версия:
http://codepen.io/juanmata/pen/RVMbmr
в основном следующий код добавляет класс tiny в мой класс-оболочку, это отлично работает.
$(window).on('load', function() {
$(window).on("scroll touchmove", function () {
$('.wrapper').toggleClass('tiny', $(document).scrollTop() > 0);
});
});
вот часть 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;
}
таким образом, заголовок сжимается, поскольку он должно быть, но нет анимации, я что-то пропустил или переходы просто не работают с сеткой?
вот ссылка на документы 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>
5 ответов
согласно спецификации, переходы должны работать на grid-template-columns
и grid-template-rows
.
7.2. Явный размер трека:
grid-template-rows
иgrid-template-columns
свойстваAnimatable: как простой список длины, процента или calc, при условии единственными различиями являются значения длины, процента или calc компоненты в списке
Итак, если моя интерпретация верна, пока единственные изменения - это значения свойств, без изменений структуры правила должны работать переходы. а не.
обновление
это работает, но до сих пор реализовано только в Firefox. Здесь для других обновлений браузера. https://codepen.io/matuzo/post/animating-css-grid-layout-properties
~ вклад в комментариях by @bcbrian
вот тест, который я создал:
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>
в тесте переход работает на высоту и цвет фона, но не на grid-template-rows
или grid-template-columns
.
в качестве обходного пути, вы можете работать с размером элементов сетки, а не с grid-template-columns
или grid-template-rows
.
вы могли бы сделать:
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>
вот еще один пример 2x2: https://codepen.io/erik127/pen/OvodQR
и вот более обширный пример, где вы можете добавить больше столбцов или строк:https://codepen.io/erik127/pen/rdZbxL
к сожалению, это много javascript, было бы неплохо, если grid-template-columns
и grid-template-rows
будет анимируются.
Другой альтернативой, которая может работать в некоторых случаях (если элементы сетки не охватывают несколько строк), является использование flexbox вместе с сеткой.
другой подход-использовать transform
. На самом деле это может быть даже лучше, потому что преобразование вдоль W/ opacity может достичь 60fps, потому что это ускоренный GPU вместо ускоренного процессора (браузер должен делать меньше работы).
вот пример: 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; }
}
есть способ изменить размер элементов сетки при переходе, используя только CSS, но если вы хотите изменить его размер, вы должны использовать %правильно, но в ваших примерах проблема существует из-за липкой позиции. Вы должны добавить высоту на .head
элемент, а затем изменить высоту после добавления .tiny
класса. Здесь вы можете проверить, как я это исправил ( я думаю, это результат, который вы хотели иметь ):
Michael answer должен использовать % ' s в вашем примере поскольку прямо сейчас он имеет эффект "мигания" при наведении, если он будет изменен на значения из px на%, он будет отлично работать при изменении размера. Вот этот пример изменен на %С:
на данный момент переход на шаблон сетки не работает. Но вы можете использовать transform следующим образом:
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>