
23.05.26 학습일기
CSS 포지션 속성 완벽하게 이해하기(3편)
✅ CSS 포지션(3)
부모 요소 밖에서 원하는 위치로 보내기!
부모 요소의 크기만큼 위치 100%로 설정하여 부모 요소 바로 옆에 딱 붙을 수 있도록!
html구성
<body>
<div class="parent">
<div class="child1">1</div>
<div class="child2">2</div>
<div class="child3">3</div>
</div>
</body>
css구성
/* 부모요소 position:relative */
/* 자식요소 position:absolute */
.parent{
position:relative;
border:3px solid #000;
width:600px; /* 부모요소 크기지정 */
height:300px;/* 부모요소 크기지정 */
}
.child1{
position:absolute;
background-color: rgba(122, 122, 160, 0.476);
width:150px; /* 자식요소 크기지정 */
height:100px; /* 자식요소 크기지정 */
/* default -> top:0; left:0; */
top:100%;
/* text 가운데 정렬 */
text-align: center;
line-height: 100px;
vertical-align: middle;
}
.child2{
position:absolute;
background-color: rgba(122, 122, 160, 0.476);
width:150px; /* 자식요소 크기지정 */
height:100px; /* 자식요소 크기지정 */
/* default -> top:0; left:0; */
left:100%;
/* text 가운데 정렬 */
text-align: center;
line-height: 100px;
vertical-align: middle;
}
.child3{
position:absolute;
background-color: rgba(122, 122, 160, 0.476);
width:150px; /* 자식요소 크기지정 */
height:100px; /* 자식요소 크기지정 */
/* default -> top:0; left:0; */
left:100%;
top:100%;
/* text 가운데 정렬 */
text-align: center;
line-height: 100px;
vertical-align: middle;
}
핵심은 position지정
자식요소에 left :100%를 하면 부모요소를 넘어가 바로 옆에 위치
CSS 필수 가상클래스
✅ 마우스 오버 효과(hover, transition)
마우스가 올라가면 링크를 볼 수 있도록 제작
a태그는 바디태그의 칼라를 따르지 않음⭐
text-decoration이 underline로 기본적으로 되어있음
transtion속성은 :hover가 아닌곳에 넣어줘야 마우스 오버와 마우스 빠질 때 모두 적용
css
a{
color:#333;
text-decoration: none;
transition: 0.5;
}
a:hover{
color:dodgerblue;
text-decoration: underline;
}
html
<body>
<a href="#none">법적고지</a>
<a href="#none">개인정보취급방침</a>
<a href="#none">개인정보처리방침</a>
</body>
마우스가 올라가면 css가 변하는
가상클래스 :hover와 애니메이션 효과를 주는 transition를 학습
✅ 순서를 만드는 CSS가상클래스(nth-child, nth-of-type)
용도 & 목적 : 클래스 이름을 정하지 않고 순서를 정하는 가상 크래스 ->내가 원하는 요소를 선택하는 것
: nth-child() 가상클래스
순서 가상 클래스를 사용하는 목적 : 클래스 이름을 주지않고 요소 선택
display: inline-block로 변경했는데 margin:auto를 설정하면 절대 변하지 않아 왜? margin:auto는 block요소에만 적용하므로
.box div:nth-child(1){} /*첫번째 div 선택*/
[정리] 클래스 이름을 주지 않고 요소 선택
<body>
<div class ="box">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
</body>
.box라는 div아래 div만 4개가 있음
:nth-child() 라는 가상클래스를 이용해 css 다르게 설정가능
- 자식요소가 출연하는 순서에 따라 정해짐
()안에 숫자삽입
.box div:nth-child(1){
background-color: dodgerblue;
}
.box div:nth-child(2){
background-color: red;
}
.box div:nth-child(3){
background-color: #fff;
}
.box div:nth-child(4){
background-color: gold;
}
nth-child는 요소를 구분하지 않음
: 순서가 밀려 변동가능성이 있음
.box div:nth-child(1){
background-color: dodgerblue;
}
.box div:nth-child(2){
background-color: red;
}
.box div:nth-child(3){
background-color: #fff;
}
.box div:nth-child(4){
background-color: gold;
}
nth-of-type은 태그를 체크
: 새로운 태그가 들어왔을 때 변동없이 지정된 태그의 순서를 유지해줌
.box div:nth-of-type(1){
background-color: dodgerblue;
}
.box div:nth-of-type(2){
background-color: red;
}
.box div:nth-of-type(3){
background-color: #fff;
}
.box div:nth-of-type(4){
background-color: gold;
}
✅ 순서를 만드는 가상클래스 (first-child, last-child)
first-child : 가장 먼저 나오는 요소
last-child : 가장 나중에 나오는 요소
[정리]
:nth-child()는 괄호가 있으나
:first-child는 괄호가 없다
:last-child는 괄호가 없다
사용예시
<div class="btn">
<span>공지사항</span>
<span>갤러리</span>
</div>
.btn span{
background-color: #ddd;
width:120px;
display:inline-block;
text-align: center;
padding:5px;
border-radius: 5px 5px 0 0;
cursor: pointer;
border: 1px solid #000;
margin-right: 7px;
}
.btn span:first-child{
background-color: #fff;
}
.btn span:last-child{
color:red;
}
제이쿼리 링크하기
<body>안에 <script>링크
$('.open-modal').click(function(){}) $('.open-modal').click(function(){})
<head>안에 <script>링크
$(function(){ $('.open-modal').click(function(){}) $('.open-modal').click(function(){}) })
2번에서는 $(function(){})를 작성해줘야 함
jquery파일은 반드시 우리가 만든 custom.js파일보다 먼저나와야함
제이쿼리 기본구문
$('.show-btn').click(function(){});
선택자 .show-btn을 클릭시 function()을 실행해라
$('선택자').함수(funciton(){
$('선택자').메서드();
});
제이쿼리(jQuery) 필수 핵심이론(함수)
요소의 정중앙에 오도록 하는 방법
수평 : text-align:center;
수직 : line-height : __px;
line-height를 요소가 가진 높이값 만큼 주면 됨
click / mouseenter / mouseleave
<body>
<a class="show-btn" href="#none" >보이기</a>
<a class="hide-btn" href="#none" >감추기</a>
<a class="btn" href="#none" >보이기/감추기</a>
<div>BOX</div>
<script src="script/jquery-1.12.4.js"></script>
<script src="script/custom.js"></script>
</body>
레이어팝업(모달창) 띄울 때 : click
$('.show-btn').click(function(){
$('div').show();
});
$('.hide-btn').click(function(){
$('div').hide();
});
네비게이션 만들 때 : mouseenter, mouseleave
$('.btn').mouseenter(function(){
$('div').show();
});
$('.btn').mouseleave(function(){
$('div').hide();
});
제이쿼리(jQuery) 필수 핵심이론(메서드)
('선택자').함수(function(){
$('선택요소').메서드();
})
메서드종류
메서드(이펙트)
메서드(클래스 제어)
메서드(요소 탐색)
✅ 메서드(이펙트)
✔ .show()
✔ .hide()
✔ .slideDown()
✔ .slideUp()
✔ .fadeIn()
✔ .fadeOut()
✔ .stop()
✅ 메서드(클래스제어)
✔ .addClass()
✔ .removeClass()
✔ .toggleClass()
✅ 메서드(요소탐색)
✔ .children() : 바로 아래 자손
✔ .parent()
✔ .siblings() : 형제
✔ .find() : 자손전체
✔ .next() : 선택요소 바로다음
✔ .prev() : 선택요소 바로전
효과 메서드
show() : 선택요소 보이기
hide() : 선택요소 숨기기
toggle() : 선택요소 보이고/감추고 (두가지기능)
$('.show-btn').click(function(){
$('.container div').show();
});
$('.hide-btn').click(function(){
$('.container div').hide();
});
// 하나의 버튼이 두가지 기능을 가짐 : 토글
$('.toggle-btn').click(function(){
$('.container div').toggle();
});
.slideDown() : 선택요소 서서히 보이기
.slideUp() : 선택요소 서서히 감추기
.slideToggle() : 선택요소 서서히 보이기/감추기
$('.show-btn').click(function(){
$('.container div').slideDown();
});
$('.hide-btn').click(function(){
$('.container div').slideUp();
});
// 하나의 버튼이 두가지 기능을 가짐 : 토글
$('.toggle-btn').click(function(){
$('.container div').slideToggle();
});
fadeIn() : 선택요소 페이드로 나타나게 하는 효과
fadeOut() : 선택요소 페이드로 사라지게 하는 효과
fadeToggle() : 선택요소 페이드로 사라지고 나타나게 하는 토글
$('.show-btn').click(function(){
$('.container div').fadeIn();
});
$('.hide-btn').click(function(){
$('.container div').fadeOut();
});
// 하나의 버튼이 두가지 기능을 가짐 : 토글
$('.toggle-btn').click(function(){
$('.container div').fadeToggle();
});
( 괄호 )안에는 무엇을 넣을까요?
fadeIn(지속시간), fadeOut(지속시간)
단어로 넣을 땐 반드시 ' ' 작성
fadeIn('fast'), fadeOut('slow')
숫자로 넣을 땐 숫자만
fadeIn(500), fadeOut(2000)
*1000이 1초임
클래스 제어 메서드
일반적으로 클래스를 넣고 뺄 때 사용하는 클래스명으로 active를 사용함
주의할점
<div class="container">
<a class="add-btn" href="#none">넣기</a>
<a class="remove-btn" href="#none">빼기</a>
<a class="toggle-btn" href="#none">토글</a>
<div class="active">BOX</div>
</div>
CSS적용하기
.container div{
background-color: dodgerblue; //요거
height:300px;
width:250px;
margin-top: 10px;
color: #fff;
text-align: center;
line-height: 300px;
/* display: none; */
}
.active {
background-color: red; //요거
}
위와 같이 작성하면 제대로 작동하지 않음
왜?
div에 class이름이 없으면 .container div{}에 작성된 디자인을 불러옴
이미 background-color이 선언되어있고
.active에서 background-color이 선언되어 있으므로
충돌~~
따라서 아래와 같이 작성
.container div.active{
background-color: red;
}
나중에 선언된 속성값이 덮어쓸 수 있도록
[주의할점]
클래스 제어 메서드 3가지의 괄호 안에 . 과함께 클래스명을 쓰면 안됨
$('.add-btn').click(function(){
$('.container div').addClass('active'); //active만 작성
});
$('.remove-btn').click(function(){
$('.container div').removeClass('active');
});
// 하나의 버튼이 두가지 기능을 가짐 : 토글
$('.toggle-btn').click(function(){
$('.container div').toggleClass('active');
});
요소탐색 메서드
children() : 선택 요소의 바로 아래 단계인 자식요소만
siblings() : 선택요소의 형제요소 선택
<body>
<ul class="menu">
<li>
<a href="">MENU-1</a>
<div class="sub-menu">
<a href="#none">SUB-MENU-1</a>
<a href="#none">SUB-MENU-2</a>
<a href="#none">SUB-MENU-3</a>
<a href="#none">SUB-MENU-4</a>
</div>
</li>
<li>
<a href="">MENU-2</a>
<div class="sub-menu">
<a href="#none">SUB-MENU-1</a>
<a href="#none">SUB-MENU-2</a>
<a href="#none">SUB-MENU-3</a>
<a href="#none">SUB-MENU-4</a>
</div>
</li>
</ul>
</body>
.menu li에 마우스를 올리면 서브메뉴가 내려오도록 만든다 이때 .menu li는 li위치이므로
아래와 같이 작성하면 모든 서브메뉴가 동일한 동작을 함
$('.menu li').mouseenter(function(){
$('.sub-menu').slideDown()
})
[ 해결방법 ]
그 자식이 보이도록 하기 위해 children()적용
현재 마우스의 위치를 나타내는 this 적용
$('.menu li').mouseenter(function(){
$(this).children().slideDown()
})
this는 현재 마우스가 올라간 특정 위치선택 -> 사용자가 어떤 메뉴에 마우스를 올릴지 모르기 때문에 this로 받음
주의!! children만 작성하면 안됨 전체가 다 사라짐
$('.menu li').mouseenter(function(){
$(this).children('.sub-menu').slideDown()
})
$('.menu li').mouseleave(function(){
$(this).children('.sub-menu').slideUp()
})
계속 메뉴에 마우스를 올렸다 뺐다 하면 버그가 난것처럼 작동
해결 : stop()사용
$('.menu li').mouseenter(function(){
$(this).children('.sub-menu').stop().slideDown()
})
$('.menu li').mouseleave(function(){
$(this).children('.sub-menu').stop().slideUp()
})
[미션]
공지사항을 클릭하면 배경색이 바뀌고
갤러리를 클릭하면 공지사항의 배경색은 원래대로, 갤러리의 배경색은 변경
addClass() : 같은 속성이 있다면 대체, 없다면 추가
클릭했던 css속성을 원래대로 복구하기 위해
removeClass()
$('.btn span').click(function(){ //.btn span이 2개가 있는데 둘중 무얼 클릭할 지 모르기 때문에 this로 받음
$(this).addClass('active')
// 현재 형제요소는 1개밖에 없으므로 ()안에 숫자 적지 않아도됨
$(this).siblings().removeClass('active')
})
부모요소의 width를 상속
width:inherit
기본형 드롭다운 네비게이션
마우스 올렸을 때 드롭다운 네비게이션만들기
부모요소 & 자식요소로 구성
부모요소에 마우스가 올라간다면 자식요소에 어떤효과를 적용할지 지정(css에서)
부모 요소의 width값을 받아올 때 inherit속성 사용
오버하면 상세설명 나타나는 상품목록
show, hide를 사용하기 위해 보여지지 않도록 하는 방법
display:none
opacity 0 , 1
요기선 트랜지션을 주기위해 opacity 사용
모든 요소는 position:absolute;를 주는 순간
인라인요소, 블록요소 상관없이 인라인블록으로 변경
따라서 컨텐츠의 양만큼 크기가 줄어듦
부모요소의 크기 변경없이 수평수직정렬
->
position:absolute;
top : -100%;
left : 50%;
transform : translateX(-50%);
가상클래스 before, after은 무조건 content로 시작
.icon span:after{
content : '';
position : absolute;
}
absolute를 사용하려면 부모에 relative를 줘야하지만
.icon span은 이미 position: absolute이므로
relative가 있다고 판단
transform속성을 두번 사용할 수 없음
transform : rotate(45deg);
transform :translateX(-50%);
해결방법
하나로 뭉치기
transform : rotate(45deg) translateX(-50%);
마우스를 올렸을 때 보이도록 숨겨놓는 설정하는 방법
visibility : hidden
visibility : hidden;
자리 값은 유지하되, 존재 값은 사라지게 함
따라서 마우스를 올려둬도 나타나지 않음
마우스 올라왔을 때 나타나게 하려면
.icon:hover span{
opacity:1;
visibility : visivble;
}
2. display : none
display:none;
위의 속성은 아예 사라지게 함
.icon:hover span{
opacity:1;
visibility : visivble;
}
대신
.icon span{
pointer-events:none;
}
도 사용가능
오버한 메뉴 외 나머지 흐려지는 네비게이션
수직 정렬시
position : absolute;
top : 50%;
transform : translateY(-50%);
.gnb에 마우스를 올리게 되면 a에 적용
.gnb:hover a{
opacity : 0.3;
}
올라간 a태그의 opacity를 바꿔줌
.gnb a:hover{
opacity:1;
}
아래 두개의 속성 순서는 바뀌면 안됨~!!!!
.gnb:hover a{
opacity : 0.3;
}
.gnb a:hover{
opacity:1;
}
아래와 같이 작성하면 모든 요소에 >가 보임
opacity:0;적용
.gnb a:before{ content : '\f105'; font-family:fontawesome; opacity:0; }
마우스가 올라갔을때만 표시하도록 하기 위해
.gnb a:hover:before{ opacity:1; }
댓글을 작성해보세요.