Я использую макет сетки, чтобы показать несколько строк. Каждая строка содержит 3 столбца (изображение, метка и изображение svg), и я хочу (на основе некоторой логики, которая здесь не актуальна) скрыть/показать целые строки.
После множества проб и ошибок и чтения множества различных сообщений в блогах я адаптировал следующий подход, который довольно близок к тому, чего я хочу достичь.
Однако есть 2 незначительные вещи, которые меня беспокоят.
<img>, ни <svg> не полностью центрированы. .grid-row4px выше необходимого (его высота равна 104px, тогда как и <img>, и <svg> высокие 100px). Почему? Как избавиться от 4px? Комментарий от @Paulie_D решил эту проблемуfunction toggleRow() {
const i = d3.select('#row').property('value');
const row = d3.select('.grid-row:nth-child(' + i +')');
row.classed('visible', !row.classed('visible'));
}:root {
--transitionLength: 0.4s;
--transitionTiming: ease;
}
.grid {
display: inline-grid;
grid-template-columns: 110px minmax(200px, max-content) 1fr;
row-gap: 5px;
}
.grid-row {
display: grid;
grid-template-columns: subgrid;
grid-template-rows: 0fr;
grid-column: 1 / 4;
align-items: center;
column-gap: 10px;
overflow: hidden;
background-color: lightgray;
transition: grid-template-rows var(--transitionLength) var(--transitionTiming);
}
.grid > .visible {
grid-template-rows: 1fr;
}
.grid-item {
min-height: 0;
transform: translateY(-100%);
visibility: hidden;
transition: transform var(--transitionLength) var(--transitionTiming),
visibility 0s var(--transitionLength) var(--transitionTiming);
}
.grid > .visible > .grid-item {
transform: translateY(0);
visibility: visible;
transition: transform var(--transitionLength) var(--transitionTiming),
visibility 0s linear;
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.min.js"></script>
<div class = "grid">
<div class = "grid-row visible">
<div class = "grid-item img"><img src = "https://picsum.photos/100" alt = "Placeholder Image"/></div>
<div class = "grid-item label">
<h2>Can be a long Line with several words...</h2>
</div>
<div class = "grid-item svg">
<svg xmlns = "http://www.w3.org/2000/svg" width = "163.63" height = "100" viewBox = "0 0 18 11">
<rect width = "18" height = "11" fill = "#fff" />
<path d = "M0,5.5h18M6.5,0v11" stroke = "#002F6C" stroke-width = "3" />
</svg>
</div>
</div>
<div class = "grid-row">
<div class = "grid-item img"><img src = "https://picsum.photos/100" alt = "Placeholder Image" /></div>
<div class = "grid-item label">
<h2>...or very short</h2>
</div>
<div class = "grid-item svg">
<svg xmlns = "http://www.w3.org/2000/svg" width = "163.63" height = "100" viewBox = "0 0 18 11">
<rect width = "18" height = "11" fill = "#fff" />
<path d = "M0,5.5h18M6.5,0v11" stroke = "#002F6C" stroke-width = "3" />
</svg>
</div>
</div>
</div>
<br>
<input type = "number" id = "row" name = "number" min = "1" max = "3" value = "1" />
<button onclick = "toggleRow()">Toggle Row</button>Ах, спасибо, проблемы 1 больше нет, спасибо!






Мне кажется, я немного усложнил ситуацию. Простой переход (без преобразования) на grid-template-rows должен помочь.
Н.Б. Мне нужно было удалить правило align-items, чтобы скрытый контент все равно не выступал наружу (по какой-либо причине).
function toggleRow() {
const i = d3.select('#row').property('value');
const row = d3.select('.grid-row:nth-child(' + i +')');
row.classed('visible', !row.classed('visible'));
}:root {
--transitionLength: 250ms;
--transitionTiming: ease-out;
}
.grid {
display: inline-grid;
grid-template-columns: 110px minmax(200px, max-content) 1fr;
row-gap: 5px;
}
.grid-row {
display: grid;
grid-column: 1/4;
grid-template-columns: subgrid;
background-color: lightgray;
grid-template-rows: 0fr;
transition: grid-template-rows var(--transitionLength) var(--transitionTiming);
/*align-items: center;*/
column-gap: 10px;
}
.grid > .visible {
grid-template-rows: 1fr;
}
.grid-row > .grid-item {
overflow: hidden;
min-height: 0;
}
.grid-item > img, .grid-item > svg {
vertical-align: middle;
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.min.js"></script>
<div class = "grid">
<div class = "grid-row visible">
<div class = "grid-item img"><img src = "https://picsum.photos/100" alt = "Placeholder Image" /></div>
<div class = "grid-item label">
<h2>Can be a long Line with several words...</h2>
</div>
<div class = "grid-item svg">
<svg xmlns = "http://www.w3.org/2000/svg" width = "163.63" height = "100" viewBox = "0 0 18 11">
<rect width = "18" height = "11" fill = "#fff" />
<path d = "M0,5.5h18M6.5,0v11" stroke = "#002F6C" stroke-width = "3" />
</svg>
</div>
</div>
<div class = "grid-row">
<div class = "grid-item img"><img src = "https://picsum.photos/100" alt = "Placeholder Image" /></div>
<div class = "grid-item label">
<h2>...or very short</h2>
</div>
<div class = "grid-item svg">
<svg xmlns = "http://www.w3.org/2000/svg" width = "163.63" height = "100" viewBox = "0 0 18 11">
<rect width = "18" height = "11" fill = "#fff" />
<path d = "M0,5.5h18M6.5,0v11" stroke = "#002F6C" stroke-width = "3" />
</svg>
</div>
</div>
</div>
<br>
<div>
<input type = "number" id = "row" name = "number" min = "1" max = "3" value = "1" />
<button onclick = "toggleRow()">Toggle Row</button>
</div>
Для пункта 1 — stackoverflow.com/questions/5804256/…