기본 콘텐츠로 건너뛰기

라벨이 html인 게시물 표시

CustomElement (2)

 전 시간에 CustomElement를 만드는 방법에 대해서 확인해보았다. 이번 시간부터는 조금더 상세하게 확인해보도록 하자. 정의요소 class MyElement extends HTMLElement { constructor () { super () // element 생성 } connectedCallback () { // document 에 element 가 추가 되면 브라우저에서 호출이 된다 . } disconnectedCallback () { // document 에 element 가 제거 되면 브라우저에서 호출이 된다 . } static get observedAttributes () { return [ /* 모니터링 될 속성의 이름 . */ ] } attributeChangedCallback (name , oldValue , newValue) { // observedAttributes 에서 나열되어있는 속성중 하나의 속성이라도 값이 변경되면 호출 된다 . } adoptedCallback () { // 해당 엘리먼트라 다른 document 로 이동될 시 호출 된다 . } }  customElement를 정의하게 되면 위의 메서드들을 정의할 수 있다. 각각의 메서드들 중 constructer를 제외 하고는 처음 보는 것들일 것이다. 각각의 속성에 대해서 설명을 해보겠다. constucter  당연 하게도, new MyElement()를 호출하게 되면 constructer가 호출되는 것은 당연하게 여길 것이다. 그 외에 엘리먼트로써 생성되는 경우가 두가지가 있다.  html 본문에 태그로 작성 되어있는 경우 customElements.define이 되어있다면, 해당 태그가 해석 될 때 constructer가 호출 되고, customElements.define가 태그 해석이 완료 후에 호출된다면, define이 되었을 때 호출이 ...

CustomElement

 프런트엔드 개발자라면 프레임워크등을 사용하여 컴포넌트를 만드는 것은 익숙 할 것이다. 뭐 물론 백엔드 개발자라고 하더라도, custom tag를 정의 해 본 사람도 있을 것이다. 오늘은 프레임 워크없이 우리가 컴포넌트라고 부를수 있을 만한 custom element를 정의를 해볼 것이다. Window.customElements  window의 기본객체에는 위와 같은 객체가 있다. 이름만 보더라도 아 새로운 element를 등록하기 위해서 만들어진 것이구나 생각 할 수 있을 것이다. 그러면 지원하는 함수들을 한번 확인해보자. define, get, upgrade, whenDefined  define: 우리가 이번 포스트에서 주로 살펴볼 함수이다. 커스텀 엘리먼트를 정의 하는 함수라고 볼수 있다. * document.registerElement와 유사한 행위를 하지만 document.registerElement는 deprecated이니 사용 하지 말자.  get: 특정이름으로 정의 된 커스텀 엘리먼트의 클래스를 반환한다.  upgrade: 특정 dom의 트리를 정의한 커스텀 엘리먼트로 업그레이드 한게 된다.  whenDefined: 특정이름의 컴포넌트가 정의 될때 알 수 있도록 promise를 제공한다. => 이는 미리 html을 로드후 정의 되지 않은 엘리먼트를 특정 시점에 upgrade를 하거나 대치 할 수 있도록 정의 필요 할 것으로 보인다. Window.customElements.define  window의 기본객체에는 위와 같은 객체가 있다. 이름만 보더라도 아 새로운 element를 등록하기 위해서 만들어진 것이구나 생각 할 수 있을 것이다. 그러면 지원하는 함수들을 한번 확인해보자.  커스텀 엘리먼트를 정의 하는 것은 어렵지 않다. <html> <head> <script> class TestElement ...

css 트릭1 (정사각형)

 일단 이걸 css 트릭이라고 부르긴 하지만, 뭐 거창할 거 없이 팁정도의 내용이다. 일반적으로 기본서에는 잘 나오지 않는 내용을 다룰 예정이다.  정사각형 만들기  정사각형 만들기가 뭐 그리어렵다고, 글을 작성하는가? 라고 말할 수 있다. 당연하게도 맞는 말이다. <div style =" width : 200 px ; height : 200 px ; background : green" > 200*200 </div>  당연하게도 위처럼 하면 200*200의 정사각형이 된다.  만들어야 할 정사각형의 크기를 안다면 위처럼 지정 해줄 수 있다. 하지만, 부모 너비에 비례하는 정사각형을 만들려고 해보자. 예를 들어 부모의 너비의 10%하는 정사각형 말이다. <div style =" width : 10 % ; height : 10 % ; background : green" > 200*200 </div> 간단하게 작성해보았다. 하지만, 우리가 원했던 정사각형의 모양은 아니다. 아쉽게도 위의 코드는 부모(컨테이닝 블록)의 너비 10%, 높이 길이 10%이기 때문에 너비에 해당하는 정사각형을 이루기에는 어렵다.  비율지정  우리는 길이를 넣을 수 있는 속성의 값에 백분률도 넣기도 한다. 그런데 그 백분률이 무엇에 대한 백분률인지는 문서를 확인해보지 않으면 알 수 없다. 그래도 추정 할 수 있는 것은 width은 부모의 width를 height는 부모의 height를 따라가겠지 정도이다.  아래는 어떤 속성이 부모의 width, height따라 가는지에 대한 표이다.  부모의 width : width, left, right, padding, margin   부모의 heigh : height, top, bottom  자 위의 설명 대로면, padding이나 margin의 경우 padding-top, m...

Electron 시작하기.

 Electron 이란?  html, css, javascript로 데스크톱 앱을 만드는 프레임워크이다.  즉 웹 개발자들이 응용플로그램도 개발 할 수 있게 해주는 프레임워크이며 출시된지는 꽤 오래 되었으나, 개발 공부를 시작한지 얼마 안되었거나, 관련 업무가 없었다면 아직 모를 수 있는 부분이다.  물론 예전에는 nwjs라는 툴을 사용 했었지만 업데이트나 인스톨쉴드를 따로 구비해서 배포 했어야 하는 불편함이 있기도 했다.  맥, 윈도우, 리눅스를 지원하는 서비스를 만들 예정이라면 고려해볼 대상이다. Electron으로 만들어진 어플리케이션 뭐 Electron으로 만들어진 어플리케이션이 위의 어플리케이션이 끝은 아니지만, Electron사이트 홈에 소개 되어질 정도로 유명한 서비스들이기에 소개 해보았다. 시작하기! 당연 노드는 설치 되어있다고 생각 하고 진행하겠다. cmd창이나 terminal에 아래의 명령어를 입력 합시다. mkdir my-electron-app && cd my-electron-app npm init -y npm install --save-dev electron  이제 저기에 있는 package.json을 수정해보자. { "name" : "my-electron-app" , "version" : "1.0.0" , "description" : "" , "main" : "index.js" , "scripts" : { "start": "electron ." } , "keywords" : [] , "author" : "" , "license" : "ISC" , "devDependencies" : ...

label을 이용하자.

 많은 개발자들이 label을 이용하거나 라벨을 이용하는 것처럼 여러가지 지원을 해준다. 하지만 몇몇 개발자 분들은!!!!! 사소한 부분을 신경을 쓰지 않기도 한다. 뭐 물론 아직 많이 사용하지 않는 혹은 아직 사용성에 신경쓸정도가 되지 않을 정도로 기능 우선적 개발이 필요한 경우가 있을 수 있지만... 몇몇 서비스의 경우 이미 오래되었음에도 불구하고, 신경을 안쓰는 곳이 있다.  웹을 공부를 하셨던 분이라면 html을 공부를 할 때, input과 관련 하여 label을 공부하게 될 것이다. 하지만 도덕 공부를 해도 쓰레기를 바닥에 버리는 것처럼 , 잘 신경 쓰지 않는 것 같다. 위의 코드를 보면 사용법은 간단하다. <input type ="radio" id ="html" name ="fav_language" value ="HTML" /> <label for ="html" > HTML </label> for와 id를 맞춰주기만 하면 label의 클릭이 input을 클릭한것처럼 처리가 된다. <label> <input type ="radio" name ="fav_language" value ="HTML" /> HTML </label> 혹은 for와 id를 제공하지 않고 label안쪽으로 input을 위치 시켜주어도 된다. <input type ="radio" id ="html" name ="fav_language" value ="HTML" /> <label for ="html" > HTML </label> 참고로 조심하여야 하는것이 같은 id와 for를 이용하면 안되는 것이다. 만약에 label에 for와 id를 사용 하는 ...

나 어디 바뀐거 없어? (Mutation Observer)

 Observer 시리즈 중 세번째 Mutation Observer이다. 내 경험에서는 이용 빈도는 낮은 편이나, 현실에서도 그렇고 프로그래밍에서도 변화를 감지하는 것은 꽤 당황할 수 있는 요구라서 이런 내용도 있구나 라는 것을 인지 시키기 위해서 포스팅을 쓴다.  당연하게도 내가 제어하고 있는 엘리먼트의 변화를 감지할 필요는 많지는 않을 것이다. 하지만, 타인이 만든 라이브러리 특히 옛날에 만들어진 라이브러리를 사용을 하게 된다면, 사용해야 할 가능성이 꽤나 높다. 조금 더 자세하게 얘기해보자면 vue.js를 사용 하고 있는데, jQuery UI라이브러리를 사용 해야 하는 경우가 있을 수 있겠다.  뭐 당연하게도 위에 들은 예시는 최대한 있으면 안되는 행동이나 세상이 그렇게 깨끗하지는 않기에 예시를 들어보았다.   간단하게 예제를 만들어 보았다.  당연하게도 appendChild 함수나 setColor함수에 writeLog 함수를 작성하지 않고, MutationObserver를 통해서만 writeLog를 호출 한것으로 처리 되고 있다.

요소 크기 변화 확인 (ResizeObserver)

 DOM의 크기를 감시해보자!  DOM의 크기 변화를 감지해야하는 상황은 그렇게 많지는 않다. 하지만 언젠가는 필요할 때가 있다. 당연하게도 이런형태의 옵저버가 있다는 것은 아무리 미디어쿼리로 처리를 한다고 해도 한계가 있으니 스크립트에서 구현 하는 것밖에는 답이 없는 상황이던가, 미디어쿼리로 처리하는 것보다 스크립트에서 간단하게 처리가 되는 경우도 있다고 볼수 있을 것이다.  ResizeObserver의 적용 방법은 매우 간단하다. ResizeObserver 객체를 생성하면서 변경시 처리할 콜백 함수를 제공하고, 해당 객체로 감지한 DOM을 observe 해준다.  이렇게만 하면 완료가 된다. 간단하게 예제 하나만으로 사용 법을 다 익힐 수가 있으니 아래의 코드를 확인해보자. 예제 코드를 보면 정말로 별거 없는 코드이다. 하지만, ResizeObserver를 사용 하지 않고 옛날 코드스타일 대로 해당 기능을 구현한다고 생각하면, 꽤나 귀찮은 작업이면서 성능도 떨어질 것이므로 소개를 해보았다. 옛날코드 다시읽기 소재로 나중에 한번 옛날 코드를 소개해줄 기회가 있을지도 모르겠다.

있었는데, 없어졌습니다. ( display:contents )

가끔 퍼블리싱을 하다보면 vue.js의 root엘리먼트가 항상 있어야 하는 것은 거슬리는 일이기도 하다. 혹은 관련이있어서 같은 부모를 가져야 하는 태그들이 있을 수 있다. 물론 아직도 display: block, inline만을 사용 하고 있다면, 딱히 불편함은 없을 수 있겠지만... grid와 flex없이는 이제 퍼블리싱 못하는 몸이 되어버렸다... < div style =" display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); " > < div style =" background: red; " > test1 </ div > < div style =" background: green; " > test2 </ div > < ul > < li style =" background: blue; " > 1 </ li > < li style =" background: purple; " > 2 </ li > </ ul > </ div > 위 코드의 결과를 보자. 딱 보아도 잘못 된것만 같은 무언가가 만들어졌다. < div style =" display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); " > < div style =" background: red; " > test1 </ div > < div style =" background: green; " > te...

브라우저의 성능을 뛰어넘자! (wasm)

 웹 개발자라면, 특히나 프런트엔드 개발자라면 wasm은 익히 들었을 것이다. 하지만, 재미로는 많이들 사용 해봤겠지만, 주니어 개발자나 c/c++, rust를 습득하지 않았거나 오래 되신 분들은 재미로 해보기에는 조금 벅찰 수 있으니 포스팅을 작성한다.  위의 즉 이 글은 주니어 개발자, c/c++, rust를 사용하기 싫은 분 들이 대상이다. 아주 간단하게 맛만 보여드릴 테니, 자세한 내용은 다른 포스팅을 보고 습득 하시거나 책을 추천 드린다.  프런트엔드 개발자라면 최소 TypeScript를 들어 보았거나 들어보았을 것이다. 이 포스팅에서는 wasm을 TypeScript를 이용하여 작성 할 것이다.  해당 예제를 하기에 앞서서 최신버전의 Node.js를설치하기 바란다. npm init npm install --save @assemblyscript/loader npm install --save-dev assemblyscript npx asinit .  자 여기까지 왔다면 위와 같은 파일들을 얻을 수 있다. /assembly/index.js // The entry file of your WebAssembly module. export function add ( a : i32 , b : i32 ): i32 { return a + b ; }  위와 같은 함수를 볼 수 있다.  간단하게 위의 코드를 설명 하자면, add라는 함수를 외부에 노출을 시키며, a, b라는 인자를 받으며 각각의 타입은 i32(부호가 있는 32비트의 정수)이고, 인자 a, b를 받아서 i32타입으로 값으로 리턴한다.  간단하게 설명을 해보았는데, 답이 되었으면 좋겠다.  자 여기까지만 보면, 이걸로 속도테스트가 되나?? 이생각이 들 것이다. 맞다. 당연안되겠지 그러니 다음 함수를 추가하자. // The entry file of your WebAssembly module. export functi...

File drag and drop

 htm에 파일을 드래그앤 드랍을 하여 파일을 업로드 하는 것을 그렇게 어려운 일은 아니다. 그래도 해당 기능이 있으면 꽤나 편한 기능이기에 방식을 소개하면서 해당 코드를 공유 하고자 작성 한다.  여기서 신경써야 하는 이벤트는 두가지 있다. drop이벤트와 dragover이벤트이다. drop이벤트는 딱보아도, 해당영역에 무언가 떨어졌을 때이다  드랍쉽을 생각하면 된다.  당연하게도 drop이벤트에서 파일을 확인 할 수 있게 된다. 자 그러면 dragover는 왜 확인해야 할까?  drop 이벤트도 그렇지만 dragover의 이벤트의 파일 끌기의 브라우저 기본기능이 일반적으로 파일을 오픈하는 행위라서이다. 간단하게만 생각하면 파일을 놓는 순간 파일이 다운로드 될테이다. drop의 기본기능만 껏다가는 계속 파일을 다운로드 받게 될 것이다.  자 아래의 코드들을 확인하자.  특이점은 세가지정도로 분류 할 수 있다. 1. html(루트 엘리먼트) 에 이벤트 리스너. 2. drop-zone이 label이면서 input[type=file]태그 3. drop-zone에 drop과 dragover를 제외한 이벤트 리스터들.  아래는 해석이다. 1. html(루트 엘리먼트) 에 이벤트 리스너.  난 드래그앤 드랍 파일기능을 제공 하는 사이트들에서 꽤 불편하게 느꼇던 것이 뚱뚱한 손가락 오류 였다. 조금만 빗나가면 수많은 파일들이 다운로드 받아졌다. 따라서 기본기능을 제거하기위해 루트엘리먼트에도 이벤트리스너를 달았다.  2. drop-zone이 label이면서 file태그 파일 드래그앤 드랍만 제공할 경우 꽤나 불편한 상황이 올것이다. 특히나 모니터를 여러대 사용하거나 멀티윈도우를 사용하는 경우엔... 그래서 drop 영역을 클릭시 input type="file"이 해당 이벤트를 받을 수 있도록 영역을 라벨로 처리 하였다. 참고로 input type="file"은 display none을 ...

float 더 이상 쓸일 없는가? (shape)

 예전에는 float을 이용하여 layout잡는것에 많이 사용해왔다. 하지만 grid, flex가 생겨나에 따라서 다루기 어려운 float을 더이사 사용 할 일이 없어졌다. float은 간단히 소개 하면 자기 자신이 어떤위치에 있어야 하는가? 를 결정 할 수 있는 속성이다. 다음은 mdn의 소개이다. CSS 속성(property) float 은 한 요소(element)가 보통 흐름(normal flow)으로부터 빠져 텍스트 및 인라인(inline) 요소가 그 주위를 감싸는 자기 컨테이너의 좌우측을 따라 배치되어야 함을 지정합니다. * 출처 :  https://developer.mozilla.org/ko/docs/Web/CSS/float 하지만 아무리 보아도 위의 설명으로는 더 이상 사용 할 일이 없어 보인다. flex, grid로 해결 할 수 있다. 그렇지만 deprecated된 속성이 아니다. 그렇다면 float으로 밖에 할 수 없는 행위가 있을까? 그렇다 있다. 애초에 아래의 내용을 보면 여태까지 float으로 레이아웃을 잡았던 것이 이상하게 느껴질 정도이다. ( 뭐 나도 그렇게 잡아왔고, 그 당시에 html, css 책 들에도 그런 방식으로 소개 되어왔다. ) 위의 효과를 줄 수 있는 방법은 float이 유일할 것으로 보인다. 물론.... width를 고정 시키고 margin과 padding을 사용하여 노가다를 한다면 가능하겠다만... 하지만 위의 효과를 바라는 디자이너도 없겠지.. 자세한 내용은 mdn에서 참고 할 수 있으니 링크 달아 두겠다. https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/Shapes_From_Images

이 엘리먼트 얼만큼 보여요? (IntersectionObserver)

 웹사이트들을 이용하다보면 아래와 같이 해당 사이트의 메인 이미지와 제일 상단에 제목이 표현 되는 사이트들이 많다. 하지만 아래보시다 시피 따로 처리를 해주지 않는 이상 header가 내용을 보는 동안에 불편을 끼칠 수있다.  옛날에는 스크롤의 탑기준이 어디에 왔는지에 따라서 헤더를 없애거나 백그라운드를 표현을 하면서 아래처럼 표현해왔다.   옛날에는 그랬지만 IntersectionObserver가 추가 됨에 따라서 좀더 편리하게 위의 기능을 처리 할 수 있다. const observer = new IntersectionObserver ((entries) => { console . log ( 'entries' , entries) } , { root : document . querySelector ( '.contents' ) , threshold : [ 0.1 , 0 ] }) const target = document . querySelector ( '.banner' ) observer . observe ( target ) ; 사용 방법은 위와 같다.  IntersectionObserver( handler, options ) handler : 위의 설정기준으로 target엘리먼트가 루트엘리먼트에서 보이지 않을때와 10프로 미만 혹은 10프로 초과 혹은 보이지 않을때 호출이 된다. 호출시 첫번째 인자로 IntersectionObserverEntry[]를 전달해준다.  options : root 감시대상들의 상위요소이다.                    threashold  임계값 목록이다. 아래는 IntersectionObserver를 이용하여 header에 백그라운드를 추가하는 샘플 코드입니다.  아래와 같은거 말고도 제일 스크롤이 제일 하단에 충돌 ...

html, css를 이용하여 타이머를 만들어 보자.

 javaScript를 이용 하지 않고, 위 처럼 만들고자 한다면 어떤것들이 필요 할까? 1. 초침을 움직이는 애니메이션 2. 초침을 멈출 수 있는 변수. 3. 초침을 초기화 할 수 있는 함수.  위 세가지를 어떻게 구현 할 것인가? 1. 초침을 움직이는 애니메이션  => 간단하게 transform: rotate, animation을 이용하면 0deg -> 360deg로 변경 됨에 있어서 몇초 동안 걸리게 할 지 처리가 가능 하다. 2. 초침을 멈출 수 있는 변수   => 멈출 수 있는 변수 여기서 문제다. html, css에는 변수가 존재 하지 않는다.   html에서 true, false의 값을 가질 수 있는 것을 생각 해보면 checkbox를 이용하는 것으로 해결 할 수 있다.  애니메이션을 도중에 멈추기 위해서는 animation-play-state를 사용 할 수 있다. 즉 checkbox를 체크 되어있으면 animation-play-state: running; 체크 되어있지 않으면, animation-play-state: paused;를 이용 하면 된다. 3. 초침을 초기화 할 수 있는 함수.  => 초기화를 하기위해서는 무엇이 필요한가? 초기화 버트을 눌렀다는 이벤트가 필요하다.   의사 클래스인 :active를 이용해보자! :active는 mdn에서는 아래와 같이 설명 되어있다. :active   CSS   의사 클래스 는 사용자가 활성화한 요소(버튼 등)를 나타냅니다.  마우스를 사용하는 경우, "활성"이란 보통 마우스 버튼을 누르는 순간부터 떼는 시점까지를 의미합니다. :active는 버튼을 누른 순간에 활성화 되는 클래스이며, 해당 시점에 애니메이션을 잠시 제거하는 것만으로 초기화를 할 수 있다.  코드와 만드는 영상은 아래에 첨부하였으니, 여기까지 읽었다면 한번 코드는 확인 해보는 것을 추천 한다....

html, css만 사용하여 카운트 해보자 (counter)

특정 태그를 세는 것을 javascript 없이 할 수 있을까? 할 수 있다. 아래의 속성을 이용 하면 되는데, css에서 숫자를 새고 해당 값을 content에서 이용 할 수 있다.   https://developer.mozilla.org/en-US/docs/Web/CSS/counter() 자 그러면 위의 속성을 조금 이용해보도록 하자. 위 처럼 체크박스를 새는 것도 가능 하다. 위의 코드를 확인하면, css부분이 중요하므로 css를 확인해보면,