English Dictionary Using HTML, CSS and Javacript


Code Preview:



HTML:

 <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>

CSS:

/* Import Google Font - Poppins */
 @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap');
 *{
   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: linear-gradient(90deg, rgba(0,6,36,1) 0%, rgba(9,11,121,1) 27%,
rgba(0,255,12,1) 100%);
 }
 ::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;
 }

JavaScript:

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.";
        });

Codepen:


See the Pen English Dictionary by Arth Jani (@AJBlogsTech) on CodePen.



Post a Comment

Previous Post Next Post
Best Programming Books

Facebook

AJ Facebook
Checkout Our Facebook Page
AJ Blogs
Checkout Our Instagram Page