고도가 다른 내용을'좋은 느낌'으로 동적으로 보여주고 싶어요!창고가 없어요!
Masonry , magic grid , etc....여러분 이 라이브러리 아세요?
이것은 격자 레이아웃을 실현하는 데 사용되는 라이브러리입니다.
일반적으로 CSS의 flexbox와grid를 사용하면 격자 레이아웃을 할 수 있지만, 이 라이브러리들은 높이가 다른 내용을 잘 표시할 수 있다.
예를 들어 Magic Grid는 다음과 같은 유연한 격자 레이아웃을 실현할 수 있다.(이하 Gif는 Magic Grid의 Github 자술을 참조)
Flexbox로 격자 레이아웃을 만들면 높이가 고정되기 때문에 이상한 공백이 생길 수 있습니다. 그럼에도 불구하고 Grid를 사용할 때 높이와 설정을 미리 결정해야 하기 때문에 동적으로 표시해야 한다...그래서 이런 라이브러리를 사용했다. 그러나 이 라이브러리들도 유지보수가 없는 것이 아니라 TypeScript의 type이 없는 것이 아니다. 실현을 보면 left, top,transform에 좌표를 지정하고 즐겁게 사용하고 싶은 라이브러리(개인적인 소감)이다. 그래서 이번에는 라이브러리가 없어서 가능한 한 CSS로만 재현하고 싶어서 투고했습니다. 실제로는 CSS만 할 수 없다. 더 간단하게 할 수 있으면 알려주세요. 최종 품목 See the Pen Card Grid Layout without Library by sa2taka ( @sa2taka )
on CodePen .
설명
위의 동작은 CSS의 Grid를 이용하여 거의 간신히 이루어진다p>
css
css는 별거 아니기 때문에 자세한 설명이 필요 없을 수도 있습니다(js도 그렇습니다)
#grid
우선, 상술한 html에서
<div id="grid">
</div>
의 부분.이grid는 다음 스타일에 적용됩니다p>
#grid {
display: grid;
grid-auto-rows: 20px;
grid-template-columns: repeat(auto-fit, minmax(80px, 1fr));
}
display: grid
의 설명은 좋다grid-template-columns: repeat(auto-fit, minmax(200px, 1fr))
, 자세한 사항은 MDNgrid-template-columns,repeat에 의뢰한 결과 창의 가로폭에 따라 열 수를'좋은 느낌'에 맞는 녀석으로 만들었다.이것 덕분에 상당히 유연한 동작을 할 수 있다p>
이번에 중요한 것은 grid-auto-rows
이다.기준 MDN
grid-auto-rows와grid-auto-columns 속성은 은식 격자에 생성된 궤적 집합의 크기를 정의할 수 있습니다
.명확하고 은밀하게 표현되었지만 동적 내용의 크기에 대해서는 이번에rows이기 때문에 세로 크기를 정의하는 의미로 생각된다p>
보충 정도,grid-template-rows
도 가능합니다.좀 다르지만 별로 안 달라 보여요.그렇게 지도 모른다, 아마, 아마...p>
.item
다음은 item반, 이것은
.item {
min-width: 80px;
margin-left: 8px;
margin-top: 8px;
box-sizing: border-box;
background: green;
color: white;
}
별거 아니니까 설명 안 할게요.p>
참고로
box-sizing: border-box;
를 지정하지 않으면 예상대로 표시되지 않습니다.대개p>JavaScript
다음은 JavaScript의 전체 코드이지만 필요한 것은 addItem
p>
let index = 1;
const addItem = () => {
const height = randomNum();
const grid = document.querySelector('#grid');
const item = document.createElement('div');
item.setAttribute('class', 'item');
item.setAttribute('style', `height: ${height}px;grid-row: span ${Math.ceil(height / 20)};`);
item.innerHTML = index;
index += 1;
grid.appendChild(item);
}
const randomNum = () => {
const min = 40;
const max = 200;
return Math.floor(Math.random() * (max - min + 1) + min)
}
window.addEventListener('load', () => {
for (let i = 0; i < 10; i++) {
addItem();
}
document.querySelector('#addItemButton').addEventListener('click', () => {
addItem();
})
})
addItem
다음은 addItem 섹션만 게재
const addItem = () => {
const height = randomNum();
const grid = document.querySelector('#grid');
const item = document.createElement('div');
item.setAttribute('class', 'item');
item.setAttribute('style', `height: ${height}px;grid-row: span ${Math.ceil(height / 20)};`);
item.innerHTML = index;
index += 1;
grid.appendChild(item);
}
단순히
#grid
에 div.item
코드를 추가하는 것뿐, 중요한 것은 여기에 있다p>item.setAttribute('style', `height: ${height}px;grid-row: span ${Math.ceil(height / 20)};`);
style
요소에 높이와 grid-row
를 기록합니다.Height 됐어, grid-row
뭐지?p>
MDN은grid 프로젝트의 실제 높이를 결정하는 프로젝트입니다.grid-row
실제로는 절대적으로 숫자를 입력해야 하지만, 입력span
을 통해 자동으로 위치를 정하여 지정된 값의 높이를 메울 수 있다p>
예컨대 grid-row: 3
시,row는 3부터,grid-row: span 3
시,grid의 높이는 3으로 자동 진입한다.참고로 이 높이의 단위는 방금 지정한 grid-auto-rows
값입니다. span 3
이면 Grid가 채워져 60px에 달합니다.p>
즉, 여기grid-row: span 高さ / grid-auto-rowsで指定した値
를'좋은 느낌'으로 지정하면 설정도 CSS의grid의 힘을 빌려'감각이 좋다'는 것이다p>
언어만으로는 이해하기 어려울 수 있지만 크롬의 개발자 도구인 Elements에서 확인하면 의외로 이해하기 쉽다.
CSSgrid-auto-rows
에서 20px마다 선을 그립니다.그게 보라색 실이잖아.그리고 grid-row
를 통해 높이를 결정하고grid의 강도를 활용하는 동시에 높이도 "잘"표시할 수 있다p>
단, 유감스럽게도 창 폭을 이동할 때 Magic-Grid처럼 열을 이동하는 애니메이션이 없습니다.용서해 주십시오p>
마지막
이번 설명에서 MDN을 이용하여 간단하게 설명하지만 저도 Grid 초보자 같은 존재로 해석 오류가 있을 수 있습니다. 실제로 Grid를 이동하면 자바스크립트도 사용하지 않아도 될 수 있습니다.<가장 좋은 것은 매직-grid를 사용하는 것이다
빠른 걸음으로 해설한 것이기 때문에 난문이다.br/>
'이런 방법이 있구나''이 라이브러리가 편하구나'등이 있으면 부탁해요.p>
Reference
이 문제에 관하여(고도가 다른 내용을'좋은 느낌'으로 동적으로 보여주고 싶어요!창고가 없어요!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sa2taka/items/24aa15fd54b1d5b389ce텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)