Top 10 FIFA Player Ratings 2025
Sports Live•Jun 12, 2026

<!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 · Player Ratings · 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 & 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>
Related News
Breaking NewsFIFA World Cup 2026 — 20 Complete Articles
3 days ago0
Breaking NewsWhy This Is the Last World Cup for These Football Legends
12 days ago0
Breaking NewsFIFA World Cup 2026 — Complete Football Hub
13 days ago0
Breaking NewsHow to Watch FIFA World Cup 2026 Free — Full Streaming Guide by Country
16 days ago0