처음부터 웹 앱: 모달
13014 단어 webdevjavascriptuihtml
소개
안녕하세요, 이 게시물은 현대 및 표준 웹 기술(프레임워크/라이브러리가 없음을 의미함)로 구현된 공통 UI 패턴을 탐구한 "Web Apps From Scratch"라는 시리즈의 첫 번째 게시물입니다.
이제 동기는 프레임워크에 반대하는 것이 아니라 대신 프레임워크 없이 구축함으로써 프레임워크가 우리를 위해 하는 일에 감사하는 것입니다. 또한 새로운 HTML 요소, css 및 javascript 기능을 사용해 볼 기회도 있습니다.
모달
모달은 매우 인기 있는 UI 구성 요소입니다. 경고, 확인 및 프롬프트를 마지막으로 사용한 시간은 언제입니까? 모달은 우리가 원하는 대로 스타일을 지정할 수 있는 팝업 방식으로 상황별 콘텐츠를 플래시하거나 사용자 입력을 요청하는 수단을 제공합니다.
Photo Credit: UX Planet
대화 요소
그러나 이를 위한 HTML 5 요소가 있습니다. 그것은 dialog이라고 불리며 이를 지원하는 브라우저에 대해 기본적으로 우수한 기능과 접근성을 제공합니다.
API는 매우 간단합니다. 시작하려면 다음과 같이 페이지에 대화 태그를 추가합니다.
<dialog role="dialog" aria-modal="true" id='myDialog' class="modal-content card">
<button id="closeModal">×</button>
<h1>Person Details</h1>
<main></main>
</dialog>
역할 및 aria-modal은 페이지의 액세스 가능성을 향상시키는 속성입니다ARIA.
×는 닫기 버튼에 사용할 수 있는 깔끔한 X를 렌더링하는 HTML Symbol입니다.
이제 "open"속성을 태그에 넣지 않는 한 대화 상자의 의도된 동작이 내용을 표시하지 않습니다. 그러나 Chrome에서는 기본적으로 표시되므로 다음 스타일을 적용하여 이 동작을 재정의합니다.
dialog:not([open]) {
display: none;
}
상태 저장 UI
다음으로 데이터를 대화에 전달하고 싶지만 이 시리즈에서는 프레임워크의 상태 관리에 의존할 수 없습니다. 한 가지 해결책은 이벤트 기반 프로그래밍을 활용하고 요소에서 데이터를 전달하고 해당 요소에서 발생하는 이벤트를 전달하는 것입니다. 예를 들어 표시하려는 사람 데이터 모음이 있습니다.
이름은 카드에 표시되지만 세부 정보 버튼을 클릭하면 모달에서 더 많은 데이터를 볼 수 있습니다.
이러한 카드는 클라이언트나 서버에서 렌더링할 수 있지만 각 카드가 해당 데이터를 모달에 전달하도록 하기 위해 data attribute/custom attributes 을 사용할 수 있습니다.
카드 마크업은 다음과 같습니다.
<section>
<div class="card">
<p>John Smith</p>
<button data-firstname="John" data-lastname="Smith" data-age="35" data-height="5.11" onclick='onModalOpen(event)'>Details</button>
</div>
<div class="card">
<p>Sally Smith</p>
<button data-firstname="Sally" data-lastname="Smith" data-age="31" data-height="6.1" onclick='onModalOpen(event)'>Details</button>
</div>
<div class="card">
<p>Paul Smith</p>
<button data-firstname="Paul" data-lastname="Smith" data-age="29" data-height="5.2" onclick='onModalOpen(event)'>Details</button>
</div>
</section>
각 버튼에는 해당하는 사람의 데이터가 포함되며, 이는 대신 데이터를 검색하는 데 사용할 수 있는 ID일 수 있습니다. 또한 onclick 속성에서 eventHandler를 호출할 때 event 개체를 전달해야 합니다.
이제 버튼의 클릭 이벤트에 대한 이벤트 핸들러에서 특정 버튼과 관련 데이터를 가져올 수 있습니다.
const dialog = document.querySelector('#myDialog');
function onModalOpen(event){
const button = event.target;//get the button from the event
const buttonData = button.dataset;
const html = dataTemplate(buttonData);//get the values of all data attributes
document.querySelector('dialog > main').innerHTML = HTML;
//querySelector over getElementById, more flexible and doesn't require making ids
dialog.showModal();
//showModal() method available on all dialog elements to display the dialog on the screen
}
buttondata는 기본적으로 데이터 속성의 키와 값을 문자열로 포함하는 객체입니다DOMStringMap. buttonData를 기록하면 다음을 얻습니다. template literals을 사용하여 모달에 표시되어야 하는 동적 HTML을 반환하는 템플릿 함수에 buttonData를 전달합니다.
function dataTemplate({firstname, lastname, age, height}){
//using object destrucuring to get the fields of the object
return `<p>First Name: ${firstname}</p>
<p>Last Name: ${lastname}</p>
<p>Age: ${age}</p>
<p>Height: ${height}</p>`;
//using template literals to interpolate data
}
또한 destructuring을 사용하여 데이터 필드를 변수로 가져옵니다.
폴리필
브라우저가 현재 표준 기능의 지원이 부족할 때마다 종종 polyfill이라는 라이브러리가 만들어지므로 중단되지 않습니다. 모달이 사파리와 파이어폭스에서 계속 작동하도록 pollyfill을 페이지에 추가할 수 있습니다.
<script src="https://cdnjs.cloudflare.com/ajax/libs/dialog-polyfill/0.5.6/dialog-polyfill.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dialog-polyfill/0.5.6/dialog-polyfill.min.css">
끝맺음
모달을 닫으려면 닫기 버튼에 다른 이벤트 핸들러를 추가하기만 하면 됩니다.
const closeModal = document.querySelector('#closeModal');
closeModal.addEventListener('click', function(){
dialog.close();
document.body.focus();
});
스크린 리더와 같은 보조 장치가 모달을 닫을 때 페이지의 주요 부분으로 돌아가는 것을 알 수 있도록 본문을 다시 포커스로 설정했습니다.
결론
이것을 모두 합치면 다음과 같은 결과를 얻습니다.
전체 예제는 this Repl link에서 볼 수 있습니다. 이 시리즈의 첫 번째 게시물이 유익한 정보가 되길 바라며 Nest One을 계속 지켜봐 주시기 바랍니다!
Reference
이 문제에 관하여(처음부터 웹 앱: 모달), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/snickdx/web-apps-from-scratch-modals-20fb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
모달은 매우 인기 있는 UI 구성 요소입니다. 경고, 확인 및 프롬프트를 마지막으로 사용한 시간은 언제입니까? 모달은 우리가 원하는 대로 스타일을 지정할 수 있는 팝업 방식으로 상황별 콘텐츠를 플래시하거나 사용자 입력을 요청하는 수단을 제공합니다.
Photo Credit: UX Planet
대화 요소
그러나 이를 위한 HTML 5 요소가 있습니다. 그것은 dialog이라고 불리며 이를 지원하는 브라우저에 대해 기본적으로 우수한 기능과 접근성을 제공합니다.
API는 매우 간단합니다. 시작하려면 다음과 같이 페이지에 대화 태그를 추가합니다.
<dialog role="dialog" aria-modal="true" id='myDialog' class="modal-content card">
<button id="closeModal">×</button>
<h1>Person Details</h1>
<main></main>
</dialog>
역할 및 aria-modal은 페이지의 액세스 가능성을 향상시키는 속성입니다ARIA.
×는 닫기 버튼에 사용할 수 있는 깔끔한 X를 렌더링하는 HTML Symbol입니다.
이제 "open"속성을 태그에 넣지 않는 한 대화 상자의 의도된 동작이 내용을 표시하지 않습니다. 그러나 Chrome에서는 기본적으로 표시되므로 다음 스타일을 적용하여 이 동작을 재정의합니다.
dialog:not([open]) {
display: none;
}
상태 저장 UI
다음으로 데이터를 대화에 전달하고 싶지만 이 시리즈에서는 프레임워크의 상태 관리에 의존할 수 없습니다. 한 가지 해결책은 이벤트 기반 프로그래밍을 활용하고 요소에서 데이터를 전달하고 해당 요소에서 발생하는 이벤트를 전달하는 것입니다. 예를 들어 표시하려는 사람 데이터 모음이 있습니다.
이름은 카드에 표시되지만 세부 정보 버튼을 클릭하면 모달에서 더 많은 데이터를 볼 수 있습니다.
이러한 카드는 클라이언트나 서버에서 렌더링할 수 있지만 각 카드가 해당 데이터를 모달에 전달하도록 하기 위해 data attribute/custom attributes 을 사용할 수 있습니다.
카드 마크업은 다음과 같습니다.
<section>
<div class="card">
<p>John Smith</p>
<button data-firstname="John" data-lastname="Smith" data-age="35" data-height="5.11" onclick='onModalOpen(event)'>Details</button>
</div>
<div class="card">
<p>Sally Smith</p>
<button data-firstname="Sally" data-lastname="Smith" data-age="31" data-height="6.1" onclick='onModalOpen(event)'>Details</button>
</div>
<div class="card">
<p>Paul Smith</p>
<button data-firstname="Paul" data-lastname="Smith" data-age="29" data-height="5.2" onclick='onModalOpen(event)'>Details</button>
</div>
</section>
각 버튼에는 해당하는 사람의 데이터가 포함되며, 이는 대신 데이터를 검색하는 데 사용할 수 있는 ID일 수 있습니다. 또한 onclick 속성에서 eventHandler를 호출할 때 event 개체를 전달해야 합니다.
이제 버튼의 클릭 이벤트에 대한 이벤트 핸들러에서 특정 버튼과 관련 데이터를 가져올 수 있습니다.
const dialog = document.querySelector('#myDialog');
function onModalOpen(event){
const button = event.target;//get the button from the event
const buttonData = button.dataset;
const html = dataTemplate(buttonData);//get the values of all data attributes
document.querySelector('dialog > main').innerHTML = HTML;
//querySelector over getElementById, more flexible and doesn't require making ids
dialog.showModal();
//showModal() method available on all dialog elements to display the dialog on the screen
}
buttondata는 기본적으로 데이터 속성의 키와 값을 문자열로 포함하는 객체입니다DOMStringMap. buttonData를 기록하면 다음을 얻습니다. template literals을 사용하여 모달에 표시되어야 하는 동적 HTML을 반환하는 템플릿 함수에 buttonData를 전달합니다.
function dataTemplate({firstname, lastname, age, height}){
//using object destrucuring to get the fields of the object
return `<p>First Name: ${firstname}</p>
<p>Last Name: ${lastname}</p>
<p>Age: ${age}</p>
<p>Height: ${height}</p>`;
//using template literals to interpolate data
}
또한 destructuring을 사용하여 데이터 필드를 변수로 가져옵니다.
폴리필
브라우저가 현재 표준 기능의 지원이 부족할 때마다 종종 polyfill이라는 라이브러리가 만들어지므로 중단되지 않습니다. 모달이 사파리와 파이어폭스에서 계속 작동하도록 pollyfill을 페이지에 추가할 수 있습니다.
<script src="https://cdnjs.cloudflare.com/ajax/libs/dialog-polyfill/0.5.6/dialog-polyfill.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dialog-polyfill/0.5.6/dialog-polyfill.min.css">
끝맺음
모달을 닫으려면 닫기 버튼에 다른 이벤트 핸들러를 추가하기만 하면 됩니다.
const closeModal = document.querySelector('#closeModal');
closeModal.addEventListener('click', function(){
dialog.close();
document.body.focus();
});
스크린 리더와 같은 보조 장치가 모달을 닫을 때 페이지의 주요 부분으로 돌아가는 것을 알 수 있도록 본문을 다시 포커스로 설정했습니다.
결론
이것을 모두 합치면 다음과 같은 결과를 얻습니다.
전체 예제는 this Repl link에서 볼 수 있습니다. 이 시리즈의 첫 번째 게시물이 유익한 정보가 되길 바라며 Nest One을 계속 지켜봐 주시기 바랍니다!
Reference
이 문제에 관하여(처음부터 웹 앱: 모달), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/snickdx/web-apps-from-scratch-modals-20fb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<dialog role="dialog" aria-modal="true" id='myDialog' class="modal-content card">
<button id="closeModal">×</button>
<h1>Person Details</h1>
<main></main>
</dialog>
dialog:not([open]) {
display: none;
}
다음으로 데이터를 대화에 전달하고 싶지만 이 시리즈에서는 프레임워크의 상태 관리에 의존할 수 없습니다. 한 가지 해결책은 이벤트 기반 프로그래밍을 활용하고 요소에서 데이터를 전달하고 해당 요소에서 발생하는 이벤트를 전달하는 것입니다. 예를 들어 표시하려는 사람 데이터 모음이 있습니다.
이름은 카드에 표시되지만 세부 정보 버튼을 클릭하면 모달에서 더 많은 데이터를 볼 수 있습니다.
이러한 카드는 클라이언트나 서버에서 렌더링할 수 있지만 각 카드가 해당 데이터를 모달에 전달하도록 하기 위해 data attribute/custom attributes 을 사용할 수 있습니다.
카드 마크업은 다음과 같습니다.
<section>
<div class="card">
<p>John Smith</p>
<button data-firstname="John" data-lastname="Smith" data-age="35" data-height="5.11" onclick='onModalOpen(event)'>Details</button>
</div>
<div class="card">
<p>Sally Smith</p>
<button data-firstname="Sally" data-lastname="Smith" data-age="31" data-height="6.1" onclick='onModalOpen(event)'>Details</button>
</div>
<div class="card">
<p>Paul Smith</p>
<button data-firstname="Paul" data-lastname="Smith" data-age="29" data-height="5.2" onclick='onModalOpen(event)'>Details</button>
</div>
</section>
각 버튼에는 해당하는 사람의 데이터가 포함되며, 이는 대신 데이터를 검색하는 데 사용할 수 있는 ID일 수 있습니다. 또한 onclick 속성에서 eventHandler를 호출할 때 event 개체를 전달해야 합니다.
이제 버튼의 클릭 이벤트에 대한 이벤트 핸들러에서 특정 버튼과 관련 데이터를 가져올 수 있습니다.
const dialog = document.querySelector('#myDialog');
function onModalOpen(event){
const button = event.target;//get the button from the event
const buttonData = button.dataset;
const html = dataTemplate(buttonData);//get the values of all data attributes
document.querySelector('dialog > main').innerHTML = HTML;
//querySelector over getElementById, more flexible and doesn't require making ids
dialog.showModal();
//showModal() method available on all dialog elements to display the dialog on the screen
}
buttondata는 기본적으로 데이터 속성의 키와 값을 문자열로 포함하는 객체입니다DOMStringMap. buttonData를 기록하면 다음을 얻습니다. template literals을 사용하여 모달에 표시되어야 하는 동적 HTML을 반환하는 템플릿 함수에 buttonData를 전달합니다.
function dataTemplate({firstname, lastname, age, height}){
//using object destrucuring to get the fields of the object
return `<p>First Name: ${firstname}</p>
<p>Last Name: ${lastname}</p>
<p>Age: ${age}</p>
<p>Height: ${height}</p>`;
//using template literals to interpolate data
}
또한 destructuring을 사용하여 데이터 필드를 변수로 가져옵니다.
폴리필
브라우저가 현재 표준 기능의 지원이 부족할 때마다 종종 polyfill이라는 라이브러리가 만들어지므로 중단되지 않습니다. 모달이 사파리와 파이어폭스에서 계속 작동하도록 pollyfill을 페이지에 추가할 수 있습니다.
<script src="https://cdnjs.cloudflare.com/ajax/libs/dialog-polyfill/0.5.6/dialog-polyfill.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dialog-polyfill/0.5.6/dialog-polyfill.min.css">
끝맺음
모달을 닫으려면 닫기 버튼에 다른 이벤트 핸들러를 추가하기만 하면 됩니다.
const closeModal = document.querySelector('#closeModal');
closeModal.addEventListener('click', function(){
dialog.close();
document.body.focus();
});
스크린 리더와 같은 보조 장치가 모달을 닫을 때 페이지의 주요 부분으로 돌아가는 것을 알 수 있도록 본문을 다시 포커스로 설정했습니다.
결론
이것을 모두 합치면 다음과 같은 결과를 얻습니다.
전체 예제는 this Repl link에서 볼 수 있습니다. 이 시리즈의 첫 번째 게시물이 유익한 정보가 되길 바라며 Nest One을 계속 지켜봐 주시기 바랍니다!
Reference
이 문제에 관하여(처음부터 웹 앱: 모달), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/snickdx/web-apps-from-scratch-modals-20fb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<script src="https://cdnjs.cloudflare.com/ajax/libs/dialog-polyfill/0.5.6/dialog-polyfill.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dialog-polyfill/0.5.6/dialog-polyfill.min.css">
모달을 닫으려면 닫기 버튼에 다른 이벤트 핸들러를 추가하기만 하면 됩니다.
const closeModal = document.querySelector('#closeModal');
closeModal.addEventListener('click', function(){
dialog.close();
document.body.focus();
});
스크린 리더와 같은 보조 장치가 모달을 닫을 때 페이지의 주요 부분으로 돌아가는 것을 알 수 있도록 본문을 다시 포커스로 설정했습니다.
결론
이것을 모두 합치면 다음과 같은 결과를 얻습니다.
전체 예제는 this Repl link에서 볼 수 있습니다. 이 시리즈의 첫 번째 게시물이 유익한 정보가 되길 바라며 Nest One을 계속 지켜봐 주시기 바랍니다!
Reference
이 문제에 관하여(처음부터 웹 앱: 모달), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/snickdx/web-apps-from-scratch-modals-20fb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(처음부터 웹 앱: 모달), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/snickdx/web-apps-from-scratch-modals-20fb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)