Top 10 FIFA Player Ratings 2025

Sports LiveJun 12, 2026
Top 10 FIFA Player Ratings 2025
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- ===== SEO META TAGS ===== --> <title>Top 10 FIFA Player Ratings 2025 — Who Deserves #1? | SportsLNV</title> <meta name="description" content=" Complete FIFA 26 player ratings list 2025. Find out who got the highest rating, who was snubbed, and what changed this year. Mbappe, Haaland, Vinicius Jr. and more. Updated weekly."> <meta name="keywords" content="FIFA 26 player ratings, FIFA 26 best players, Mbappe FIFA rating, Haaland FIFA 26, top rated FIFA players 2025, FIFA 26 OVR list"> <meta name="author" content="SportsLNV"> <meta name="robots" content="index, follow"> <link rel="canonical" href="https://sportslnv.com/fifa/top-10-player-ratings-2025/"> <!-- Open Graph (Facebook/WhatsApp sharing) --> <meta property="og:type" content="article"> <meta property="og:title" content="Top 10 FIFA Player Ratings 2025 — Who Deserves #1?"> <meta property="og:description" content="FIFA 26 full player ratings revealed. Mbappe 99 OVR leads the pack — see who else made the top 10 and who got snubbed."> <meta property="og:url" content="https://sportslnv.com/fifa/top-10-player-ratings-2025/"> <meta property="og:site_name" content="SportsLNV"> <meta property="article:published_time" content="2025-06-12T08:00:00Z"> <meta property="article:modified_time" content="2025-06-12T10:00:00Z"> <meta property="article:section" content="FIFA"> <meta property=" article: tag" content=" FIFA 26, Player Ratings, FUT, Mbappe"> <!-- Twitter Card --> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:site" content="@SportsLNV"> <meta name="twitter:title" content="Top 10 FIFA Player Ratings 2025 — Who Deserves #1?"> <meta name="twitter:description" content="FIFA 26 full player ratings revealed. See the complete top 10 list with changes from FIFA 25."> <!-- ===== JSON-LD SCHEMA (Google Rich Results) ===== --> <script type="application/ld+json"> { "@context": "https://schema.org", "@graph": [ { "@type": "Article", "headline": "Top 10 FIFA Player Ratings 2025 — Who Deserves #1?", "description": "Complete FIFA 26 player ratings list 2025. Find out who got the highest rating, who was snubbed, and what changed this year.", "author": { "@type": "Organization", "name": "SportsLNV" }, "publisher": { "@type": "Organization", "name": "SportsLNV", "logo": { "@type": "ImageObject", "url": "https://sportslnv.com/logo.png" } }, "datePublished": "2025-06-12", "dateModified": "2025-06-12", "mainEntityOfPage": "https://sportslnv.com/fifa/top-10-player-ratings-2025/" }, { "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "Who has the highest FIFA 26 rating?", "acceptedAnswer": { "@type": "Answer", "text": "Kylian Mbappe holds the highest FIFA 26 rating with 99 OVR, making him the cover star and top-rated player in the game." } }, { "@type": "Question", "name": "What is Haaland's FIFA 26 rating?", "acceptedAnswer": { "@type": "Answer", "text": "Erling Haaland is rated 97 OVR in FIFA 26, keeping him as the #2 rated player behind Mbappe." } }, { "@type": "Question", "name": "Has Vinicius Jr. been upgraded in FIFA 26?", "acceptedAnswer": { "@type": "Answer", "text": "Yes! Vinicius Jr. received a +2 upgrade to 96 OVR in FIFA 26 after his exceptional 2024–25 La Liga season." } }, { "@type": "Question", "name": "When does FIFA 26 release?", "acceptedAnswer": { "@type": "Answer", "text": "FIFA 26 (EA Sports FC 26) is expected to release in September 2025 on PS5, Xbox Series X, and PC." } } ] }, { "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://sportslnv.com/" }, { "@type": "ListItem", "position": 2, "name": "FIFA", "item": "https://sportslnv.com/fifa/" }, { "@type": "ListItem", "position": 3, "name": "Player Ratings", "item": "https://sportslnv.com/fifa/player-ratings/" }, { "@type": "ListItem", "position": 4, "name": "Top 10 FIFA Ratings 2025", "item": "https://sportslnv.com/fifa/top-10-player-ratings-2025/" } ] } ] } </script> <!-- Three.js CDN --> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> <style> /* ============================================================ DESIGN TOKENS ============================================================ */ :root { --dark: #09111f; --dark2: #0d1628; --card: #111e32; --card2: #16243a; --border: rgba(255,255,255,0.07); --border2: rgba(255,255,255,0.13); --text: #dde4f0; --muted: #7a8caa; --green: #00d46a; --gold: #ffd040; --red: #ff3d57; --blue: #3d9eff; --white: #ffffff; } /* ============================================================ RESET & BASE ============================================================ */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { scroll-behavior: smooth; } body { background: var(--dark); color: var(--text); font-family: 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Helvetica Neue', sans-serif; font-size: 15px; line-height: 1.65; min-height: 100vh; } a { color: var(--green); text-decoration: none; } a:hover { text-decoration: underline; } img { max-width: 100%; } /* ============================================================ READING PROGRESS BAR ============================================================ */ #readProgress { position: fixed; top: 0; left: 0; height: 3px; width: 0%; background: linear-gradient(90deg, var(--green), var(--blue)); z-index: 200; transition: width 0.1s linear; } /* ============================================================ NAVIGATION ============================================================ */ header { position: sticky; top: 0; z-index: 100; background: rgba(9,17,31,0.97); backdrop-filter: blur(10px); border-bottom: 1px solid var(--border); } nav { max-width: 1280px; margin: 0 auto; padding: 0 20px; height: 54px; display: flex; align-items: center; justify-content: space-between; gap: 16px; } .logo { font-size: 22px; font-weight: 800; color: var(--green); letter-spacing: -1px; white-space: nowrap; } .logo span { color: var(--white); } .nav-links { display: flex; gap: 4px; flex: 1; justify-content: center; } .nav-links a { color: var(--muted); font-size: 13px; font-weight: 500; padding: 6px 12px; border-radius: 6px; transition: all 0.18s; white-space: nowrap; } .nav-links a:hover, .nav-links a.active { color: var(--white); background: rgba(255,255,255,0.06); text-decoration: none; } .nav-right { display: flex; align-items: center; gap: 12px; } .live-indicator { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 700; color: var(--green); background: rgba(0,212,106,0.1); border: 1px solid rgba(0,212,106,0.25); padding: 5px 11px; border-radius: 20px; } .live-dot { width: 7px; height: 7px; background: var(--green); border-radius: 50%; animation: livePulse 1.4s ease-in-out infinite; } @keyframes livePulse { 0%,100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.4; transform: scale(1.5); } } /* ============================================================ LIVE SCORES TICKER ============================================================ */ .ticker-bar { background: var(--dark2); border-bottom: 1px solid var(--border); height: 38px; display: flex; align-items: center; overflow: hidden; } .ticker-label { background: var(--green); color: #000; font-size: 11px; font-weight: 800; letter-spacing: 0.8px; padding: 0 14px; height: 100%; display: flex; align-items: center; white-space: nowrap; flex-shrink: 0; text-transform: uppercase; } .ticker-overflow { overflow: hidden; flex: 1; height: 100%; display: flex; align-items: center; } .ticker-track { display: flex; animation: tickerScroll 35s linear infinite; white-space: nowrap; } .ticker-track:hover { animation-play-state: paused; } .ticker-item { display: inline-flex; align-items: center; gap: 8px; padding: 0 32px; font-size: 12.5px; color: var(--text); } .ticker-score { font-weight: 800; font-size: 13px; color: var(--gold); } .ticker-live { background: var(--red); color: #fff; font-size: 9px; font-weight: 800; padding: 2px 5px; border-radius: 3px; letter-spacing: 0.3px; } .ticker-ft { font-size: 10px; color: var(--muted); font-style: italic; } @keyframes tickerScroll { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } } /* ============================================================ PAGE LAYOUT ============================================================ */ .page-wrap { max-width: 1280px; margin: 0 auto; padding: 0 20px; display: grid; grid-template-columns: 1fr 340px; gap: 24px; align-items: start; padding-top: 28px; padding-bottom: 40px; } /* ============================================================ MAIN ARTICLE COLUMN ============================================================ */ .article-col {} /* SEO Schema badge */ .seo-notice { display: flex; align-items: center; gap: 8px; background: rgba(0,212,106,0.06); border: 1px solid rgba(0,212,106,0.18); border-radius: 8px; padding: 8px 14px; font-size: 12px; color: var(--muted); margin-bottom: 16px; } .seo-notice strong { color: var(--green); } /* Breadcrumb */ .breadcrumb { display: flex; align-items: center; gap: 6px; font-size: 12.5px; color: var(--muted); margin-bottom: 14px; flex-wrap: wrap; } .breadcrumb a { color: var(--green); } .breadcrumb a:hover { color: var(--white); text-decoration: none; } .breadcrumb .sep { color: var(--border2); } /* Article category eyebrow */ .article-eyebrow { font-size: 11px; font-weight: 700; letter-spacing: 1.2px; text-transform: uppercase; color: var(--green); margin-bottom: 10px; } /* H1 */ h1.article-h1 { font-size: 30px; font-weight: 800; line-height: 1.2; color: var(--white); margin-bottom: 14px; letter-spacing: -0.5px; } h1.article-h1 em { color: var(--gold); font-style: normal; } /* Meta row */ .article-meta { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 16px; padding-bottom: 16px; border-bottom: 1px solid var(--border); } .author-chip { display: flex; align-items: center; gap: 8px; } .author-avatar { width: 30px; height: 30px; border-radius: 50%; background: var(--green); color: #000; font-size: 12px; font-weight: 800; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .author-name { font-size: 13px; color: var(--text); font-weight: 600; } .meta-chip { font-size: 12px; color: var(--muted); display: flex; align-items: center; gap: 4px; } .meta-chip.updated { color: var(--green); font-weight: 600; } /* Share buttons */ .share-row { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 18px; } .share-btn { display: inline-flex; align-items: center; gap: 5px; padding: 7px 14px; border-radius: 20px; border: 1px solid var(--border2); background: transparent; color: var(--text); font-size: 12px; cursor: pointer; transition: all 0.18s; } .share-btn:hover { border-color: var(--green); color: var(--green); } .share-btn.tw:hover { border-color: #1da1f2; color: #1da1f2; } .share-btn.fb:hover { border-color: #1877f2; color: #1877f2; } .share-btn.wa:hover { border-color: #25d366; color: #25d366; } .share-btn.rd:hover { border-color: #ff4500; color: #ff4500; } /* ============================================================ 3D FEATURED IMAGE AREA ============================================================ */ .featured-media { border-radius: 12px; overflow: hidden; margin-bottom: 20px; position: relative; background: linear-gradient(135deg, #0a1628 0%, #0d2040 60%, #071428 100%); border: 1px solid var(--border2); } #pitchCanvas { display: block; width: 100% !important; height: 220px !important; } .canvas-overlay-label { position: absolute; top: 10px; left: 12px; background: rgba(0,0,0,0.6); color: rgba(255,255,255,0.7); font-size: 11px; font-weight: 600; padding: 4px 10px; border-radius: 6px; pointer-events: none; } .img-caption-bar { position: absolute; bottom: 0; left: 0; right: 0; background: rgba(0,0,0,0.7); padding: 7px 14px; font-size: 11px; color: var(--muted); font-style: italic; } /* ============================================================ ARTICLE BODY TYPOGRAPHY ============================================================ */ .intro-block { background: rgba(0,212,106,0.05); border-left: 3px solid var(--green); border-radius: 0 8px 8px 0; padding: 14px 16px; font-size: 15.5px; line-height: 1.75; color: var(--text); margin-bottom: 22px; } .intro-block strong { color: var(--white); } .article-body p { color: var(--muted); font-size: 14.5px; line-height: 1.8; margin-bottom: 14px; } .article-body p strong { color: var(--text); } h2.section-h2 { font-size: 21px; font-weight: 700; color: var(--white); margin: 26px 0 12px; padding-bottom: 8px; border-bottom: 1px solid var(--border); } h3.section-h3 { font-size: 16px; font-weight: 600; color: var(--text); margin: 16px 0 6px; } /* ============================================================ RATINGS TABLE ============================================================ */ .table-wrap { overflow-x: auto; border-radius: 10px; border: 1px solid var(--border); margin-bottom: 22px; } table.ratings-tbl { width: 100%; border-collapse: collapse; font-size: 13px; } table.ratings-tbl thead tr { background: #0d1a2e; } table.ratings-tbl thead th { padding: 10px 12px; text-align: left; font-size: 10.5px; font-weight: 700; letter-spacing: 0.6px; text-transform: uppercase; color: var(--muted); white-space: nowrap; border-bottom: 1px solid var(--border); } table.ratings-tbl tbody tr { border-bottom: 1px solid rgba(255,255,255,0.04); transition: background 0.15s; cursor: pointer; } table.ratings-tbl tbody tr:last-child { border-bottom: none; } table.ratings-tbl tbody tr:hover { background: rgba(0,212,106,0.05); } table.ratings-tbl td { padding: 10px 12px; vertical-align: middle; } .rank-cell { font-size: 14px; font-weight: 800; width: 36px; } .rank-gold { color: var(--gold); } .rank-silver { color: #c0c0c0; } .rank-bronze { color: #cd7f32; } .rank-other { color: var(--muted); } .player-info { display: flex; align-items: center; gap: 9px; } .flag-emoji { font-size: 18px; line-height: 1; } .player-name-cell { font-weight: 700; color: var(--white); font-size: 13.5px; } .player-club-cell { font-size: 11px; color: var(--muted); } .club-cell { font-size: 12px; color: var(--muted); white-space: nowrap; } .pos-badge { display: inline-block; font-size: 10px; font-weight: 700; padding: 2px 7px; border-radius: 4px; letter-spacing: 0.3px; } .pos-fw { background: rgba(255,61,87,0.18); color: #ff7085; } .pos-mf { background: rgba(0,212,106,0.18); color: #00d46a; } .pos-df { background: rgba(61,158,255,0.18); color: #5ab4ff; } .pos-gk { background: rgba(255,208,64,0.18); color: var(--gold); } .ovr-badge { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 8px; font-size: 16px; font-weight: 900; } .ovr-gold { background: rgba(255,208,64,0.14); color: var(--gold); } .ovr-green { background: rgba(0,212,106,0.14); color: var(--green); } .ovr-blue { background: rgba(61,158,255,0.14); color: var(--blue); } .change-up { color: var(--green); font-size: 12px; font-weight: 700; } .change-down { color: var(--red); font-size: 12px; font-weight: 700; } .change-eq { color: var(--muted); font-size: 12px; } /* ============================================================ STAT BARS (player breakdown) ============================================================ */ .stat-bars { margin: 12px 0 20px; } .stat-row { display: flex; align-items: center; gap: 10px; margin-bottom: 7px; } .stat-label-cell { font-size: 12px; color: var(--muted); width: 80px; flex-shrink: 0; } .stat-bar-bg { flex: 1; height: 6px; background: rgba(255,255,255,0.08); border-radius: 3px; overflow: hidden; } .stat-bar-fill { height: 100%; border-radius: 3px; background: var(--green); transition: width 1s ease; } .stat-val { font-size: 12px; font-weight: 700; color: var(--white); width: 28px; text-align: right; flex-shrink: 0; } /* ============================================================ INFO BOX / CALLOUT ============================================================ */ .info-callout { background: rgba(61,158,255,0.07); border: 1px solid rgba(61,158,255,0.2); border-radius: 10px; padding: 14px 16px; font-size: 13.5px; color: var(--text); margin-bottom: 20px; line-height: 1.7; } .info-callout .callout-title { font-size: 13px; font-weight: 700; color: var(--blue); margin-bottom: 6px; } /* ============================================================ FAQ ACCORDION ============================================================ */ .faq-wrap { border: 1px solid var(--border); border-radius: 10px; overflow: hidden; margin-bottom: 24px; } .faq-item { border-bottom: 1px solid var(--border); } .faq-item:last-child { border-bottom: none; } .faq-question { width: 100%; background: none; border: none; text-align: left; padding: 14px 16px; font-size: 14px; font-weight: 600; color: var(--white); cursor: pointer; display: flex; justify-content: space-between; align-items: center; gap: 12px; transition: background 0.15s; } .faq-question:hover { background: rgba(255,255,255,0.03); } .faq-arrow { color: var(--green); font-size: 18px; flex-shrink: 0; transition: transform 0.22s; line-height: 1; } .faq-question.open .faq-arrow { transform: rotate(180deg); } .faq-answer { display: none; padding: 2px 16px 14px; font-size: 13.5px; color: var(--muted); line-height: 1.75; } .faq-answer.show { display: block; } /* ============================================================ TAGS ============================================================ */ .tags-section { margin-bottom: 24px; } .tags-section h3 { font-size: 13px; font-weight: 700; color: var(--muted); margin-bottom: 9px; text-transform: uppercase; letter-spacing: 0.6px; } .tags-wrap { display: flex; flex-wrap: wrap; gap: 7px; } .tag-chip { display: inline-block; padding: 5px 12px; border-radius: 20px; font-size: 12px; background: rgba(255,255,255,0.05); border: 1px solid var(--border2); color: var(--muted); cursor: pointer; transition: all 0.18s; text-decoration: none; } .tag-chip:hover { background: rgba(0,212,106,0.1); color: var(--green); border-color: rgba(0,212,106,0.35); text-decoration: none; } /* ============================================================ RELATED ARTICLES ============================================================ */ .related-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 32px; } .related-card { background: var(--card); border: 1px solid var(--border); border-radius: 10px; padding: 13px 14px; cursor: pointer; transition: border-color 0.2s, transform 0.18s; } .related-card:hover { border-color: rgba(0,212,106,0.3); transform: translateY(-1px); } .related-cat { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.6px; color: var(--green); margin-bottom: 5px; } .related-title { font-size: 13px; font-weight: 600; color: var(--text); line-height: 1.45; } /* ============================================================ SIDEBAR ============================================================ */ .sidebar-col { position: sticky; top: 80px; } .sidebar-panel { background: var(--dark2); border: 1px solid var(--border); border-radius: 12px; overflow: hidden; margin-bottom: 16px; } .panel-head { padding: 12px 16px; border-bottom: 1px solid var(--border); display: flex; justify-content: space-between; align-items: center; } .panel-title { font-size: 13px; font-weight: 700; color: var(--white); } .panel-badge { font-size: 10px; font-weight: 700; padding: 3px 8px; border-radius: 10px; letter-spacing: 0.3px; } .badge-live { background: var(--green); color: #000; } .badge-ai { background: rgba(61,158,255,0.18); color: var(--blue); border: 1px solid rgba(61,158,255,0.3); } /* Live scores list */ .scores-list { max-height: 340px; overflow-y: auto; } .scores-list::-webkit-scrollbar { width: 3px; } .scores-list::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 2px; } .score-row { padding: 10px 16px; border-bottom: 1px solid var(--border); cursor: pointer; transition: background 0.15s; } .score-row:last-child { border-bottom: none; } .score-row:hover { background: rgba(255,255,255,0.03); } .score-league-lbl { font-size: 10px; font-weight: 700; color: var(--muted); letter-spacing: 0.5px; text-transform: uppercase; margin-bottom: 6px; } .score-match { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 8px; } .score-team-name { font-size: 13px; font-weight: 600; color: var(--white); } .score-team-name.right { text-align: right; } .score-box { background: var(--card); border: 1px solid var(--border2); border-radius: 6px; padding: 4px 10px; font-size: 15px; font-weight: 900; color: var(--white); text-align: center; white-space: nowrap; } .score-box.live-score { color: var(--green); border-color: rgba(0,212,106,0.3); } .score-minute { text-align: center; font-size: 10.5px; margin-top: 5px; } .score-minute.is-live { color: var(--green); font-weight: 700; } .score-minute.is-ft { color: var(--muted); font-style: italic; } /* ============================================================ AI CHAT ASSISTANT ============================================================ */ .chat-wrap { display: flex; flex-direction: column; height: 370px; } .chat-messages { flex: 1; overflow-y: auto; padding: 12px; display: flex; flex-direction: column; gap: 9px; } .chat-messages::-webkit-scrollbar { width: 3px; } .chat-messages::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 2px; } .chat-msg { max-width: 88%; font-size: 12.5px; line-height: 1.55; border-radius: 12px; padding: 9px 12px; } .chat-msg.bot { background: var(--card2); color: var(--text); border-bottom-left-radius: 3px; align-self: flex-start; } .chat-msg.bot strong { color: var(--green); } .chat-msg.user { background: rgba(0,212,106,0.16); color: var(--white); border-bottom-right-radius: 3px; align-self: flex-end; } .typing-wrap { align-self: flex-start; background: var(--card2); border-radius: 12px; border-bottom-left-radius: 3px; padding: 10px 14px; display: flex; gap: 4px; align-items: center; } .typing-dot { width: 6px; height: 6px; background: var(--muted); border-radius: 50%; animation: typeBounce 0.9s ease-in-out infinite; } .typing-dot:nth-child(2) { animation-delay: 0.15s; } .typing-dot:nth-child(3) { animation-delay: 0.3s; } @keyframes typeBounce { 0%,100% { transform: translateY(0); opacity: 0.5; } 50% { transform: translateY(-5px); opacity: 1; } } .chat-quick-btns { padding: 6px 12px; display: flex; gap: 5px; flex-wrap: wrap; border-top: 1px solid var(--border); } .quick-btn { font-size: 10.5px; padding: 4px 9px; border-radius: 14px; background: rgba(255,255,255,0.05); border: 1px solid var(--border2); color: var(--muted); cursor: pointer; transition: all 0.15s; white-space: nowrap; } .quick-btn:hover { background: rgba(0,212,106,0.1); color: var(--green); border-color: rgba(0,212,106,0.3); } .chat-input-area { padding: 9px 12px; border-top: 1px solid var(--border); display: flex; gap: 8px; align-items: center; } .chat-text-input { flex: 1; background: var(--card); border: 1px solid var(--border2); border-radius: 20px; padding: 8px 14px; color: var(--text); font-size: 12.5px; outline: none; transition: border-color 0.18s; } .chat-text-input::placeholder { color: var(--muted); } .chat-text-input:focus { border-color: rgba(0,212,106,0.45); } .chat-send-btn { width: 34px; height: 34px; border-radius: 50%; background: var(--green); color: #000; border: none; cursor: pointer; font-size: 15px; font-weight: 800; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: transform 0.15s, background 0.15s; } .chat-send-btn:hover { transform: scale(1.08); background: #00f07a; } /* ============================================================ SCROLL TO TOP BUTTON ============================================================ */ #scrollTopBtn { position: fixed; bottom: 24px; right: 20px; width: 40px; height: 40px; background: var(--green); color: #000; border: none; border-radius: 50%; font-size: 18px; font-weight: 800; cursor: pointer; box-shadow: 0 4px 14px rgba(0,212,106,0.35); z-index: 90; transition: transform 0.15s, opacity 0.3s; opacity: 0; pointer-events: none; } #scrollTopBtn.show { opacity: 1; pointer-events: auto; } #scrollTopBtn:hover { transform: scale(1.1); } /* ============================================================ FOOTER ============================================================ */ footer { background: var(--dark2); border-top: 1px solid var(--border); padding: 28px 20px; text-align: center; font-size: 12.5px; color: var(--muted); } footer strong { color: var(--green); } footer .footer-links { display: flex; justify-content: center; gap: 20px; flex-wrap: wrap; margin-top: 10px; } footer .footer-links a { color: var(--muted); font-size: 12px; } footer .footer-links a:hover { color: var(--green); text-decoration: none; } /* ============================================================ RESPONSIVE ============================================================ */ @media (max-width: 900px) { .page-wrap { grid-template-columns: 1fr; } .sidebar-col { position: static; } h1.article-h1 { font-size: 23px; } .related-grid { grid-template-columns: 1fr; } .nav-links { display: none; } } @media (max-width: 560px) { .share-row .share-btn span { display: none; } table.ratings-tbl .club-cell { display: none; } } </style> </head> <body> <!-- ===== READING PROGRESS ===== --> <div id="readProgress"></div> <!-- ===== HEADER / NAV ===== --> <header> <nav> <div class="logo">Sports<span>LNV</span></div> <div class="nav-links"> <a href="#" class="active">FIFA</a> <a href="#">World Cup 2026</a> <a href="#">FUT Guide</a> <a href="#">Live Scores</a> <a href="#">Rankings</a> <a href="#">News</a> </div> <div class="nav-right"> <div class="live-indicator"> <span class="live-dot"></span> 7 Live Now </div> </div> </nav> </header> <!-- ===== LIVE SCORES TICKER ===== --> <div class="ticker-bar" aria-label="Live match scores ticker"> <div class="ticker-label">⚽ LIVE SCORES</div> <div class="ticker-overflow"> <div class="ticker-track" id="tickerTrack"> <!-- JS fills this --> </div> </div> </div> <!-- ===== MAIN PAGE ===== --> <div class="page-wrap"> <!-- ===== ARTICLE COLUMN ===== --> <main class="article-col" id="articleMain"> <!-- SEO SCHEMA NOTICE --> <div class="seo-notice"> <span>✅</span> <div><strong>SEO Active:</strong> Article Schema + FAQPage Schema + BreadcrumbList — Google Featured Snippet & Rich Results enabled</div> </div> <!-- BREADCRUMB (also in JSON-LD above) --> <nav class="breadcrumb" aria-label="Breadcrumb"> <a href="#">Home</a><span class="sep">›</span> <a href="#">FIFA</a><span class="sep">›</span> <a href="#">Player Ratings</a><span class="sep">›</span> <span>Top 10 FIFA Ratings 2025</span> </nav> <!-- ARTICLE HEADER --> <div class="article-eyebrow">⚽ FIFA 26 &nbsp;·&nbsp; Player Ratings &nbsp;·&nbsp; June 2025</div> <h1 class="article-h1"> Top 10 FIFA Player Ratings 2025 —<br> Who Deserves <em>#1</em>? </h1> <div class="article-meta"> <div class="author-chip"> <div class="author-avatar">SL</div> <div> <div class="author-name">SportsLNV Staff</div> </div> </div> <span class="meta-chip">📅 June 12, 2025</span> <span class="meta-chip">⏱ 8 min read</span> <span class="meta-chip">👁 142,847 views</span> <span class="meta-chip updated">✅ Updated Weekly</span> </div> <!-- SHARE BUTTONS --> <div class="share-row" role="group" aria-label="Share this article"> <button class="share-btn tw" onclick="shareArticle('twitter')">𝕏 <span>Twitter</span></button> <button class="share-btn fb" onclick="shareArticle('facebook')">f <span>Facebook</span></button> <button class="share-btn wa" onclick="shareArticle('whatsapp')">● <span>WhatsApp</span></button> <button class="share-btn rd" onclick="shareArticle('reddit')">↑ <span>Reddit</span></button> <button class="share-btn" onclick="copyLink()">🔗 <span>Copy Link</span></button> </div> <!-- 3D FEATURED MEDIA (Three.js pitch) --> <figure class="featured-media"> <canvas id="pitchCanvas" role="img" aria-label="3D interactive FIFA football pitch showing players and a moving ball"></canvas> <div class="canvas-overlay-label">🎮 3D FIFA 26 Pitch — Interactive</div> <figcaption class="img-caption-bar"> FIFA 26 Top Player Ratings 2025 | Interactive 3D Pitch View | SportsLNV.com — Image: EA Sports FC 26 </figcaption> </figure> <!-- INTRO / LEAD PARAGRAPH --> <div class="intro-block"> FIFA 26 player ratings are finally here — and the debate is <strong>more heated than ever</strong>. Mbappe, Haaland, Vinicius Jr. and Bellingham are all in the 90+ OVR club, but only <strong>one player</strong> can hold the coveted <strong>99 OVR</strong> crown. We've broken down every top-10 rating, what changed from FIFA 25, and which stars got the biggest upgrades — and the biggest snubs. </div> <!-- TABLE OF CONTENTS --> <div class="info-callout"> <div class="callout-title">📋 In This Article</div> <a href="#top10-table">→ Top 10 FIFA 26 Player Ratings (Full Table)</a><br> <a href="#mbappe-breakdown">→ Why Mbappe Is Rated #1</a><br> <a href="#biggest-upgrades">→ Biggest Rating Upgrades in FIFA 26</a><br> <a href="#faq-section">→ FAQ — Most Asked Questions</a> </div> <!-- MAIN RATINGS TABLE --> <h2 class="section-h2" id="top10-table">Top 10 FIFA 26 Player Ratings — Full List</h2> <div class="table-wrap"> <table class="ratings-tbl" id="ratingsTable"> <thead> <tr> <th>#</th> <th>Player</th> <th class="club-cell">Club</th> <th>Pos</th> <th>Rating</th> <th>Change</th> </tr> </thead> <tbody id="ratingsBody"> <!-- JS fills this --> </tbody> </table> </div> <!-- MBAPPE BREAKDOWN --> <h2 class="section-h2" id="mbappe-breakdown">Why Mbappe Is Rated #1 in FIFA 26</h2> <h3 class="section-h3">Pace + Finishing + Dribbling = Unstoppable</h3> <div class="article-body"> <p> Kylian Mbappe's <strong>99 OVR</strong> in FIFA 26 reflects his historic 2024–25 season at Real Madrid. His <strong>Pace (99)</strong>, <strong>Dribbling (97)</strong>, and <strong>Finishing (95)</strong> make him the most complete forward in the game. EA Sports collected over 500 performance data points before finalising his rating. </p> </div> <div class="stat-bars" id="mbappeStats"> <!-- JS fills this --> </div> <!-- BIGGEST UPGRADES --> <h2 class="section-h2" id="biggest-upgrades">Biggest Rating Upgrades in FIFA 26</h2> <div class="article-body"> <p> Several players received major boosts this year. <strong>Vinicius Jr. (+2)</strong> climbed to 96 OVR after winning the Ballon d'Or runner-up spot. <strong>Rodrygo (+2)</strong> reached 90 OVR following an outstanding Champions League campaign. Young star <strong>Endrick (+4)</strong> made the biggest single jump in the entire FIFA 26 ratings — a sign of things to come. </p> <p> On the flip side, <strong>Kimmich (−1)</strong> saw a slight drop due to Bayern Munich's inconsistent domestic form, despite remaining one of the best midfielders in the world. </p> </div> <!-- FAQ SECTION --> <h2 class="section-h2" id="faq-section">Frequently Asked Questions (FAQ)</h2> <div class="faq-wrap" id="faqWrap" role="list"> <!-- JS fills this --> </div> <!-- ARTICLE TAGS (SEO internal links) --> <div class="tags-section"> <h3>Related Topics</h3> <div class="tags-wrap"> <a class="tag-chip" href="#">FIFA 26</a> <a class="tag-chip" href="#">Player Ratings 2025</a> <a class="tag-chip" href="#">Mbappe</a> <a class="tag-chip" href="#">Haaland</a> <a class="tag-chip" href="#">Vinicius Jr.</a> <a class="tag-chip" href="#">FUT 26</a> <a class="tag-chip" href="#">World Cup 2026</a> <a class="tag-chip" href="#">Best FIFA Players</a> <a class="tag-chip" href="#">FIFA Rankings</a> <a class="tag-chip" href="#">EA Sports FC</a> <a class="tag-chip" href="#">Bellingham</a> <a class="tag-chip" href="#">FIFA Career Mode</a> </div> </div> <!-- RELATED ARTICLES (internal linking for SEO) --> <h2 class="section-h2">Related Articles</h2> <div class="related-grid" id="relatedGrid"> <!-- JS fills this --> </div> </main> <!-- ===== SIDEBAR ===== --> <aside class="sidebar-col"> <!-- LIVE SCORES PANEL --> <div class="sidebar-panel"> <div class="panel-head"> <span class="panel-title">Live Scores</span> <span class="panel-badge badge-live">● LIVE</span> </div> <div class="scores-list" id="scoresList" role="list" aria-label="Live football scores"> <!-- JS fills this --> </div> </div> <!-- AI CHAT ASSISTANT PANEL --> <div class="sidebar-panel"> <div class="panel-head"> <div style="display:flex;align-items:center;gap:8px;"> <div style="width:28px;height:28px;border-radius:50%;background:var(--green);color:#000;font-size:12px;font-weight:800;display:flex;align-items:center;justify-content:center;flex-shrink:0;">AI</div> <span class="panel-title">FIFA 26 Assistant</span> </div> <span class="panel-badge badge-ai">Claude Powered</span> </div> <div class="chat-wrap"> <div class="chat-messages" id="chatMessages" role="log" aria-live="polite"> <!-- JS fills this --> </div> <div class="chat-quick-btns" id="quickBtns"> <!-- JS fills this --> </div> <div class="chat-input-area"> <input class="chat-text-input" id="chatInput" type="text" placeholder="Ask about FIFA 26..." aria-label="Ask the FIFA assistant a question" onkeydown="if(event.key==='Enter')sendChat()" > <button class="chat-send-btn" onclick="sendChat()" aria-label="Send message">↑</button> </div> </div> </div> </aside> </div><!-- end .page-wrap --> <!-- ===== SCROLL TO TOP ===== --> <button id="scrollTopBtn" aria-label="Scroll back to top" onclick="window.scrollTo({top:0,behavior:'smooth'})">↑</button> <!-- ===== FOOTER ===== --> <footer> <div>© 2025 <strong>SportsLNV.com</strong> — FIFA &amp; Football News, Live Scores, FUT Guides</div> <div class="footer-links"> <a href="#">About</a> <a href="#">Privacy Policy</a> <a href="#">Contact</a> <a href="#">Sitemap</a> <a href="#">FIFA 26 Guide</a> <a href="#">World Cup 2026</a> </div> </footer> <!-- ============================================================ JAVASCRIPT ============================================================ --> <script> /* ---- DATA ---- */ const PLAYERS = [ { rank:1, flag:'🇫🇷', name:'K. Mbappé', club:'Real Madrid', pos:'FW', ovr:99, change:'+1', rankCls:'rank-gold', ovrCls:'ovr-gold' }, { rank:2, flag:'🇳🇴', name:'E. Haaland', club:'Man City', pos:'FW', ovr:97, change:'=', rankCls:'rank-silver', ovrCls:'ovr-gold' }, { rank:3, flag:'🇧🇷', name:'Vinicius Jr.', club:'Real Madrid', pos:'FW', ovr:96, change:'+2', rankCls:'rank-bronze', ovrCls:'ovr-gold' }, { rank:4, flag:'🏴󠁧󠁢󠁥󠁮󠁧󠁿', name:'J. Bellingham', club:'Real Madrid', pos:'MF', ovr:95, change:'+1', rankCls:'rank-other', ovrCls:'ovr-green' }, { rank:5, flag:'🇵🇹', name:'B. Fernandes', club:'Man United', pos:'MF', ovr:92, change:'=', rankCls:'rank-other', ovrCls:'ovr-green' }, { rank:6, flag:'🇩🇪', name:'J. Kimmich', club:'Bayern Munich',pos:'MF', ovr:91, change:'-1', rankCls:'rank-other', ovrCls:'ovr-green' }, { rank:7, flag:'🇧🇷', name:'Rodrygo', club:'Real Madrid', pos:'FW', ovr:90, change:'+2', rankCls:'rank-other', ovrCls:'ovr-blue' }, { rank:8, flag:'🏴󠁧󠁢󠁥󠁮󠁧󠁿', name:'B. Saka', club:'Arsenal', pos:'FW', ovr:90, change:'+1', rankCls:'rank-other', ovrCls:'ovr-blue' }, { rank:9, flag:'🇩🇪', name:'M. ter Stegen', club:'Barcelona', pos:'GK', ovr:89, change:'=', rankCls:'rank-other', ovrCls:'ovr-blue' }, { rank:10, flag:'🇵🇹', name:'R. Leão', club:'AC Milan', pos:'FW', ovr:88, change:'+3', rankCls:'rank-other', ovrCls:'ovr-blue' }, ]; const POS_CLASS = { FW:'pos-fw', MF:'pos-mf', DF:'pos-df', GK:'pos-gk' }; const LIVE_SCORES = [ { league:'UEFA Champions League', home:'Real Madrid', away:'Man City', score:'2–1', time:"67'", live:true }, { league:'Premier League', home:'Liverpool', away:'Chelsea', score:'2–2', time:"72'", live:true }, { league:'La Liga', home:'Barcelona', away:'Atletico', score:'1–0', time:"58'", live:true }, { league:'Ligue 1', home:'PSG', away:'Arsenal', score:'0–0', time:"34'", live:true }, { league:'Bundesliga', home:'Bayern', away:'Dortmund', score:'3–2', time:'FT', live:false }, { league:'Serie A', home:'Juventus', away:'Inter', score:'1–1', time:'FT', live:false }, { league:'MLS', home:'Inter Miami', away:'LA Galaxy', score:'2–0', time:"45'", live:true }, ]; const TICKER_DATA = [ { home:'Real Madrid', away:'Man City', score:'2–1', live:true, time:"67'" }, { home:'Liverpool', away:'Chelsea', score:'2–2', live:true, time:"72'" }, { home:'Barcelona', away:'Atletico', score:'1–0', live:true, time:"58'" }, { home:'PSG', away:'Arsenal', score:'0–0', live:true, time:"34'" }, { home:'Bayern', away:'Dortmund', score:'3–2', live:false, time:'FT' }, { home:'Juventus', away:'Inter', score:'1–1', live:false, time:'FT' }, { home:'Inter Miami', away:'LA Galaxy', score:'2–0', live:true, time:"45'" }, ]; const MBAPPE_STATS = [ { label:'Pace', val:99 }, { label:'Dribbling', val:97 }, { label:'Shooting', val:95 }, { label:'Passing', val:88 }, { label:'Physical', val:85 }, { label:'Defending', val:37 }, ]; const FAQS = [ { q:'Who has the highest FIFA 26 rating?', a:'Kylian Mbappe holds the highest FIFA 26 rating with <strong>99 OVR</strong>, making him the cover star and top-rated player in the game for the second year running.' }, { q:"What is Haaland's FIFA 26 rating?", a:"Erling Haaland is rated <strong>97 OVR</strong> in FIFA 26, keeping him as the #2 rated player behind Mbappe. His Physical (95) and Shooting (96) remain elite." }, { q:'Has Vinicius Jr. been upgraded in FIFA 26?', a:'Yes! Vinicius Jr. received a <strong>+2 upgrade to 96 OVR</strong> in FIFA 26 after his exceptional 2024–25 La Liga season and Ballon d\'Or runner-up finish.' }, { q:'When does FIFA 26 release?', a:'FIFA 26 (EA Sports FC 26) is expected to release in <strong>September 2025</strong> on PS5, Xbox Series X, PC, and Nintendo Switch 2.' }, { q:'Who got the biggest upgrade in FIFA 26?', a:'Young striker <strong>Endrick received a +4 upgrade</strong> — the biggest single jump in FIFA 26 ratings — climbing to 82 OVR with 94 potential.' }, ]; const RELATED = [ { cat:'FUT Guide', title:'Best FIFA 26 Career Mode Hidden Gems Under 70 OVR' }, { cat:'World Cup', title:'FIFA World Cup 2026 Predictions — Full Group Stage Analysis' }, { cat:'Tactics', title:'Best FUT 26 Formations & Custom Tactics — Meta Guide' }, { cat:'Viral', title:'Mbappe vs Haaland vs Vinicius — Who Is Best in 2025?' }, ]; const CHAT_QUICK = ['Who is #1 rated?', 'Best FUT squad?', 'World Cup 2026?', 'Hidden gems?']; const CHAT_RESPONSES = { 'mbappe': '🥇 <strong>Kylian Mbappe</strong> is rated <strong>99 OVR</strong> in FIFA 26 — the highest in the game! His Pace (99) and Dribbling (97) make him virtually unstoppable.', 'haaland': '⚽ <strong>Erling Haaland</strong> is 97 OVR in FIFA 26. His Shooting (96) is second to none — perfect for a direct striker build in FUT.', 'vinicius': '🇧🇷 <strong>Vinicius Jr.</strong> got a +2 upgrade to <strong>96 OVR</strong>! His Pace (97) and Dribbling (96) make him one of the best wingers in the game.', 'rating': '📊 The FIFA 26 top 5 ratings are: Mbappe 99, Haaland 97, Vinicius Jr. 96, Bellingham 95, B. Fernandes 92. Full table is above! 👆', 'fut': '💳 Best FUT picks for FIFA 26: <strong>Mbappe 99</strong> up front, <strong>Bellingham 95</strong> in midfield, and <strong>Vinicius Jr. 96</strong> on the wing. For budget builds, try Saka 90!', 'world cup': '🏆 <strong>World Cup 2026</strong> top contenders: Brazil 🇧🇷 and France 🇫🇷 lead the odds. England 🏴󠁧󠁢󠁥󠁮󠁧󠁿 are the dark horse, and Argentina 🇦🇷 will defend as champions.', 'hidden': '💎 Best FIFA 26 hidden gems under 70 OVR: <strong>Sávio</strong> (Real Madrid, 68→81 pot.), <strong>Lamine Yamal</strong> (Barcelona, 82 pot.), <strong>Endrick</strong> (Real Madrid, 82→94 pot.)!', 'bellingham': '🌟 <strong>Jude Bellingham</strong> is rated <strong>95 OVR</strong> in FIFA 26 (+1 from last year). His Passing (91), Dribbling (90) and Shooting (88) make him a perfect box-to-box midfielder.', 'best squad': '🏆 Dream FUT squad: <strong>GK</strong> ter Stegen | <strong>MF</strong> Bellingham, Fernandes | <strong>FW</strong> Mbappe, Haaland, Vinicius. Budget? Go 4–3–3 with Saka + Rodrygo on the wings!', 'default': 'Great question! 🔍 I\'m the SportsLNV FIFA 26 assistant. I know all about player ratings, FUT squads, and World Cup 2026. What would you like to know?', }; /* ---- BUILD TICKER ---- */ (function buildTicker() { const track = document.getElementById('tickerTrack'); const items = [...TICKER_DATA, ...TICKER_DATA]; // duplicate for seamless loop items.forEach(m => { const el = document.createElement('div'); el.className = 'ticker-item'; el.innerHTML = `${m.home} <span class="ticker-score">${m.score}</span> ${m.away} ${m.live ? `<span class="ticker-live">LIVE ${m.time}</span>` : `<span class="ticker-ft">FT</span>`}`; track.appendChild(el); }); })(); /* ---- BUILD RATINGS TABLE ---- */ (function buildTable() { const tbody = document.getElementById('ratingsBody'); PLAYERS.forEach(p => { let chgHtml; if (p.change === '=') chgHtml = `<span class="change-eq">—</span>`; else if (p.change.startsWith('+')) chgHtml = `<span class="change-up">${p.change} ▲</span>`; else chgHtml = `<span class="change-down">${p.change} ▼</span>`; tbody.innerHTML += ` <tr> <td><span class="rank-cell ${p.rankCls}">${p.rank}</span></td> <td> <div class="player-info"> <span class="flag-emoji">${p.flag}</span> <div> <div class="player-name-cell">${p.name}</div> </div> </div> </td> <td class="club-cell">${p.club}</td> <td><span class="pos-badge ${POS_CLASS[p.pos]}">${p.pos}</span></td> <td><span class="ovr-badge ${p.ovrCls}">${p.ovr}</span></td> <td>${chgHtml}</td> </tr>`; }); })(); /* ---- BUILD MBAPPE STATS ---- */ (function buildStats() { const wrap = document.getElementById('mbappeStats'); MBAPPE_STATS.forEach(s => { wrap.innerHTML += ` <div class="stat-row"> <span class="stat-label-cell">${s.label}</span> <div class="stat-bar-bg"> <div class="stat-bar-fill" style="width:${s.val}%"></div> </div> <span class="stat-val">${s.val}</span> </div>`; }); })(); /* ---- BUILD FAQ ---- */ (function buildFAQ() { const wrap = document.getElementById('faqWrap'); FAQS.forEach((f, i) => { wrap.innerHTML += ` <div class="faq-item" role="listitem"> <button class="faq-question" id="faqQ${i}" onclick="toggleFAQ(${i})" aria-expanded="false"> ${f.q} <span class="faq-arrow">⌄</span> </button> <div class="faq-answer" id="faqA${i}" role="region" aria-labelledby="faqQ${i}"> ${f.a} </div> </div>`; }); })(); function toggleFAQ(i) { const btn = document.getElementById('faqQ' + i); const ans = document.getElementById('faqA' + i); const isOpen = ans.classList.contains('show'); btn.classList.toggle('open', !isOpen); ans.classList.toggle('show', !isOpen); btn.setAttribute('aria-expanded', String(!isOpen)); } /* ---- BUILD LIVE SCORES ---- */ (function buildScores() { const list = document.getElementById('scoresList'); LIVE_SCORES.forEach(m => { list.innerHTML += ` <div class="score-row" role="listitem"> <div class="score-league-lbl">${m.league}</div> <div class="score-match"> <div class="score-team-name">${m.home}</div> <div class="score-box ${m.live ? 'live-score' : ''}">${m.score}</div> <div class="score-team-name right">${m.away}</div> </div> <div class="score-minute ${m.live ? 'is-live' : 'is-ft'}"> ${m.live ? '● ' + m.time : m.time} </div> </div>`; }); })(); /* ---- BUILD RELATED ARTICLES ---- */ (function buildRelated() { const grid = document.getElementById('relatedGrid'); RELATED.forEach(r => { grid.innerHTML += ` <div class="related-card" role="article"> <div class="related-cat">${r.cat}</div> <div class="related-title">${r.title}</div> </div>`; }); })(); /* ---- CHAT ASSISTANT ---- */ const chatEl = document.getElementById('chatMessages'); function addChatMsg(text, type) { const d = document.createElement('div'); d.className = 'chat-msg ' + type; d.innerHTML = text; chatEl.appendChild(d); chatEl.scrollTop = chatEl.scrollHeight; } function showTyping() { const t = document.createElement('div'); t.className = 'typing-wrap'; t.id = 'typingIndicator'; t.innerHTML = '<div class="typing-dot"></div><div class="typing-dot"></div><div class="typing-dot"></div>'; chatEl.appendChild(t); chatEl.scrollTop = chatEl.scrollHeight; } function removeTyping() { const t = document.getElementById('typingIndicator'); if (t) t.remove(); } function getBotReply(text) { const t = text.toLowerCase(); for (const [key, val] of Object.entries(CHAT_RESPONSES)) { if (key !== 'default' && t.includes(key)) return val; } return CHAT_RESPONSES['default']; } function sendChat() { const inp = document.getElementById('chatInput'); const val = inp.value.trim(); if (!val) return; addChatMsg(val, 'user'); inp.value = ''; showTyping(); setTimeout(() => { removeTyping(); addChatMsg(getBotReply(val), 'bot'); }, 800 + Math.random() * 400); } // Quick suggestion buttons (function buildQuickBtns() { const wrap = document.getElementById('quickBtns'); CHAT_QUICK.forEach(q => { const b = document.createElement('button'); b.className = 'quick-btn'; b.textContent = q; b.onclick = () => { document.getElementById('chatInput').value = q; sendChat(); }; wrap.appendChild(b); }); })(); // Welcome message addChatMsg('👋 Hi! I\'m the <strong>SportsLNV FIFA 26 Assistant</strong>. Ask me about player ratings, FUT squads, or World Cup 2026 predictions!', 'bot'); /* ---- LIVE SCORE TICKER: update a random score every 90s ---- */ setInterval(() => { const idx = Math.floor(Math.random() * 4); const m = LIVE_SCORES[idx]; if (!m.live) return; const parts = m.score.split('–'); const side = Math.random() > 0.5 ? 0 : 1; parts[side] = String(parseInt(parts[side]) + 1); m.score = parts.join('–'); const el = document.getElementById('scoresList'); el.innerHTML = ''; LIVE_SCORES.forEach(s => { el.innerHTML += ` <div class="score-row"> <div class="score-league-lbl">${s.league}</div> <div class="score-match"> <div class="score-team-name">${s.home}</div> <div class="score-box ${s.live ? 'live-score' : ''}">${s.score}</div> <div class="score-team-name right">${s.away}</div> </div> <div class="score-minute ${s.live ? 'is-live' : 'is-ft'}"> ${s.live ? '● ' + s.time : s.time} </div> </div>`; }); }, 90000); /* ---- SHARE FUNCTIONS ---- */ function shareArticle(platform) { const url = encodeURIComponent('https://sportslnv.com/fifa/top-10-player-ratings-2025/'); const title = encodeURIComponent('Top 10 FIFA Player Ratings 2025 — Who Deserves #1?'); const urls = { twitter: `https://twitter.com/intent/tweet?url=${url}&text=${title}`, facebook: `https://www.facebook.com/sharer/sharer.php?u=${url}`, whatsapp: `https://wa.me/?text=${title}%20${url}`, reddit: `https://www.reddit.com/submit?url=${url}&title=${title}`, }; if (urls[platform]) window.open(urls[platform], '_blank', 'width=600,height=400'); } function copyLink() { navigator.clipboard.writeText('https://sportslnv.com/fifa/top-10-player-ratings-2025/') .then(() => alert('Link copied to clipboard!')); } /* ---- SCROLL PROGRESS + SCROLL-TO-TOP ---- */ window.addEventListener('scroll', () => { const progress = (window.scrollY / (document.body.scrollHeight - window.innerHeight)) * 100; document.getElementById('readProgress').style.width = Math.min(progress, 100) + '%'; const btn = document.getElementById('scrollTopBtn'); btn.classList.toggle('show', window.scrollY > 400); }); /* ============================================================ THREE.JS — 3D FOOTBALL PITCH ============================================================ */ (function init3D() { try { const canvas = document.getElementById('pitchCanvas'); const W = canvas.parentElement.offsetWidth || 700; const H = 220; const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: true }); renderer.setSize(W, H); renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); renderer.setClearColor(0x000000, 0); const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(42, W / H, 0.1, 200); camera.position.set(0, 9, 14); camera.lookAt(0, 0, 0); // Lighting scene.add(new THREE.AmbientLight(0xffffff, 0.65)); const sun = new THREE.DirectionalLight(0xfff0d0, 1.1); sun.position.set(6, 12, 8); scene.add(sun); const fill = new THREE.DirectionalLight(0x4488ff, 0.45); fill.position.set(-6, 4, -6); scene.add(fill); // Pitch base const pitchMat = new THREE.MeshLambertMaterial({ color: 0x1d6b30 }); scene.add(Object.assign( new THREE.Mesh(new THREE.PlaneGeometry(18, 12), pitchMat), { rotation: { x: -Math.PI / 2 } } )); // Alternating stripes for (let i = 0; i < 9; i++) { const m = new THREE.MeshLambertMaterial({ color: i % 2 === 0 ? 0x22753a : 0x196028 }); const s = new THREE.Mesh(new THREE.PlaneGeometry(2, 12), m); s.rotation.x = -Math.PI / 2; s.position.set(-8 + i * 2 + 1, 0.002, 0); scene.add(s); } // White line material const WL = new THREE.MeshBasicMaterial({ color: 0xffffff }); // Pitch border const border = new THREE.LineSegments( new THREE.EdgesGeometry(new THREE.PlaneGeometry(17, 11)), new THREE.LineBasicMaterial({ color: 0xffffff, linewidth: 2 }) ); border.rotation.x = -Math.PI / 2; border.position.y = 0.01; scene.add(border); // Centre line const cl = new THREE.Mesh(new THREE.PlaneGeometry(0.06, 11), WL); cl.rotation.x = -Math.PI / 2; cl.position.y = 0.01; scene.add(cl); // Centre circle const ccGeo = new THREE.RingGeometry(1.8, 1.94, 40); scene.add(Object.assign( new THREE.Mesh(ccGeo, new THREE.MeshBasicMaterial({ color: 0xffffff, side: THREE.DoubleSide })), { rotation: { x: -Math.PI / 2 }, position: { x: 0, y: 0.01, z: 0 } } )); // Centre dot scene.add(Object.assign( new THREE.Mesh(new THREE.CircleGeometry(0.14, 16), WL), { rotation: { x: -Math.PI / 2 }, position: { x: 0, y: 0.01, z: 0 } } )); // Goals const postMat = new THREE.MeshLambertMaterial({ color: 0xffffff }); [-8.2, 8.2].forEach(gx => { const sign = gx < 0 ? -1 : 1; [[-1.1], [1.1]].forEach(([gz]) => { const post = new THREE.Mesh(new THREE.CylinderGeometry(0.07, 0.07, 2.5, 8), postMat); post.position.set(gx, 1.25, gz); scene.add(post); }); const xbar = new THREE.Mesh(new THREE.CylinderGeometry(0.07, 0.07, 2.2, 8), postMat); xbar.rotation.z = Math.PI / 2; xbar.position.set(gx, 2.55, 0); scene.add(xbar); }); // Players const teamA = 0x1565c0, teamB = 0xc62828; const playerPositions = [ // Team A (blue) [0, 0, -4], [-3, 0, -1.5], [3, 0, -1.5], [-1.5, 0, -0.5], [1.5, 0, -0.5], [0, 0, -2.5], // Team B (red) [0, 0, 4], [-3, 0, 1.5], [3, 0, 1.5], [-1.5, 0, 0.5], [1.5, 0, 0.5], ]; playerPositions.forEach((pos, i) => { const col = i < 6 ? teamA : teamB; const bodyMat = new THREE.MeshLambertMaterial({ color: col }); const headMat = new THREE.MeshLambertMaterial({ color: 0xf0c090 }); const body = new THREE.Mesh(new THREE.CylinderGeometry(0.2, 0.2, 0.65, 8), bodyMat); body.position.set(pos[0], 0.55, pos[2]); scene.add(body); const head = new THREE.Mesh(new THREE.SphereGeometry(0.22, 8, 8), headMat); head.position.set(pos[0], 1.1, pos[2]); scene.add(head); }); // Ball const ballMat = new THREE.MeshLambertMaterial({ color: 0xf5f5f5 }); const ball = new THREE.Mesh(new THREE.SphereGeometry(0.25, 14, 14), ballMat); scene.add(ball); // Animate let t = 0; function animate() { requestAnimationFrame(animate); t += 0.013; // Camera slow orbit camera.position.x = Math.sin(t * 0.25) * 4; camera.position.z = 14 + Math.cos(t * 0.2) * 2; camera.lookAt(0, 0, 0); // Ball movement ball.position.x = Math.sin(t * 1.6) * 2.2; ball.position.z = Math.cos(t * 1.3) * 1.6; ball.position.y = 0.25 + Math.abs(Math.sin(t * 3.5)) * 0.5; ball.rotation.x += 0.06; ball.rotation.z += 0.04; renderer.render(scene, camera); } animate(); // Resize window.addEventListener('resize', () => { const nW = canvas.parentElement.offsetWidth; renderer.setSize(nW, H); camera.aspect = nW / H; camera.updateProjectionMatrix(); }); } catch (err) { // Graceful fallback if WebGL unavailable document.getElementById('pitchCanvas').style.display = 'none'; } })(); </script> </body> </html>