Custom Notification Template with JS
Tags: html, css, javascript, webdev
Published: 2023-01-13 12:03:02

Hello everyone today I will be discussing how to create a custom notification mini-library with HTML, SASS and Javascript. Although its a very basic notification Example but you will get the overview of how you can manage and create your own complex notifications designs.

Let's get started...

# Features of This notification - 
* Responsiveness
* Has an animation on closing notification
* Easily Customizable heading, message and styling with the CSS class of yours
* Browser Support ( Not completely sure about this one but I didn't use any feature or property which will break the notification in other browsers).

# HTML - 
```html
<!-- Notification Container - All the nofications will go here-->
<div class="notification__container"></div>
<!-- Notification Container -->


<!-- Normal Components for the page -->
<button class="submit success">Toggle Success</button>
<button class="submit error">Toggle Error</button>
<button class="submit warning">Toggle Warning</button>
<button class="submit custom">Custom Notification</button>
```

* All you need is create a div with class "notification__container", it is the container which will hold all the notifications.
* 4 buttons to show the notifications of different types - 3 default stylings (success,error and warning) and 1 custom which will take the styling from the custom CSS class.


# SCSS - 
```scss
// Notification styles Start here
.notification {
  max-width: 400px;
  border-radius: 5px;
  display: flex;
  align-items: start;
  gap: 2rem;
  padding: 1rem 2rem;
  transition: all 0.5s linear;
  font-family:Sans-serif;

  // Styling for the main container, as i am following BEM,
  // it is nested inside the notification class
  &__container {
    position: fixed;
    height: 80vh;
    right: 0;
    display: flex;
    flex-direction: column;
    align-items: end;
    gap: 1rem;
    overflow: auto;
  }
  
  &__heading{
   font-weight:300;
  }

  // Delete button Styling
  .delete {
    cursor: pointer;
    border: none;
    background: transparent;
    font-size: 1.3rem;
    color: white;
  }

  // Main Message styling 
  &__description {
    margin-top: 1rem;
    font-size:0.9rem;
    word-wrap:break-word;
  }

  //   Modifiers for success,error and warning notification
  // These are default stylings for the notifications
  &--success {
    background-color: #17B169;
    color: white;
  }

  &--error {
    background-color: crimson;
    color: white;
  }
  
  &--warning {
    background-color: #FFC72C;
    color: white;
  }

  @media screen and (max-width: 500px) { 
    padding:0.5rem 0.75rem;
    max-width:200px;
    
    &__heading{
      font-size:1rem;
    }
    &__description{
      font-size:0.7rem;
    }
  }
}

.slideOut {
  border-radius:50%;
 transform:scale(0) rotate(720deg);
}
// Notification Styles end here
```
* Max width of the notification will be 400px and for mobile devices, it will be 200px.
* Notification container will be fixed on screen even on scroll.
* Description or Message section has word-wrap:break-word, it will wrap the word to a new line if it is bigger than the notification.
* 3 modifier Classes(--success,--error,--warning).
* slideOut is the animation class for the delete button.

# Javascript - 
```js
const miniNotification = ({ type, heading, message }) => {
  const notificationContainer = document.querySelector(
    ".notification__container"
  );
.
.

};
```
* There is a main function called "miniNotification" with 3 params namely type - Type of notification ( it will take the name of css class which will style the notification), heading - Title of the notification, message - message of the notification.
* Accessing the notification container using querySelector.

```js
.
.
const notificationTemplate = () => {
    const notificationTypes = ["success", "error", "warning"];

    const newNotification = document.createElement("div");

    if (notificationTypes.includes(type)) {
      newNotification.setAttribute(
        "class",
        `notification notification--${type}`
      );
    } else {
      newNotification.setAttribute("class", `notification ${type}`);
    }

    // Notification Template
    newNotification.innerHTML = `
    <div class="notification__text">
      <h2 class="notification__heading">
        ${heading}
      </h2>
      <p class="notification__description">
       ${message}
      </p>
    </div>
    <button class="delete">x</button>
  `;

    // Adding the notification to the container
    notificationContainer.appendChild(newNotification);
  };

  notificationTemplate();
.
.
```
* Creating an array which will have default notification types (success,error and warning)
* Checking if the type passed is matching any value in the array, if it is true then set the default styling of the matching value with prefix of "notification--", else set the custom class 
for the notification without any prefix.
* Then creating the html template with string interpolation (backtiks) and passing the heading and message their.
* At the end of this function, appending the new notification to the container.

```js
.
.
// Deleting the Notification
  notificationContainer.addEventListener("click", (e) => {
    const target = e.target;

    if (target.matches(".delete")) {
      const notification = target.closest(".notification");
      notification.classList.add("slideOut");

      setTimeout(() => {
        if (notificationContainer.contains(notification)) {
          notificationContainer.removeChild(notification);
        }
      }, 500);
    }
  });
}
``` 

* Event handled for the delete button, it will check whether the clicked button has a "delete" class name, if it matches then select the closest container with the "notification" class.(Which will be the notification inside which the button is present).
* Then add the "slideOut" class to the notification and using setTimeout, remove the notification from the DOM using removeChild() method after 500ms or .5s.

# CODEPEN - Entire code with documentation is here
{% codepen https://codepen.io/shubhamtiwari909/pen/XWBNEYv %}

THANK YOU FOR CHECKING THIS POST
You can contact me on -
Instagram - https://www.instagram.com/supremacism__shubh/
LinkedIn - https://www.linkedin.com/in/shubham-tiwari-b7544b193/
Email - shubhmtiwri00@gmail.com

^^You can help me with some donation at the link below Thank you👇👇 ^^
☕ --> https://www.buymeacoffee.com/waaduheck <--

Also check these posts as well
https://dev.to/shubhamtiwari909/css-iswherehas-and-not-2afd

https://dev.to/shubhamtiwari909/theme-changer-with-html-and-css-only-4144

https://dev.to/shubhamtiwari909/swiperjs-3802

https://dev.to/shubhamtiwari909/going-deep-in-array-sort-js-2n90