- 이번 메인 프로젝트에선 내가 반응형을 구현한건 거의 없고, 같은 팀원인 은정님과 영재님이 대부분 하셨다. 특히 모달을 맡으신 은정님이 반응형에 거의 몇일을 고생하셨는데, 모달 안에 생각보다 많은기능을 넣어야 했고, 그 와중에 깔끔한 UI,UX를 구현하기 위해 팀원들과 많이 상의를 하셨다.
=> 이번 프로젝트가 끝나고, 반응형을 좀더 공부하고 연습해야 겠다.- 특히 팀원중엔 내가 제일 css가 부족했고, 팀원들께 여태껏 했던 그 어느 스터디나 수업들 중에서 css를 제일 많이 배운것 같다.
- 그 와중에 내가 margin과 padding를 잘 구분하지 못하고, 그냥 화면에 띄우면 된다는 안일한 생각으로 화면을 구현했다가 나중에 싹 고치느라 정말 힘들었다...
=> 요소의 자체적인 크기는 padding, 요소와 요소 사이의 간격은 margin이라는 것을 잊지 말자!!!!!- 이번 프로젝트로 화면구현에 제일 신경쓴건 margin과 padding, px이 아닌 rem으로 구현한 것이다.
<head>
태그 안에<link>
태그를 위치, 다른 css 파일을 적용할 때와 다른 점은 미디어 속성을 사용하여 조건을 지정한다. 미디어 속성 내 해당 조건을 만족할 때만 해당 css 파일을 불러오게 된다.<link href="css파일이름.css" media="screen and (min-width: 400px) and (max-width: 1000px)" rel="stylesheet">
<head>
태그 안에서 <style>
태그를 열어 미디어 쿼리를 작성,<style type="text/css" media="screen and (min-width: 400px) and (max-width: 1000px)">
/* 여기 css를 작성. */
</style>
@media 미디어 타입 (조건(너비 및 높이)) {
(CSS 입력하는 부분)
}
--예제
@media screen (max-width: 400px) {
body {
color: red;
}
@media (orientation: landscape) {
body {
color: rebeccapurple;
}
}
/*HTML 본문 텍스트가 파란색이 되는 유일한 경우는 뷰포트의 너비가 최소 400픽셀 이상이고 장치가 가로 모드인 경우에만 해당*/
@media screen and (min-width: 400px) and (orientation: landscape) {
body {
color: blue;
}
}
/*뷰포트의 넓이가 600px 이상이거나, 장치가 가로 방향인 경우 텍스트는 파란색이 된다. 이 중 하나라도 조건을 만족한다면 쿼리안의 CSS 스타일이 적용*/
@media screen and (min-width: 600px), screen and (orientation: landscape) {
body {
color: blue;
}
}
/* 방향이 세로인 경우에만 텍스트가 파란색으로 적용*/
@media not all and (orientation: landscape) {
body {
color: blue;
}
}
@media (max-width: 768px)
로 결정const ContainerFillter = styled.nav`
display: flex;
justify-content: center;
align-items: center;
padding: 6px 10px 4px 10px;
border-radius: 8px;
background-color: var(--white);
box-shadow: var(--bs-lg);
transition: 0.2s;
.partition {
width: 1.2px;
height: 48px;
margin: 0 10px;
background-color: var(--black-100);
}
@media (max-width: 768px) {
flex-direction: column;
padding: 10px 6px 10px 6px;
transition: 0.2s;
.partition {
width: 50px;
height: 1.2px;
margin: 10px 0 6px 0;
background-color: var(--black-100);
}
}
`;
z-index
를 사용하여 위치를 조절하였다.// < 모달 넓이가 768px이상일때 >
//전체 컨테이너
const InfoContainer = styled.aside`
position: relative;
display: flex;
flex-direction: column;
justify-content: center;
width: 450px;
padding-right: 20px;
border-right: 1px solid var(--black-100);
@media (max-width: 768px) {
height: auto;
margin-bottom: 30px;
padding: 0px;
border-right: none;
border-bottom: 1px solid var(--black-100);
}
`;
// 약국이름, 별점, 리뷰갯수 부분 => 768px이하일땐 안보이게 구현
const InfoHeader = styled.header`
position: relative;
display: flex;
flex-direction: column;
justify-content: center;
padding: 10px;
gap: 10px;
border-bottom: 1px solid var(--black-100);
@media (max-width: 768px) {
display: none;
}
`;
// < 모달 넓이가 768px이하일때 >
//모달 전체 컨테이너 => flex-direction: column으로
// z-index는 컴포넌트로 전역으로 관리
const ModalContainer = styled.section`
position: relative;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
top: 30px;
height: 600px;
width: 940px;
background-color: var(--white);
border-radius: 10px;
@media (max-width: 768px) {
display: flex;
flex-direction: column;
justify-content: center;
padding-bottom: 20px;
height: 700px;
width: 500px;
background-color: var(--white);
border-radius: 10px;
}
z-index: ${zIndex_Modal.ModalContainer};
`;
// 약국이름, 별점, 리뷰갯수 부분=>768px이상일땐 안보이게 구현
const InfoHeader = styled.header`
display: none;
@media (max-width: 768px) {
display: flex;
flex-direction: column;
justify-content: flex-start;
padding: 0px 10px 7px 10px;
gap: 10px;
width: 450px;
background-color: var(--white);
border-bottom: 1px solid var(--black-100);
}
`;
//스크롤 구현
const Constant = styled.section`
display: flex;
flex-direction: row;
justify-content: center;
::-webkit-scrollbar-track {
background-color: var(--black-075);
border-radius: 0px 5px 5px 0px;
}
@media (max-width: 768px) {
display: block;
overflow-y: scroll;
}
`;
::-webkit-scrollbar-track{
visibility: hidden;
}
:active::-webkit-scrollbar-track{
width: 0.6rem;
visibility: visible;
}