[Text Node 제어와 Document 및 스크린, 스크롤 위치 제어]
1. [ Text Node의 제어 ]
- 텍스트 데이터 확인 : ELEMENT.data or ELEMENT.nodeValue
- 텍스트 데이터 조작
-- element.appendData("추가할 텍스트 문자열") : 맨 마지막 부분에 문자열 추가
-- element.deleteData( startIndex, length ) : 해당 index부터 몇글자 지울지
-- element.insertData( startIndex, "추가할 문자열" ) : 해당 index 위치에 삽입
-- element.replaceData( startIndex, length, "바꿀 문자열" ) : 해당 index부터 length글자만큼을 새로운 바꿀 문자열로 교체
-- element.substringData( startIndex, length ) : 해당 인덱스부터 length개만큼 가져옴
1 2 3 4 5 6 7 8 9 10 | < ul > < li id = "target" >html</ li > < li >css</ li > < li >JavaScript</ li > </ ul > < script > var t = document.getElementById('target').firstChild; console.log(t.nodeValue); console.log(t.data); </ script > |
<!DOCTYPE html>
<
html
>
<
head
>
<
style
>
#target{
font-size:77px;
font-family: georgia;
border-bottom:1px solid black;
padding-bottom:10px;
}
p{
margin:5px;
}
</
style
>
</
head
>
<
body
>
<
p
id
=
"target"
>Cording everybody!</
p
>
<
p
> data : <
input
type
=
"text"
id
=
"datasource"
value
=
"JavaScript"
/></
p
>
<
p
> start :<
input
type
=
"text"
id
=
"start"
value
=
"5"
/></
p
>
<
p
> end : <
input
type
=
"text"
id
=
"end"
value
=
"5"
/></
p
>
<
p
><
input
type
=
"button"
value
=
"appendData(data)"
onclick
=
"callAppendData()"
/>
<
input
type
=
"button"
value
=
"deleteData(start,end)"
onclick
=
"callDeleteData()"
/>
<
input
type
=
"button"
value
=
"insertData(start,data)"
onclick
=
"callInsertData()"
/>
<
input
type
=
"button"
value
=
"replaceData(start,end,data)"
onclick
=
"callReplaceData()"
/>
<
input
type
=
"button"
value
=
"substringData(start,end)"
onclick
=
"callSubstringData()"
/></
p
>
<
script
>
var target = document.getElementById('target').firstChild;
var data = document.getElementById('datasource');
var start = document.getElementById('start');
var end = document.getElementById('end');
function callAppendData(){
target.appendData(data.value);
}
function callDeleteData(){
target.deleteData(start.value, end.value);
}
function callInsertData(){
target.insertData(start.value, data.value);
}
function callReplaceData(){
target.replaceData(start.value, end.value, data.value);
}
function callSubstringData(){
alert(target.substringData(start.value, end.value));
}
</
script
>
</
body
>
</
html
>
2. [ Document(문서)의 Element 위치 알아내기 ]
var positionInfo = Element.getBoundingClientRect();
-> getBoundingClientRect()는 width, height, top, left, right, bottom 프러퍼티를 갖는 객체이다.
- width : element의 가로 길이
- height : 세로길이
- top : viewport(아래에서 설명) 맨 위에서부터 element까지 y축 길이
- left : viewport 맨 좌측에서부터 element까지 x축 길이
- right : viewport 맨 좌측에서 element 맨 오른쪽까지 길이
- bottom : viewport 맨 위에서 element 맨 아래까지 길이
1) -> 하지만, getBoundingClientRect()는 구버전 브라우저에서는 제공하지 않는 경우도 있다. 따라서,
element의 좌표를 구할 때 element.offsetLeft, element.offsetTop을 사용하면 된다. == element.getBoundingClientRect().left|top
- 테두리를 제외한 width와 height 값 구하기
- element.clientWidth
- element.clientHeight
2) -> 때떄로, 어떤 Element들은 해당 Element를 감싸고 있는 부모 Element가 position static인 경우 부모로 부터의 위치를 기준으로
자신의 offsetLeft, offsetTop값을 반환하게 된다.
따라서, 문서에서의 정확한 위치를 구하기 위해서는 다음과 같은 코드를 사용할 수 있다.
( 해당 Element를 포함하고 있는 부모 Element를 추적하면서 위치값을 더해감)
3. [ viewport란? 스크롤을 고려한 문서내의 Element의 위치 ]
- 1) Viewport(뷰포트)
: 문서 전체의 크기가 있을 때 예를들어 우리가 브라우저를 줄이게 될 경우 전체 Document가 다 보이지 않고
창 크기에 맞춰 일부분의 문서만 보일 것이다.
이때, 보이는 영역이 ViewPort이다.
--> 우리가 아까 위에서 element.offsetLeft, element.offsetTop 등이 viewport에서부터의 거리를 나타내고 있는 것이다.
따라서, 스크롤이 개입되게 되면, 해당 위치는 문서 전체를 기준으로했을 때 정확하지 않게 될 수 있다.
2) 스크롤의 위치는 어떻게 구할까?
-> window.pageYoffset
: y축 스크롤을 움직인 거리(문서가 가려진 y축 길이)
-> window.pageXoffset
: x축 스크롤을 움직인 거리(문서가 가려진 x축 길이)
3) viewport에서부터의 거리와 스크롤과의 관계
-> 스크롤을 내릴 수록 pageYoffset값은 커질 것이다. 그러면 offsetTop값을 기준으로 보면 어떻게 될까?
스크롤이 내려간만큼 그 길이는 짧아지게 된다.
예를들어, A라는 Element의 offsetTop값이 맨 처음 200이고 pageYoffset이 0이었을 때
스크롤을 40px만큼 내려 pageYoffset이 40이 되면
offsetTop값은 200 - 40 인 160이 되게 된다.
전체문서에서 보이는 viewport를 기준으로 하기 때문이다.
따라서, 전체 문서에서의 위치를 구하려면 어떻게 해야할까?
--> element.offsetTop(뷰포트좌표) + window.pageYoffset(스크롤된 정도)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | < style > body{ padding:0; margin:0; } div{ border:50px solid #1065e6; padding:50px; margin:50px; } #target{ width:100px; height:2000px; } </ style > < div > < div id = "target" > Coding </ div > </ div > < script > var t = document.getElementById('target'); setInterval(function(){ console.log('getBoundingClientRect : ', t.getBoundingClientRect().top, 'pageYOffset:', window.pageYOffset); }, 1000) </ script > |
4. [ 스크롤 제어 ]
: 스크롤을 특정 위치로 이동시키는 방법
-> window.scrollTop(x, y); // x축, y축
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | < style > body{ padding:0; margin:0; } div{ border:50px solid #1065e6; padding:50px; margin:50px; } #target{ width:100px; height:2000px; } </ style > < input type = "button" id = "scrollBtn" value = "scroll(0, 1000)" /> < script > document.getElementById('scrollBtn').addEventListener('click', function(){ window.scrollTo(0, 1000); }) </ script > < div > < div id = "target" > Coding </ div > </ div > |
5. [ Viewport의 크기와 사용자 모니터 크기 구하기 ]
- Viewport 크기
: window.innerWidth
window.innerHeight
- 사용자 모니터 크기
: screen.width
: screen.height
'스터디 > 자바스크립트 완벽 가이드 정리' 카테고리의 다른 글
Node 객체에 대하여(NODE 객체와 NODE객체 컨트롤하기) (0) | 2017.12.03 |
---|---|
이벤트 및 우클릭 방지 (0) | 2017.11.28 |
5판 7장 객체(Object)와 배열(Array) (0) | 2017.11.13 |