search
HomeWeb Front-endJS TutorialEXPLORING HTML ELEMENTS:

DEMO

Introduction

EXPLORING HTML ELEMENTS: <DIALOG>

The dialog element has been widely supported by all browsers for some time now, and I'm here to show you how this element can greatly improve the productivity and quality of your code, regardless of the framework you're using.

I'm using plain JavaScript to demonstrate that you don't need many lines of code to create beautiful and simple components.
Using this element is quite simple:

<main>
  <dialog>





<pre class="brush:php;toolbar:false">const dialog = document.getElementById('dialog');
const dialogButton = document.getElementById('dialogButton');

dialogButton.addEventListener('click', () => dialog.showModal());

As you can see above, you just need to take the reference of the dialog element and call one of these two functions:

dialogButton.addEventListener('click', () => dialog.showModal());
dialogButton.addEventListener('click', () => dialog.show());

But you might be wondering:

What is the difference between these two functions?

Well, to understand that, we have to understand a little about layers and what the top-layer is.

Layers

Let me give you an example of something you may have come across before when using a drawer component. You call the component normally in your html and it ends up not opening on the whole screen, only in the context you placed it, so you end up having to place your drawer in index.html for it to open in the whole viewport or fill your css with position and z-index to create an overlapping context.

By using layers you can make this easier, but you also end up polluting your css document a bit. By using showModal() it opens the dialog element in that top-layer already with a separate context without any configuration required. If you use show() it doesn't call the dialog in that top-layer and you can have the normal behavior of the viewport.

The top layer is a “layer” that expands over the entire viewport and overlays all the layers created by you or your web browser. It helps a lot and avoids the infamous excessive prop drilling.

Okay, okay, but how do I style this element? It must be very difficult!

Not at all! It's as simple as centering a div... Maybe a bit more!

Dialog / Modals

EXPLORING HTML ELEMENTS: <DIALOG>

For more in-depth stylization I recommend you to see this video from Kevin Powell.

To style the dialog is simple just put id/class in the element and use CSS.

<main>
  <dialog>





<pre class="brush:php;toolbar:false">#dialog {
  border: none;
  width: 20rem;
  height: 20rem;
  border-radius: 1.69%; /* NICE! */
}

#dialog[open] {
  /* OMG! I know how to center a div */
  display: flex;
  justify-content: center;
  align-items: center;
}

As you can see above, I used #dialog[open] to modify the positioning of the elements. When you create a dialog it comes by default with the display disabled.

EXPLORING HTML ELEMENTS: <DIALOG>

This attribute is only added when you call one of the two functions.
So when styling any dialog element, always try to use the name of your class/id and the attribute to avoid display problems.
And as you can see above, the dialog already comes with a ::backdrop effect and it's also very simple to modify it.

EXPLORING HTML ELEMENTS: <DIALOG>

<main>
  <dialog>





<pre class="brush:php;toolbar:false">const dialog = document.getElementById('dialog');
const dialogButton = document.getElementById('dialogButton');

dialogButton.addEventListener('click', () => dialog.showModal());

Show! Super easy! But how do I close this modal? When I click on the backdrop nothing happens!

Let's go! By default the element doesn't come with this possibility. If you want to close the modal you have to call the function to close it using an internal button or something like that.

dialogButton.addEventListener('click', () => dialog.showModal());
dialogButton.addEventListener('click', () => dialog.show());

But if you want to replicate this effect of closing by clicking outside, you can use a simple function to identify the edges of the dialog element to know if you've clicked outside or not.

<main>
  <dialog>





<pre class="brush:php;toolbar:false">#dialog {
  border: none;
  width: 20rem;
  height: 20rem;
  border-radius: 1.69%; /* NICE! */
}

#dialog[open] {
  /* OMG! I know how to center a div */
  display: flex;
  justify-content: center;
  align-items: center;
}

The behavior looks like this:

EXPLORING HTML ELEMENTS: <DIALOG>

I recommend you to see the Popover API if this is what you want to do constantly.

Man, that's ugly! My library is already animated!

Don't worry about it! Let's add a simple fade-in animation.

#dialog[open]::backdrop {
  background: rgba(255, 0, 0, 60%);
}

EXPLORING HTML ELEMENTS: <DIALOG>

Adding the fade-out animation is a little more difficult because you don't have a way of identifying when the user is going to close the modal, so we'll have to make a change to our script file.

dialog.close();

Two significant things have been done:

  1. A new parameter has been added to determine the duration of the animation to close the modal (after some searching I found this video from Kevin Powell).

  2. I added an attribute called closing when the user clicks. It is removed using the time parameter mentioned above.

/** @type {HTMLDialogElement} */
const dialog = document.getElementById('dialog');

/**
 * Adds a close behavior to clicking outside dialog element
 * @param {HTMLDialogElement} dialogRef - The refer to element Dialog.
 * @example
 * const dialog = document.querySelector('#dialog');
 * closeDialogClickingOutside(dialog)
 */
 const closeByClickingOutside = (dialogRef) => {
  dialogRef.addEventListener('click', (ev) => {
    if (
      ev.offsetX  ev.target.offsetWidth ||
      ev.offsetY  ev.target.offsetHeight
    ) {
      dialogRef.close();
    }
  });
};

closeByClickingOutside(dialog);

EXPLORING HTML ELEMENTS: <DIALOG>

And there we have our fully animated dialog without any libraries!

That nice! But how did you make a drawer using this element?

Well, to achieve this we have to take the default styles of the dialog element and overwrite them...

Drawer

The drawer opens above the screen at full height. So let's make a new drawer element from scratch.

<main>
  <dialog>





<pre class="brush:php;toolbar:false">const dialog = document.getElementById('dialog');
const dialogButton = document.getElementById('dialogButton');

dialogButton.addEventListener('click', () => dialog.showModal());

It's important to note that to set the drawer to the full height of the screen you have to overwrite the dialog's default max-height!

dialogButton.addEventListener('click', () => dialog.showModal());
dialogButton.addEventListener('click', () => dialog.show());

EXPLORING HTML ELEMENTS: <DIALOG>

Now it's simple: just add the animations using the same function you created in the step-by-step dialog and you're done!

<main>
  <dialog>





<pre class="brush:php;toolbar:false">#dialog {
  border: none;
  width: 20rem;
  height: 20rem;
  border-radius: 1.69%; /* NICE! */
}

#dialog[open] {
  /* OMG! I know how to center a div */
  display: flex;
  justify-content: center;
  align-items: center;
}
#dialog[open]::backdrop {
  background: rgba(255, 0, 0, 60%);
}
<dialog>



<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173086397449699.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="EXPLORING HTML ELEMENTS: <DIALOG>"></p>

<h2>
  
  
  Thank you for reading
</h2>

<p>This is my first post here so thank you for reading and if I've helped in any way I recommend you follow me on linkedin my first language is Portuguese so most of my posts are in Portuguese but I am trying to post something in English too. I intend to post similar things from now on, if you have any recommendations on how to improve this modal and drawer strategy you can send them to me there.</p>


          

            
        </dialog>

The above is the detailed content of EXPLORING HTML ELEMENTS: . For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Related Article
JavaScript Comments: A Guide to Using // and /* */JavaScript Comments: A Guide to Using // and /* */May 13, 2025 pm 03:49 PM

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python vs. JavaScript: A Comparative Analysis for DevelopersPython vs. JavaScript: A Comparative Analysis for DevelopersMay 09, 2025 am 12:22 AM

The main difference between Python and JavaScript is the type system and application scenarios. 1. Python uses dynamic types, suitable for scientific computing and data analysis. 2. JavaScript adopts weak types and is widely used in front-end and full-stack development. The two have their own advantages in asynchronous programming and performance optimization, and should be decided according to project requirements when choosing.

Python vs. JavaScript: Choosing the Right Tool for the JobPython vs. JavaScript: Choosing the Right Tool for the JobMay 08, 2025 am 12:10 AM

Whether to choose Python or JavaScript depends on the project type: 1) Choose Python for data science and automation tasks; 2) Choose JavaScript for front-end and full-stack development. Python is favored for its powerful library in data processing and automation, while JavaScript is indispensable for its advantages in web interaction and full-stack development.

Python and JavaScript: Understanding the Strengths of EachPython and JavaScript: Understanding the Strengths of EachMay 06, 2025 am 12:15 AM

Python and JavaScript each have their own advantages, and the choice depends on project needs and personal preferences. 1. Python is easy to learn, with concise syntax, suitable for data science and back-end development, but has a slow execution speed. 2. JavaScript is everywhere in front-end development and has strong asynchronous programming capabilities. Node.js makes it suitable for full-stack development, but the syntax may be complex and error-prone.

JavaScript's Core: Is It Built on C or C  ?JavaScript's Core: Is It Built on C or C ?May 05, 2025 am 12:07 AM

JavaScriptisnotbuiltonCorC ;it'saninterpretedlanguagethatrunsonenginesoftenwritteninC .1)JavaScriptwasdesignedasalightweight,interpretedlanguageforwebbrowsers.2)EnginesevolvedfromsimpleinterpreterstoJITcompilers,typicallyinC ,improvingperformance.

JavaScript Applications: From Front-End to Back-EndJavaScript Applications: From Front-End to Back-EndMay 04, 2025 am 12:12 AM

JavaScript can be used for front-end and back-end development. The front-end enhances the user experience through DOM operations, and the back-end handles server tasks through Node.js. 1. Front-end example: Change the content of the web page text. 2. Backend example: Create a Node.js server.

Python vs. JavaScript: Which Language Should You Learn?Python vs. JavaScript: Which Language Should You Learn?May 03, 2025 am 12:10 AM

Choosing Python or JavaScript should be based on career development, learning curve and ecosystem: 1) Career development: Python is suitable for data science and back-end development, while JavaScript is suitable for front-end and full-stack development. 2) Learning curve: Python syntax is concise and suitable for beginners; JavaScript syntax is flexible. 3) Ecosystem: Python has rich scientific computing libraries, and JavaScript has a powerful front-end framework.

JavaScript Frameworks: Powering Modern Web DevelopmentJavaScript Frameworks: Powering Modern Web DevelopmentMay 02, 2025 am 12:04 AM

The power of the JavaScript framework lies in simplifying development, improving user experience and application performance. When choosing a framework, consider: 1. Project size and complexity, 2. Team experience, 3. Ecosystem and community support.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

SecLists

SecLists

SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use