#javascript #html #css
#javascript #HTML #css
Вопрос:
Я новичок в CSS. Я пытаюсь создать красивую сетку, которая изменяется в зависимости от пользовательского ввода. Вот мой подход к этому:
- Создайте «самую большую» сетку и установите все, что будет скрыто.
- Когда пользовательский ввод изменится, отобразите ячейки, которые требуется отобразить. Также соответствующим образом измените поля.
Я заметил, что когда я следую этой логике, мои ячейки каким-то образом перемещаются в определенном направлении. Это почти похоже на то, что скрытые ячейки все еще каким-то образом занимают место. Есть ли способ избежать этого?
Вот моя попытка:
'use strict'
let topBtn = document.querySelector("#top-btn");
let greyBar = document.querySelector("#grey-bar");
let topBtnClicked = false;
let gridSelectionBtns = document.querySelectorAll(".grid-selection-btn");
let mediaContainer = document.querySelector("#media-container");
let mediaCells = document.querySelectorAll(".media-cell");
function onTopBtnMouseEvent(ev) {
if (ev.type === "click") {
topBtn.style.opacity = "0.7";
greyBar.style.opacity = "0.7";
topBtnClicked = true;
} else if (ev.type === "mouseover") {
topBtn.style.opacity = "0.7";
} else if (ev.type === "mouseout") {
if (!topBtnClicked) {
topBtn.style.opacity = "0";
}
}
}
function onTopBarMouseEvent(ev) {
if (ev.type === "mouseover") {
} else if (ev.type === "mouseout") {
if (topBtnClicked amp;amp; !(greyBar.contains(ev.relatedTarget) || (ev.relatedTarget === topBtn))) {
topBtnClicked = false;
topBtn.style.opacity = "0";
greyBar.style.opacity = "0";
}
}
}
function enableMediaCell(cellNumber, isEnable) {
let cell = mediaCells[cellNumber];
if (isEnable) {
cell.style.visibility = "visible";
cell.style.margin = "25px";
cell.style.gridGap = "10px";
} else {
cell.style.visibility = "hidden";
cell.style.margin = "0";
cell.style.gridGap = "0";
}
}
function gridSelectedHandler(type) {
if (!topBtnClicked) {
return;
}
switch (type) {
case 0:
mediaContainer.style.opacity = "1";
enableMediaCell(0, true);
for (let i = 1; i < mediaCells.length; i) {
enableMediaCell(i, false);
}
mediaContainer.style.gridTemplateColumns = "repeat(1, 1fr)";
mediaContainer.style.gridTemplateRows = "repeat(1, 1fr)";
break;
case 1:
mediaContainer.style.opacity = "1";
enableMediaCell(0, true);
enableMediaCell(1, true);
for (let i = 2; i < mediaCells.length; i) {
enableMediaCell(i, false);
}
mediaContainer.style.gridTemplateColumns = "repeat(2, 1fr)";
mediaContainer.style.gridTemplateRows = "repeat(1, 1fr)";
break;
case 2:
mediaContainer.style.opacity = "1";
for (let i = 0; i < 4; i) {
enableMediaCell(i, true);
}
for (let i = 4; i < mediaCells.length; i) {
enableMediaCell(i, false);
}
mediaContainer.style.gridTemplateColumns = "repeat(2, 1fr)";
mediaContainer.style.gridTemplateRows = "repeat(2, 1fr)";
break;
case 3:
mediaContainer.style.opacity = "1";
for (let i = 0; i < 6; i) {
enableMediaCell(i, true);
}
for (let i = 6; i < mediaCells.length; i) {
enableMediaCell(i, false);
}
mediaContainer.style.gridTemplateColumns = "repeat(3, 1fr)";
mediaContainer.style.gridTemplateRows = "repeat(2, 1fr)";
break;
case 4:
mediaContainer.style.opacity = "1";
for (let i = 0; i < mediaCells.length; i) {
enableMediaCell(i, true);
}
mediaContainer.style.gridTemplateColumns = "repeat(3, 1fr)";
mediaContainer.style.gridTemplateRows = "repeat(3, 1fr)";
break;
default:
break;
}
}
for (let i = 0; i < gridSelectionBtns.length; i) {
gridSelectionBtns[i].addEventListener("click", function() {
gridSelectedHandler(i)
})
}
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
mediaContainer.style.opacity = "0"
}
});
topBtn.onmouseover = topBtn.onmouseout = topBtn.onclick = onTopBtnMouseEvent;
greyBar.onmouseover = greyBar.onmouseout = greyBar.onclick = onTopBarMouseEvent;
body {
background-image: url("../media/gopher_background.jpg");
background-size: cover;
}
#top-btn {
width: 100%;
height: 25px;
opacity: 0;
background-image: url("../media/down-arrow.svg");
background-repeat: no-repeat;
background-position: center;
}
#grey-bar {
background-color: GhostWhite;
width: 100%;
height: 50px;
opacity: 0;
display: flex;
justify-content: center;
}
.grid-selection-btn {
width: 5%;
height: 100%;
margin: 0 1%;
}
#media-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
opacity: 0;
min-height: 85vh;
background-color: lightgray;
}
.media-cell {
background-color: lightgray;
visibility: hidden;
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 1fr);
grid-gap: 10px;
margin: 25px;
}
.youtube-btn {
/*background-image: url("../media/youtube-logo.png");*/
background-repeat: no-repeat;
background-position: center;
background-size: contain;
margin: 0 0 0 0;
padding: 0 0 0 0;
}
.reddit-btn {
/*background-image: url("../media/reddit-icon.png");*/
background-repeat: no-repeat;
background-position: center;
background-size: contain;
margin: 0 0 0 0;
padding: 0 0 0 0;
}
.twitter-btn {
/*background-image: url("../media/twitter.png");*/
background-repeat: no-repeat;
background-position: center;
background-size: contain;
margin: 0 0 0 0;
padding: 0 0 0 0;
}
.insta-btn {
/*background-image: url("../media/insta-logo.png");*/
background-repeat: no-repeat;
background-position: center;
background-size: contain;
margin: 0 0 0 0;
padding: 0 0 0 0;
}
<button id="top-btn"></button>
<div id="grey-bar">
<button class="grid-selection-btn">1</button>
<button class="grid-selection-btn">2</button>
<button class="grid-selection-btn">3</button>
<button class="grid-selection-btn">4</button>
<button class="grid-selection-btn">5</button>
</div>
<div id="media-container">
<div class="media-cell">
<button class="youtube-btn"></button>
<button class="reddit-btn"></button>
<button class="insta-btn"></button>
<button class="twitter-btn"></button>
</div>
<div class="media-cell">
<button class="youtube-btn"></button>
<button class="reddit-btn"></button>
<button class="insta-btn"></button>
<button class="twitter-btn"></button>
</div>
<div class="media-cell">
<button class="youtube-btn"></button>
<button class="reddit-btn"></button>
<button class="insta-btn"></button>
<button class="twitter-btn"></button>
</div>
<div class="media-cell">
<button class="youtube-btn"></button>
<button class="reddit-btn"></button>
<button class="insta-btn"></button>
<button class="twitter-btn"></button>
</div>
<div class="media-cell">
<button class="youtube-btn"></button>
<button class="reddit-btn"></button>
<button class="insta-btn"></button>
<button class="twitter-btn"></button>
</div>
<div class="media-cell">
<button class="youtube-btn"></button>
<button class="reddit-btn"></button>
<button class="insta-btn"></button>
<button class="twitter-btn"></button>
</div>
<div class="media-cell">
<button class="youtube-btn"></button>
<button class="reddit-btn"></button>
<button class="insta-btn"></button>
<button class="twitter-btn"></button>
</div>
<div class="media-cell">
<button class="youtube-btn"></button>
<button class="reddit-btn"></button>
<button class="insta-btn"></button>
<button class="twitter-btn"></button>
</div>
<div class="media-cell">
<button class="youtube-btn"></button>
<button class="reddit-btn"></button>
<button class="insta-btn"></button>
<button class="twitter-btn"></button>
</div>
</div>
Я изучаю веб-разработку уже около 2 недель. Я понимаю, что мой код может быть не лучшей практикой. Я бы тоже хотел получить некоторые отзывы по этому поводу.
Комментарии:
1. вы хотите, чтобы ширина сетки менялась в зависимости от количества ячеек?
Ответ №1:
Вы правильно заметили, скрытые элементы все еще занимают место. Это относится к visibility: hidden
… чтобы элемент не был видимым или вообще не занимал места на странице, вы хотите display: none
. Значение по умолчанию для атрибута отображения div равно block
, поэтому вы можете использовать это, чтобы сделать ячейку видимой в скрипте.