<div class="wrapper">
        <header>English Dictionary</header>
        <div class="search">
          <input type="text" placeholder="Search a word" required spellcheck="false">
          <i class="fas fa-search"></i>
          <span class="material-icons">close</span>
        </div>
        <p class="info-text">Type any existing word and press enter to get meaning, example, synonyms, etc.</p>
        <ul>
          <li class="word">
            <div class="details">
              <p>__</p>
              <span>_ _</span>
            </div>
            <i class="fas fa-volume-up"></i>
          </li>
          <div class="content">
            <li class="meaning">
              <div class="details">
                <p>Meaning</p>
                <span>___</span>
              </div>
            </li>
            <li class="example">
              <div class="details">
                <p>Example</p>
                <span>___</span>
              </div>
            </li>
            <li class="synonyms">
              <div class="details">
                <p>Synonyms</p>
                <div class="list"></div>
              </div>
            </li>
          </div>
        </ul>
      </div>
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: 'Poppins', sans-serif;
}

body {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  background: cyan;
}

::selection {
  color: #fff;
  background: cyan;
}

.wrapper {
  width: 420px;
  border-radius: 7px;
  background: #fff;
  padding: 25px 28px 45px;
  box-shadow: 7px 7px 20px rgba(0, 0, 0, 0.05);
}

.wrapper header {
  font-size: 28px;
  font-weight: 500;
  text-align: center;
}

.wrapper .search {
  position: relative;
  margin: 35px 0 18px;
}

.search input {
  height: 53px;
  width: 100%;
  outline: none;
  font-size: 16px;
  border-radius: 5px;
  padding: 0 42px;
  border: 1px solid #999;
}

.search input:focus {
  padding: 0 41px;
  border: 2px solid cyan;
}

.search input::placeholder {
  color: #B8B8B8;
}

.search :where(i, span) {
  position: absolute;
  top: 50%;
  color: #999;
  transform: translateY(-50%);
}

.search i {
  left: 18px;
  pointer-events: none;
  font-size: 16px;
}

.search input:focus~i {
  color: cyan;
}

.search span {
  right: 15px;
  cursor: pointer;
  font-size: 18px;
  display: none;
}

.search input:valid~span {
  display: block;
}

.wrapper .info-text {
  font-size: 13px;
  color: #9A9A9A;
  margin: -3px 0 -10px;
}

.wrapper.active .info-text {
  display: none;
}

.info-text span {
  font-weight: 500;
}

.wrapper ul {
  height: 0;
  opacity: 0;
  padding-right: 1px;
  overflow-y: hidden;
  transition: all 0.2s ease;
}

.wrapper.active ul {
  opacity: 1;
  height: 303px;
}

.wrapper ul li {
  display: flex;
  list-style: none;
  margin-bottom: 14px;
  align-items: center;
  padding-bottom: 17px;
  border-bottom: 1px solid #D9D9D9;
  justify-content: space-between;
}

ul li:last-child {
  margin-bottom: 0;
  border-bottom: 0;
  padding-bottom: 0;
}

ul .word p {
  font-size: 22px;
  font-weight: 500;
}

ul .word span {
  font-size: 12px;
  color: #989898;
}

ul .word i {
  color: #999;
  font-size: 15px;
  cursor: pointer;
}

ul .content {
  max-height: 215px;
  overflow-y: auto;
}

ul .content::-webkit-scrollbar {
  width: 0px;
}

.content li .details {
  padding-left: 10px;
  border-radius: 4px 0 0 4px;
  border-left: 3px solid cyan;
}

.content li p {
  font-size: 17px;
  font-weight: 500;
}

.content li span {
  font-size: 15px;
  color: #7E7E7E;
}

.content .synonyms .list {
  display: flex;
  flex-wrap: wrap;
}

.content .synonyms span {
  cursor: pointer;
  margin-right: 5px;
  text-decoration: underline;
}
const wrapper = document.querySelector(".wrapper"),
searchInput = wrapper.querySelector("input"),
volume = wrapper.querySelector(".word i"),
infoText = wrapper.querySelector(".info-text"),
synonyms = wrapper.querySelector(".synonyms .list"),
removeIcon = wrapper.querySelector(".search span");
let audio;

 

function data(result, word){
    if(result.title){
        infoText.innerHTML = `Can't find the meaning of <span>"${word}"</span>. Please, try to search for another word.`;
    }else{
        wrapper.classList.add("active");
        let definitions = result[0].meanings[0].definitions[0],
        phontetics = `${result[0].meanings[0].partOfSpeech}  /${result[0].phonetics[0].text}/`;
        document.querySelector(".word p").innerText = result[0].word;
        document.querySelector(".word span").innerText = phontetics;
        document.querySelector(".meaning span").innerText = definitions.definition;
        document.querySelector(".example span").innerText = definitions.example;
        audio = new Audio("https:" + result[0].phonetics[0].audio);

 

        if(definitions.synonyms[0] == undefined){
            synonyms.parentElement.style.display = "none";
        }else{
            synonyms.parentElement.style.display = "block";
            synonyms.innerHTML = "";
            for (let i = 0; i < 5; i++) {
                let tag = `<span onclick="search('${definitions.synonyms[i]}')">${definitions.synonyms[i]},</span>`;
                tag = i == 4 ? tag = `<span onclick="search('${definitions.synonyms[i]}')">${definitions.synonyms[4]}</span>` :
tag;
                synonyms.insertAdjacentHTML("beforeend", tag);
            }
        }
    }
}

 

function search(word){
    fetchApi(word);
    searchInput.value = word;
}

 

function fetchApi(word){
    wrapper.classList.remove("active");
    infoText.style.color = "#000";
    infoText.innerHTML = `Searching the meaning of <span>"${word}"</span>`;
    let url = `https://api.dictionaryapi.dev/api/v2/entries/en/${word}`;
    fetch(url).then(response => response.json()).then(result => data(result, word)).catch(() =>{
        infoText.innerHTML = `Can't find the meaning of <span>"${word}"</span>. Please, try to search for another word.`;
    });
}

 

searchInput.addEventListener("keyup", e =>{
    let word = e.target.value.replace(/s+/g, ' ');
    if(e.key == "Enter" && word){
        fetchApi(word);
    }
});

 

volume.addEventListener("click", ()=>{
    volume.style.color = "#4D59FB";
    audio.play();
    setTimeout(() =>{
        volume.style.color = "#999";
    }, 800);
});

 

removeIcon.addEventListener("click", ()=>{
    searchInput.value = "";
    searchInput.focus();
    wrapper.classList.remove("active");
    infoText.style.color = "#9A9A9A";
    infoText.innerHTML = "Type any existing word and press enter to get meaning, example, synonyms, etc.";
});

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.