안녕하세요, 개발자 여러분! 저의 최근 프로젝트인 Abhi ki News를 소개하게 되어 기쁩니다. 이 프로젝트는 깨끗하고 사용자 친화적인 인터페이스로 뉴스 기사를 가져오고 표시하도록 설계된 동적 뉴스 웹 사이트 구성 요소입니다. 이는 HTML, CSS 및 JavaScript를 사용하여 프런트엔드 개발 기술을 향상시키는 환상적인 방법이며 외부 API를 웹 애플리케이션에 통합하는 실용적인 예를 제공합니다.
Abhi ki News는 사용자 입력 또는 사전 정의된 카테고리를 기반으로 뉴스 기사를 가져와 표시하는 웹 애플리케이션입니다. 이 구성 요소는 반응형 레이아웃을 갖춘 현대적인 디자인을 갖추고 있어 데스크톱과 모바일 장치 모두에 적합합니다. 이 프로젝트는 API에서 실시간 데이터를 가져와 매력적인 형식으로 제공하는 기능적인 뉴스 인터페이스를 만드는 방법을 보여줍니다.
프로젝트 구조 개요는 다음과 같습니다.
Abhi-ki-News/ ├── index.html ├── style.css └── script.js
프로젝트를 시작하려면 다음 단계를 따르세요.
저장소 복제:
git clone https://github.com/abhishekgurjar-in/Abhi-ki-News.git
프로젝트 디렉토리 열기:
cd Abhi-ki-News
프로젝트 실행:
index.html 파일은 뉴스 인터페이스의 구조를 정의합니다. 다음은 일부 내용입니다.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Abhi ki News</title> <link rel="stylesheet" href="style.css"> </head> <body> <nav> <div class="main-nav container flex"> <a href="#" onclick="reload()" class="company-logo"> <img src="./assets/logo.png" alt="company logo"> </a> <div class="nav-links"> <ul class="flex"> <li class="hover-link nav-item" id="ipl" onclick="onNavItemClick('ipl')">IPL</li> <li class="hover-link nav-item" id="finance" onclick="onNavItemClick('finance')">Finance</li> <li class="hover-link nav-item" id="politics" onclick="onNavItemClick('politics')">Politics</li> </ul> </div> <div class="search-bar flex"> <input id="search-text" type="text" class="news-input" placeholder="e.g. Science"> <button id="search-button" class="search-button">Search</button> </div> </div> </nav> <main> <div id="loader" class="loader">Loading...</div> <div id="error-message" class="error-message"></div> <div class="cards-container container flex" id="cards-container"> </div> </main> <template id="template-news-card"> <div class="card"> <div class="card-header"> <img src="https://via.placeholder.com/400x200" alt="Abhi ki 뉴스 웹사이트 구축" id="news-img"> </div> <div class="card-content"> <h3 id="news-title">This is the Title</h3> <h6 class="news-source" id="news-source">End Gadget 26/08/2023</h6> <p class="news-desc" id="news-desc">Lorem, ipsum dolor sit amet consectetur adipisicing elit. Recusandae saepe quis voluptatum quisquam vitae doloremque facilis molestias quae ratione cumque!</p> </div> </div> </template> <script src="script.js"></script> </body> </html>
style.css 파일은 뉴스 인터페이스의 스타일을 시각적으로 매력적이고 반응성이 뛰어나도록 만듭니다. 다음은 몇 가지 주요 스타일입니다.
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@500&family=Roboto:wght@500&display=swap"); * { padding: 0; margin: 0; box-sizing: border-box; } :root { --primary-text-color: #183b56; --secondary-text-color: #577592; --accent-color: #2294ed; --accent-color-dark: #1d69a3; } body { font-family: "Poppins", sans-serif; color: var(--primary-text-color); } p { font-family: "Roboto", sans-serif; color: var(--secondary-text-color); line-height: 1.4rem; } a { text-decoration: none; } ul { list-style: none; } .flex { display: flex; align-items: center; } .container { max-width: 1180px; margin-inline: auto; overflow: hidden; } nav { background-color: #f3faff; box-shadow: 0 0 4px #bbd0e2; position: fixed; top: 0; z-index: 99; left: 0; right: 0; } .main-nav { justify-content: space-between; padding-block: 8px; } .company-logo img { width: 120px; height: 120px; } .nav-links ul { gap: 16px; } .hover-link { cursor: pointer; } .hover-link:hover { color: var(--secondary-text-color); } .hover-link:active { color: red; } .nav-item.active { color: var(--accent-color); } .search-bar { height: 32px; gap: 8px; } .news-input { width: 200px; height: 100%; padding-inline: 12px; border-radius: 4px; border: 2px solid #bbd0e2; font-family: "Roboto", sans-serif; } .search-button { background-color: var(--accent-color); color: white; padding: 8px 24px; border: none; border-radius: 4px; cursor: pointer; font-family: "Roboto", sans-serif; } .search-button:hover { background-color: var(--accent-color-dark); } main { padding-block: 20px; margin-top: 80px; } .cards-container { justify-content: space-between; flex-wrap: wrap; row-gap: 20px; align-items: start; } .card { width: 360px; min-height: 400px; box-shadow: 0 0 4px #d4ecff; border-radius: 4px; cursor: pointer; background-color: #fff; overflow: hidden; transition: all 0.3s ease; } .card:hover { box-shadow: 1px 1px 8px #d4ecff; background-color: #f9fdff; transform: translateY(-2px); } .card-header img { width: 100%; height: 180px; object-fit: cover; } .card-content { padding: 12px; } .news-source { margin-block: 12px; } /* Loader styles */ .loader { display: none; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 1.5rem; color: var(--primary-text-color); } /* Error message styles */ .error-message { color: red; font-size: 1.2rem; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); }
script.js 파일은 데이터 가져오기를 처리하고 뉴스 카드를 동적으로 업데이트합니다. 코드는 다음과 같습니다.
const API_KEY = "1d3a0eefa97b499d8fbc4ee93eeb40b7"; const url = "https://newsapi.org/v2/everything?q="; window.addEventListener("load", () => fetchNews("India")); function reload() { window.location.reload(); } async function fetchNews(query) { // Show loader before making the API request showLoader(true); try { const res = await fetch(`${url}${query}&apiKey=${API_KEY}`); if (!res.ok) throw new Error("Network response was not ok"); const data = await res.json(); if (data.articles.length === 0) { showError("No news articles found."); } else { bindData(data.articles); } } catch (error) { showError("Failed to fetch news. Please try again later."); } finally { // Hide loader after the API request completes showLoader(false); } } function bindData(articles) { const cardsContainer = document.getElementById("cards-container"); const newsCardTemplate = document.getElementById("template-news-card"); cardsContainer.innerHTML = ""; articles.forEach((article) => { if (!article.urlToImage) return; const cardClone = newsCardTemplate.content.cloneNode(true); fillDataInCard(cardClone, article); cardsContainer.appendChild(cardClone); }); } function fillDataInCard(cardClone, article) { const newsImg = cardClone.querySelector("#news-img"); const newsTitle = cardClone.querySelector("#news-title"); const newsSource = cardClone.querySelector("#news-source"); const newsDesc = cardClone.querySelector("#news-desc"); newsImg.src = article.urlToImage; newsTitle.innerHTML = article.title; newsDesc.innerHTML = article.description; const date = new Date(article.publishedAt).toLocaleString("en-US", { timeZone: "Asia/Jakarta", }); newsSource.innerHTML = `${article.source.name} · ${date}`; cardClone.firstElementChild.addEventListener("click", () => { window.open(article.url, "_blank"); }); } let curSelectedNav = null; function onNavItemClick(id) { fetchNews(id); const navItem = document.getElementById(id); curSelectedNav?.classList.remove("active"); curSelectedNav = navItem; curSelectedNav.classList.add("active"); } const searchButton = document.getElementById("search-button"); const searchText = document.getElementById("search-text"); searchButton.addEventListener("click", () => { const query = searchText.value; if (!query) return; fetchNews(query); curSelectedNav?.classList.remove("active"); curSelectedNav = null; }); function showLoader(isVisible) { const loader = document.getElementById("loader"); if (isVisible) { loader.style.display = "block"; } else { loader.style.display = "none"; } } function showError(message) { const cardsContainer = document.getElementById("cards-container"); cardsContainer.innerHTML = `<div class="error-message">${message}</div>`; }
여기에서 프로젝트의 라이브 데모를 탐색할 수 있습니다.
Abhi ki News는 외부 API를 웹 애플리케이션에 통합하고 응답성이 뛰어나고 사용자 친화적인 뉴스 인터페이스를 만드는 실제 예입니다. 이 프로젝트가 API 통합 및 프런트엔드 개발에 대해 더 자세히 배우는 데 도움이 되기를 바랍니다. 필요에 따라 이 프로젝트를 자유롭게 수정하고 확장하세요!
아비셰크 구자르
위 내용은 Abhi ki 뉴스 웹사이트 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!