

CSS에서는 margin, border, padding, 그리고 gap 속성을 이용해 페이지의 요소들이 어떻게 배치되고 표시되는지를 정의한다. 이들은 페이지 내 요소들 간의 공간과 관련된 속성이다.
이 속성들을 이해하고 사용하면 웹 페이지의 레이아웃을 더욱 정교하게 조절할 수 있다.
<main>
<div class="place-list-item">
<div class="place-image-wrapper">
<img src="https://picsum.photos/1000/1000" alt="place image">
</div>
</div>
</main>
.place-image-wrapper {
width: 300px;
height: 293px;
overflow: hidden;
} /*<div>요소의 너비와 높이를 설정. 이 크기를 넘으면 보이지 않게 된다.*/
.place-image-wrapper img {
width: 500px;
height: 500px;
} /*이미지의 크기를 조절해준다. 그러나 위의 width: 300px;, height: 293px;을 넘어가면 보이지 않는다.*/


place-image-wrapper에 들어간 이미지 원본 사이즈는 1000x1000이지만, '.place-image-wrapper img'를 통해 500x500으로 조절이 되었다. 하지만 '.place-image-wrapper'의 크기인 300x293을 넘음으로서, 이미지가 잘려 나온다.
이제, 이미지를 둥글게 깎는 'border-radius'를 주고, 좋아요를 누를 수 있는 하트 표시를 만들어보자.
<main>
<div class="place-list-item">
<div class="place-image-wrapper">
<img src="https://picsum.photos/1000/1000" alt="place image">
<img class="heart-icon" src="./imgs/heart.png" alt="'heart icon">
</div>
</div>
</main>
.place-image-wrapper {
position: relative;
width: 300px;
height: 293px;
border-radius: 23px;
overflow: hidden;
} /*<div>요소의 너비와 높이를 설정. 이 크기를 넘으면 보이지 않게 된다.*/
.place-image-wrapper img {
width: 500px;
height: 500px;
} /*이미지의 크기를 조절해준다*/
.place-image-wrapper .heart-icon {
position: absolute;
top: 16px;
left: 16px;
width: 24px;
height: 24px;
}
.place-image-wrapper .heart-icon 으로 지정한 이유는, .heart-icon으로만 지정하여
.heart-icon {
position: absolute;
top: 16px;
left: 16px;
width: 24px;
height: 24px;
cursor: pointer;
}/*위치가, 부모의 상대위치를 사용한다.*/
이렇게 사용할 경우, 보다 상위 선택자인
.place-image-wrapper img {
width: 500px;
height: 500px;
} /*이미지의 크기를 조절해준다*/
코드가 적용되기 때문에, width와 height가 24px이 적용되는 것이 아니라 500px이 된다.
따라서 .place-image-wrapper .heart-icon 으로 지정해 줘야 24px이 되는 것이다.

<main>
<div class="place-list-item">
<div class="place-image-wrapper">
<img src="https://picsum.photos/1000/1000" alt="place image">
<img class="heart-icon" src="./imgs/heart.png" alt="'heart icon">
</div>
<div class="description-section">
<div class="description-section_title">addddd</div>
<div class="description-section_">bddddd</div>
<div class="description-section_">cddddd</div>
</div>
</div>
</main>
.description-section {
margin-top: 13px;
display: flex;
flex-direction: column; /*세로 방향 flex*/
font-size: 15px;
color: rgb(34, 34, 34);
gap: 3px; /*flex의 간격을 3px로 둔다.*/
}
.description-section_title {
font-weight: 600;
}

위 그림을 보면, 글자 사이의 간격이 3px로 떨어진 것을 볼 수 있다. 또한, image와 description-section_title 사이의 간격이 13px 떨어져 있는 것을 볼 수 있다.
<main>
<div id="place-items-wrapper">
<div class="place-list-item">
<div class="place-image-wrapper">
<img src="https://picsum.photos/1000/1000" alt="place image">
<img class="heart-icon" src="./imgs/heart.png" alt="'heart icon">
</div>
<div class="description-section">
<div class="description-section_title">addddd</div>
<div class="description-section_">bddddd</div>
<div class="description-section_">cddddd</div>
</div>
</div>
<div class="place-list-item">
<div class="place-image-wrapper">
<img src="https://picsum.photos/1000/1000" alt="place image">
<img class="heart-icon" src="./imgs/heart.png" alt="'heart icon">
</div>
<div class="description-section">
<div class="description-section_title">addddd</div>
<div class="description-section_">bddddd</div>
<div class="description-section_">cddddd</div>
</div>
</div>
<div class="place-list-item">
<div class="place-image-wrapper">
<img src="https://picsum.photos/1000/1000" alt="place image">
<img class="heart-icon" src="./imgs/heart.png" alt="'heart icon">
</div>
<div class="description-section">
<div class="description-section_title">addddd</div>
<div class="description-section_">bddddd</div>
<div class="description-section_">cddddd</div>
</div>
</div>
<div class="place-list-item">
<div class="place-image-wrapper">
<img src="https://picsum.photos/1000/1000" alt="place image">
<img class="heart-icon" src="./imgs/heart.png" alt="'heart icon">
</div>
<div class="description-section">
<div class="description-section_title">addddd</div>
<div class="description-section_">bddddd</div>
<div class="description-section_">cddddd</div>
</div>
</div>
<div class="place-list-item">
<div class="place-image-wrapper">
<img src="https://picsum.photos/1000/1000" alt="place image">
<img class="heart-icon" src="./imgs/heart.png" alt="'heart icon">
</div>
<div class="description-section">
<div class="description-section_title">addddd</div>
<div class="description-section_">bddddd</div>
<div class="description-section_">cddddd</div>
</div>
</div>
</div>
</main>
main {
display: flex;
justify-content: center;
padding: 24px 80px;
}
#place-items-wrapper {
display: grid;
grid-template-columns: repeat(4, 308px);
justify-items: center;
align-items: center;
box-sizing: border-box;
gap: 40px 24px;
}
.heart-icon:active {
transform: scale(0.5); /*하트 클릭시 0.5배로 작아짐*/
transition: transform 0.25s ease;
}
main 선택자에 대한 스타일:
#place-items-wrapper 선택자에 대한 스타일:
.heart-icon 클래스를 가진 요소에 :active 상태가 적용될 때(즉, 사용자가 해당 요소를 클릭하는 동안) 특정 스타일을 적용하는 것을 정의하고 있다.
.heart-icon 요소의 크기를 기존 크기의 50%로 축소시킨다. 즉, 요소가 클릭될 때 0.5배로 작아진다.
transition: transform 0.25s ease;: transform 속성의 변화를 0.25초 동안 부드럽게 전환하도록 지정한다. ease는 속도 곡선을 의미하며, 애니메이션은 천천히 시작되어, 그다음에는 빠르게 진행되고, 마지막에는 다시 천천히 끝난다.
따라서, 사용자가 .heart-icon 요소를 클릭하는 동안 요소는 원래 크기의 절반으로 빠르게 축소되었다가 다시 천천히 원래 크기로 돌아온다. 이 때 모든 변화는 0.25초 동안 일어난다.
