>웹 프론트엔드 >CSS 튜토리얼 >Abhi ki 뉴스 웹사이트 구축

Abhi ki 뉴스 웹사이트 구축

王林
王林원래의
2024-09-03 14:41:32526검색

Build a Abhi ki News Website

소개

안녕하세요, 개발자 여러분! 저의 최근 프로젝트인 Abhi ki News를 소개하게 되어 기쁩니다. 이 프로젝트는 깨끗하고 사용자 친화적인 인터페이스로 뉴스 기사를 가져오고 표시하도록 설계된 동적 뉴스 웹 사이트 구성 요소입니다. 이는 HTML, CSS 및 JavaScript를 사용하여 프런트엔드 개발 기술을 향상시키는 환상적인 방법이며 외부 API를 웹 애플리케이션에 통합하는 실용적인 예를 제공합니다.

프로젝트 개요

Abhi ki News는 사용자 입력 또는 사전 정의된 카테고리를 기반으로 뉴스 기사를 가져와 표시하는 웹 애플리케이션입니다. 이 구성 요소는 반응형 레이아웃을 갖춘 현대적인 디자인을 갖추고 있어 데스크톱과 모바일 장치 모두에 적합합니다. 이 프로젝트는 API에서 실시간 데이터를 가져와 매력적인 형식으로 제공하는 기능적인 뉴스 인터페이스를 만드는 방법을 보여줍니다.

특징

  • 동적 뉴스 가져오기: 사용자 쿼리 또는 사전 정의된 카테고리를 기반으로 외부 API에서 뉴스 기사를 검색하고 표시합니다.
  • 반응형 디자인: 뉴스 인터페이스가 모든 기기에서 시각적으로 매력적이도록 보장합니다.
  • 호버 효과: 미묘한 호버 효과로 뉴스 카드에 상호작용성을 추가합니다.
  • 검색 기능: 뉴스 기사를 키워드로 검색할 수 있습니다.

사용된 기술

  • HTML: 뉴스 인터페이스의 구조를 제공합니다.
  • CSS: 시각적으로 매력적이고 반응이 빠른 디자인을 만들기 위해 구성 요소의 스타일을 지정합니다.
  • JavaScript: 데이터 가져오기, 사용자 상호작용을 처리하고 콘텐츠를 동적으로 업데이트합니다.

프로젝트 구조

프로젝트 구조 개요는 다음과 같습니다.

Abhi-ki-News/
├── index.html
├── style.css
└── script.js
  • index.html: 뉴스 구성요소의 HTML 구조를 포함합니다.
  • style.css: CSS 스타일을 포함하여 매력적이고 반응이 빠른 디자인을 만듭니다.
  • script.js: 뉴스 기사를 가져오고 표시하는 논리를 처리합니다.

설치

프로젝트를 시작하려면 다음 단계를 따르세요.

  1. 저장소 복제:

    git clone https://github.com/abhishekgurjar-in/Abhi-ki-News.git
    
  2. 프로젝트 디렉토리 열기:

    cd Abhi-ki-News
    
  3. 프로젝트 실행:

    • 뉴스 인터페이스를 보려면 웹 브라우저에서 index.html 파일을 엽니다.

용법

  1. 웹 브라우저에서 애플리케이션을 엽니다.
  2. 카테고리를 클릭(예: IPL, 금융, 정치)하여 해당 카테고리와 관련된 뉴스 기사를 가져옵니다.
  3. 검색창을 사용하여 관련 키워드를 입력하여 뉴스 기사를 찾으세요.
  4. 뉴스 카드와 상호작용 마우스를 올리면 호버 효과를 볼 수 있습니다.

코드 설명

HTML

index.html 파일은 뉴스 인터페이스의 구조를 정의합니다. 다음은 일부 내용입니다.



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



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



CSS

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 통합 및 프런트엔드 개발에 대해 더 자세히 배우는 데 도움이 되기를 바랍니다. 필요에 따라 이 프로젝트를 자유롭게 수정하고 확장하세요!

크레딧

  • API 소스: 뉴스 API
  • 디자인 영감: 각종 뉴스 사이트

작가

아비셰크 구자르

위 내용은 Abhi ki 뉴스 웹사이트 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.