Atlas FC fortalece su ecosistema tecnológico junto a Teamworks
Incorporamos Teamworks Hub y Teamworks S&C a Atlas FC
%202%202.avif)
Asegura tu lugar en la siguiente jornada rojinegra. Vive cada gol desde el Estadio Jalisco.
Los duelos que no te puedes perder, juntos y con descuento. Elige tu pack y asegura tu lugar en la casa rojinegra.
Adquiere tu pase mensual o anual
Las 17 jornadas del Rojinegro en la fase regular. Fechas, horarios y sedes en un solo lugar.
Tabla general, líderes de goleo y datos clave del equipo durante el Apertura 2026.
Pos
Club
Pos
Club
PJ
G
D
L
GF
GA
GD
Pts
1
Atlas
12
9
3
0
26
10
+16
1
Atlas
12
9
3
0
26
10
+16
Jeremy Márquez
12 goles
xG/Partida
#17 goles anotados de la liga
EN 17 PARTIDOS
#17 goles anotados de la liga
PROMEDIO
#17 goles anotados de la liga
Crónicas, entrevistas, análisis y novedades del primer equipo, fuerzas básicas y todo el universo Atlas.
Atlas FC
Atlas FC fortalece su ecosistema tecnológico junto a Teamworks
Incorporamos Teamworks Hub y Teamworks S&C a Atlas FC
Atlas FC
Luis Esteves confía en el proyecto que se construye en Atlas FC
Conferencia de Prensa con Luis Esteves
Atlas FC
Semana Rojinegra: Atlas FC busca seguir entre los líderes en San Luis
Semana Rojinegra: Atlas FC visita al Atlético de San Luis
%202%202.avif)
Jerseys oficiales 25/26, equipación de entrenamiento y mercancía del 110 aniversario rojinegro.
Envíos a toda la República.

// Rellena .swiper-wrapper.matches e inicializa Swiper propio (function () { 'use strict'; var BASE = 'https://webws.365scores.com/web/'; var ATLAS_ID = 1258; var COMP = 141; var QS = 'appTypeId=5&langId=29&timezoneName=America%2FMexico_City&userCountryId=31'; var ABBR = { 'Atlas': 'ATLAS FC', 'Chivas de Guadalajara': 'CHIVAS', 'Cruz Azul': 'CRUZ AZUL', 'Club América': 'AMÉRICA', 'Tigres UANL': 'TIGRES', 'Pumas UNAM': 'PUMAS', 'Toluca': 'TOLUCA', 'Pachuca': 'PACHUCA', 'Santos Laguna': 'SANTOS', 'León': 'LEÓN', 'Mazatlán FC': 'MAZATLÁN', 'Atlético San Luis': 'SAN LUIS', 'Monterrey': 'MONTERREY', 'Necaxa': 'NECAXA', 'Querétaro FC': 'QUERÉTARO', 'Puebla': 'PUEBLA', 'FC Juárez': 'JUÁREZ', 'Club Tijuana': 'TIJUANA', }; var liveInterval = null; /* ── Helpers ─────────────────────────────────────────────────── */ function abbr(name) { return ABBR[name] || name.toUpperCase().slice(0, 8); } function roundLabel(g) { if (g.roundNum != null) return 'J' + g.roundNum; var s = (g.stageName || '').toLowerCase(); var leg = g._leg === 2 ? 'VUELTA' : 'IDA'; if (s.indexOf('cuartos') !== -1) return 'CUARTOS · ' + leg; if (s.indexOf('semi') !== -1) return 'SEMIS · ' + leg; if (s.indexOf('final') !== -1) return 'FINAL · ' + leg; return (g.stageName || '').toUpperCase(); } function assignLegs(games) { var count = {}; return games.map(function (g) { if (g.roundNum == null && g.stageName) { count[g.stageName] = (count[g.stageName] || 0) + 1; return Object.assign({}, g, { _leg: count[g.stageName] }); } return g; }); } function isAtlas(g) { return (g.homeCompetitor && g.homeCompetitor.id === ATLAS_ID) || (g.awayCompetitor && g.awayCompetitor.id === ATLAS_ID); } function notApertura(g) { return (g.stageName || '').toLowerCase().indexOf('apertura') === -1; } /* ── HTML con clases de Webflow ──────────────────────────────── */ function renderSlide(g, isCurrent) { var h = g.homeCompetitor; var a = g.awayCompetitor; var done = g.statusGroup === 4; var live = g.statusGroup === 3; var scoreStr = (done || live) ? (h.score || 0) + '-' + (a.score || 0) : 'VS'; var badgeHtml = ''; if (live) { badgeHtml = '
' + (g.shortStatusText || 'EN VIVO') + '
' + ''; } else if (isCurrent && !done) { badgeHtml = '
próximo
' + ''; } var containerClass = isCurrent ? 'vertical-match-container-current' : 'vertical-match-container'; return ( '
' ); } /* ── Fetch ───────────────────────────────────────────────────── */ function fetchAll() { return Promise.all([ fetch(BASE + 'games/results?competitions=' + COMP + '&competitors=' + ATLAS_ID + '&' + QS) .then(function (r) { return r.json(); }), fetch(BASE + 'games/current?competitions=' + COMP + '&' + QS) .then(function (r) { return r.json(); }), ]).then(function (results) { var past = (results[0].games || []).filter(function (g) { return isAtlas(g) && notApertura(g); }); var seen = {}; past.forEach(function (g) { seen[g.id] = true; }); var current = (results[1].games || []).filter(function (g) { return isAtlas(g) && notApertura(g) && !seen[g.id]; }); var all = past.concat(current).sort(function (a, b) { return new Date(a.startTime) - new Date(b.startTime); }); return assignLegs(all); }); } /* ── Render principal ────────────────────────────────────────── */ function render() { var swiperEl = document.querySelector('.swiper-matches'); if (!swiperEl) { console.warn('Atlas ticker: no se encontró .swiper-matches'); return; } var wrapper = swiperEl.querySelector('.swiper-wrapper'); if (!wrapper) { console.warn('Atlas ticker: no se encontró .swiper-wrapper dentro de .swiper-matches'); return; } fetchAll().then(function (games) { if (!games.length) { console.warn('Atlas ticker: API no devolvió partidos'); return; } var live = games.filter(function (g) { return g.statusGroup === 3; }); var upcoming = games.filter(function (g) { return g.statusGroup === 1 || g.statusGroup === 2; }); var current = live[0] || upcoming[0] || null; var currentId = current ? current.id : null; // Polling en vivo if (live.length && !liveInterval) { liveInterval = setInterval(render, 30000); } else if (!live.length && liveInterval) { clearInterval(liveInterval); liveInterval = null; } // Índice scroll var currentIndex = 0; for (var i = 0; i < games.length; i++) { if (games[i].id === currentId) { currentIndex = i; break; } } var scrollIndex; if (live.length) { scrollIndex = currentIndex; } else if (upcoming.length && currentIndex > 0) { scrollIndex = currentIndex - 1; } else { scrollIndex = Math.max(0, games.length - 1); } // Poblar slides wrapper.innerHTML = games.map(function (g) { return renderSlide(g, g.id === currentId); }).join(''); // Destruir instancia previa si existe if (swiperEl.swiper) { try { swiperEl.swiper.destroy(true, true); } catch (e) {} } // Inicializar Swiper if (typeof Swiper !== 'undefined') { // cssMode = scroll nativo: soporta swipe con dedo en mobile // sin JS adicional y compatible con "transform:none !important" var sw = new Swiper(swiperEl, { slidesPerView: 'auto', spaceBetween: 0, cssMode: true, navigation: { nextEl: swiperEl.querySelector('.swiper-button-next'), prevEl: swiperEl.querySelector('.swiper-button-prev'), }, }); sw.slideTo(scrollIndex, 0); } else { // Fallback sin Swiper: scroll nativo console.warn('Atlas ticker: Swiper no disponible, usando scroll nativo'); wrapper.style.cssText = 'display:flex;overflow-x:auto;scrollbar-width:none;scroll-behavior:smooth'; var target = wrapper.children[scrollIndex]; if (target) setTimeout(function () { target.scrollIntoView({ behavior: 'instant', inline: 'start', block: 'nearest' }); }, 50); } }).catch(function (e) { console.error('Atlas ticker error:', e); }); } /* ── Init ────────────────────────────────────────────────────── */ if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', render); } else { render(); } })(); /** * tabla.js — Tabla General Liga MX con Atlas sticky bidireccional * Webflow: Page Settings > Before (home/index) */ (function () { 'use strict'; const TEAM_ID = 1258; const BASE_PARAMS = { appTypeId: 5, langId: 29, timezoneName: 'America/Mexico_City', userCountryId: 31, }; async function api(endpoint, extra = {}) { const params = new URLSearchParams({ ...BASE_PARAMS, ...extra }).toString(); const res = await fetch(`https://webws.365scores.com/web/${endpoint}/?${params}`); return res.json(); } function teamLogo(id) { return `https://imagecache.365scores.com/image/upload/f_png,w_150,h_150,c_limit,q_auto:best,d_Competitors:default1.png/v5/Competitors/${id}`; } const SHORT_NAMES = { 'Chivas de Guadalajara': 'Chivas', 'U.A.N.L. - Tigres': 'Tigres', 'Tigres UANL': 'Tigres', 'Santos Laguna': 'Santos', 'Club Tijuana': 'Tijuana', 'Atlético San Luis': 'Atl. San Luis', 'Atlético de San Luis': 'Atl. San Luis', 'Club América': 'América', 'Mazatlán FC': 'Mazatlán', 'FC Juárez': 'Juárez', 'Querétaro FC': 'Querétaro', 'Pumas UNAM': 'Pumas', }; function shortName(name) { return SHORT_NAMES[name] || name; } function atlasRowHtml(row, extraClasses) { const comp = row.competitor || {}; const diff = row.ratio >= 0 ? `+${Math.round(row.ratio)}` : `${Math.round(row.ratio)}`; return `
${row.position}
${shortName(comp.name || '')}
`; } function normalRowHtml(row) { const comp = row.competitor || {}; const diff = row.ratio >= 0 ? `+${Math.round(row.ratio)}` : `${Math.round(row.ratio)}`; return `
${shortName(comp.name || '')}
`; } function createStickyEl(html, stickySide) { const temp = document.createElement('div'); temp.innerHTML = html; const el = temp.firstElementChild; el.style.position = 'sticky'; el.style[stickySide] = '0'; el.style.zIndex = '10'; el.style.display = 'none'; return el; } function injectStyles() { if (document.getElementById('atl-standings-css')) return; const style = document.createElement('style'); style.id = 'atl-standings-css'; style.textContent = ` .grid-main-resultados .icon-1x1-medium { width: 32px; height: 32px; object-fit: contain; } @media (max-width: 767px) { .grid-main-resultados .resultados-container-small { min-width: 40px; padding: 10px 8px; } .grid-main-resultados .resultados-container-medium { min-width: 0; flex: 1; } .grid-main-resultados .icon-1x1-medium { width: 24px; height: 24px; } .row-team-resultados > :nth-child(5), .row-team-resultados > :nth-child(6), .row-team-resultados > :nth-child(7), .row-team-resultados > :nth-child(8), .row-team-resultados > :nth-child(9), .header-text-resultados > :nth-child(5), .header-text-resultados > :nth-child(6), .header-text-resultados > :nth-child(7), .header-text-resultados > :nth-child(8), .header-text-resultados > :nth-child(9) { display: none; } } @media (max-width: 479px) { .grid-main-resultados .resultados-container-small { min-width: 40px; padding: 8px 4px; } .grid-main-resultados .resultados-container-small p { font-size: 12px; } .grid-main-resultados .resultados-container-medium { gap: 6px; } .grid-main-resultados .icon-1x1-medium { width: 20px; height: 20px; } .grid-main-resultados .no-break { font-size: 12px; } } `; document.head.appendChild(style); } async function init() { const grid = document.querySelector('.grid-main-resultados'); if (!grid) return; injectStyles(); try { const data = await api('standings', { competitions: 141 }); const rows = data.standings?.[0]?.rows || []; if (!rows.length) return; const mobileHeader = grid.querySelector('.header-text-resultados.mobile'); grid.querySelectorAll('.row-team-resultados').forEach(el => el.remove()); const atlasData = rows.find(r => r.competitor?.id === TEAM_ID); const allHtml = rows.map(r => r.competitor?.id === TEAM_ID ? atlasRowHtml(r, 'atl-natural-row') : normalRowHtml(r) ).join(''); if (mobileHeader) { mobileHeader.insertAdjacentHTML('afterend', allHtml); } else { grid.insertAdjacentHTML('beforeend', allHtml); } if (!atlasData) return; const rowHtml = atlasRowHtml(atlasData, ''); const stickyTop = createStickyEl(rowHtml, 'top'); const naturalRow = grid.querySelector('.atl-natural-row'); grid.insertBefore(stickyTop, naturalRow ? naturalRow : grid.firstChild); const stickyBottom = createStickyEl(rowHtml, 'bottom'); grid.appendChild(stickyBottom); if (!naturalRow || !('IntersectionObserver' in window)) return; const scrollRoot = grid.closest('.container-resultados-grid'); let gridInView = false; new IntersectionObserver( ([entry]) => { gridInView = entry.isIntersecting; }, { threshold: 0 } ).observe(grid); new IntersectionObserver( ([entry]) => { if (!gridInView) { stickyTop.style.display = 'none'; stickyBottom.style.display = 'none'; return; } if (entry.isIntersecting) { stickyTop.style.display = 'none'; stickyBottom.style.display = 'none'; } else { const rootTop = entry.rootBounds?.top ?? 0; const rootBottom = entry.rootBounds?.bottom ?? window.innerHeight; const rowCenter = (entry.boundingClientRect.top + entry.boundingClientRect.bottom) / 2; if (rowCenter < rootTop) { stickyTop.style.display = ''; stickyBottom.style.display = 'none'; } else if (rowCenter > rootBottom) { stickyTop.style.display = 'none'; stickyBottom.style.display = ''; } } }, { root: scrollRoot, threshold: 0 } ).observe(naturalRow); } catch (err) { console.error('[Atlas Standings] Error:', err); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })(); /** * goleadores.js — Top 5 goleadores de Atlas + Datos Clave */ (function () { 'use strict'; const TEAM_ID = 1258; const COMPETITION_ID = 141; const ROJO_ATLAS = '#f70004'; const BASE_PARAMS = { appTypeId: 5, langId: 29, timezoneName: 'America/Mexico_City', userCountryId: 31, }; async function api(endpoint, extra = {}) { const params = new URLSearchParams({ ...BASE_PARAMS, ...extra }).toString(); const res = await fetch(`https://webws.365scores.com/web/${endpoint}/?${params}`); return res.json(); } function playerImg(id) { return `https://imagecache.365scores.com/image/upload/f_png,w_200,h_200,c_limit,q_auto:best,d_Athletes:default.png/v5/Athletes/${id}`; } const SHORT_NAMES = { 'Chivas de Guadalajara': 'Chivas', 'U.A.N.L. - Tigres': 'Tigres', 'Santos Laguna': 'Santos', 'Club Tijuana': 'Tijuana', 'Atlético San Luis': 'Atl. San Luis', 'Atlético de San Luis': 'Atl. San Luis', 'Club América': 'América', 'Mazatlán FC': 'Mazatlán', 'FC Juárez': 'Juárez', 'Querétaro FC': 'Querétaro', 'Pumas UNAM': 'Pumas', }; function shortName(name) { return SHORT_NAMES[name] || name; } function buildLastGoalMap(pastGames) { const map = {}; for (const game of pastGames) { const events = game.events || []; const isHome = game.homeCompetitor?.id === TEAM_ID; const opponent = isHome ? game.awayCompetitor?.name : game.homeCompetitor?.name; const round = game.roundNum; for (const evt of events) { if (evt.eventType?.id === 1 && evt.competitorId === TEAM_ID && evt.playerId) { if (!map[evt.playerId]) { map[evt.playerId] = { opponent: shortName(opponent), round }; } } } } return map; } function renderGoleadores(golesCat, pastGames) { const container = document.querySelector('.tabla-metricas-1'); if (!container) return; const rows = (golesCat?.rows || []) .filter(r => r.entity?.competitorId === TEAM_ID && !r.entity?.isLeftClub) .filter((r, i, self) => i === self.findIndex(t => t.entity?.id === r.entity?.id)) .slice(0, 5); if (!rows.length) return; const lastGoalMap = buildLastGoalMap(pastGames); const header = container.querySelector('.header-resultados'); container.querySelectorAll('.container-metrics-goleador').forEach(c => c.remove()); let html = ''; rows.forEach((row, idx) => { const rank = idx + 1; const isTop = rank === 1; const player = row.entity || {}; const goals = row.stats?.[0]?.value ?? 0; const lastGoal = lastGoalMap[player.id]; const subtitle = lastGoal ? `${goals} gol${goals != 1 ? 'es' : ''} · Último: vs ${lastGoal.opponent}` : `${goals} gol${goals != 1 ? 'es' : ''}`; const rankClass = isTop ? 'title-style-2' : 'title-style-2 grey'; const rankStyle = isTop ? `style="color:${ROJO_ATLAS}"` : ''; const nameClass = isTop ? 'title-style-3' : 'title-style-3 black'; const nameStyle = isTop ? `style="color:${ROJO_ATLAS}"` : ''; html += `
${player.name || ''}
`; }); if (header) { header.insertAdjacentHTML('afterend', html); } else { container.insertAdjacentHTML('beforeend', html); } } function renderMetrics(statsData, standingsData) { const wrapper = document.querySelector('.wrapper-metrics'); if (!wrapper) return; const allStandings = standingsData?.standings || []; const regularSeason = allStandings.reduce((best, s) => { const gp = s?.rows?.[0]?.gamePlayed || 0; const bestGp = best?.rows?.[0]?.gamePlayed || 0; return gp > bestGp ? s : best; }, allStandings[0] || {}); const standingsRows = regularSeason?.rows || []; const atlasRow = standingsRows.find(r => r.competitor?.id === TEAM_ID); if (!atlasRow) return; const played = atlasRow.gamePlayed || 1; const atlasGF = Math.round(atlasRow.for || 0); const ath = statsData?.athletesStats || []; const xgCat = ath.find(c => c.id === 2); let totalXg = 0; if (xgCat?.rows) { for (const r of xgCat.rows) { if (r.entity?.competitorId === TEAM_ID && !r.entity?.isLeftClub) { totalXg += parseFloat(r.stats?.[0]?.value || 0); } } } const xgPerGame = (totalXg / played).toFixed(2); let leagueGF = 0, leagueGP = 0; for (const r of standingsRows) { leagueGF += r.for || 0; leagueGP += r.gamePlayed || 0; } const leagueGpG = leagueGP ? leagueGF / leagueGP : 1.3; const xgDiffNum = parseFloat(xgPerGame) - leagueGpG; const xgDiffStr = xgDiffNum >= 0 ? `+${xgDiffNum.toFixed(2)}` : xgDiffNum.toFixed(2); const xgNote = `${xgDiffStr} vs promedio de liga (${leagueGpG.toFixed(2)} xG/pj)`; const xgPct = Math.min(100, Math.round((parseFloat(xgPerGame) / 3) * 100)); const sortedByGF = [...standingsRows].sort((a, b) => (b.for || 0) - (a.for || 0)); const gfRank = sortedByGF.findIndex(r => r.competitor?.id === TEAM_ID) + 1; const leaderGF = Math.round(sortedByGF[0]?.for || 1); const gapToLeader = leaderGF - atlasGF; const gfNote = gfRank === 1 ? `Líder goleador de la liga` : gfRank <= 3 ? `Top ${gfRank} en goles — a ${gapToLeader} del líder` : `#${gfRank} en goles — a ${gapToLeader} del líder (${leaderGF} GF)`; const gfPct = Math.min(100, Math.round((atlasGF / leaderGF) * 100)); const golesPerGame = (atlasGF / played).toFixed(2); const gpgDiffNum = parseFloat(golesPerGame) - leagueGpG; const gpgDiffStr = gpgDiffNum >= 0 ? `+${gpgDiffNum.toFixed(2)}` : gpgDiffNum.toFixed(2); const sortedByGpG = [...standingsRows] .map(r => ({ id: r.competitor?.id, gpg: (r.for || 0) / (r.gamePlayed || 1) })) .sort((a, b) => b.gpg - a.gpg); const gpgRank = sortedByGpG.findIndex(r => r.id === TEAM_ID) + 1; const gpgNote = `${gpgDiffStr} vs liga · #${gpgRank} en efectividad ofensiva`; const gpgPct = Math.min(100, Math.round((parseFloat(golesPerGame) / (sortedByGpG[0]?.gpg || 1)) * 100)); wrapper.innerHTML = `
xG / partido
${xgNote}
en ${played} partidos
${gfNote}
promedio
${gpgNote}
`; } function injectStyles() { if (document.getElementById('atl-stats-css')) return; const style = document.createElement('style'); style.id = 'atl-stats-css'; style.textContent = ` /* Goleadores */ .tabla-metricas-1 .icon-embed-xlarge { border-radius: 8px; overflow: hidden; } @media (max-width: 767px) { .tabla-metricas-1 .container-metrics-goleador { padding: 16px; gap: 1rem; } .tabla-metricas-1 .icon-embed-xlarge { width: 56px; height: 72px; min-width: 56px; } } @media (max-width: 479px) { .tabla-metricas-1 .container-metrics-goleador { padding: 14px; gap: 0.875rem; } .tabla-metricas-1 .icon-embed-xlarge { width: 52px; height: 68px; min-width: 52px; } } .wrapper-metrics { display: flex !important; } .wrapper-metrics .chip-container { display: flex; align-items: baseline; gap: 8px; } .wrapper-metrics h5 { color: var(--_colors---negro-atlas, #1a1a1a) !important; } `; document.head.appendChild(style); } async function init() { try { const isAtlas = g => g.homeCompetitor?.id === TEAM_ID || g.awayCompetitor?.id === TEAM_ID; const [statsRes, resultsRes, standingsRes] = await Promise.all([ api('stats', { competitions: COMPETITION_ID, competitors: TEAM_ID }), api('games/results', { competitions: COMPETITION_ID, competitors: TEAM_ID }), api('standings', { competitions: COMPETITION_ID }), ]); const allResults = (resultsRes.games || []).filter(g => isAtlas(g)); const pastGames = allResults .filter(g => (g.stageName || '').toLowerCase() === 'clausura') .sort((a, b) => new Date(b.startTime) - new Date(a.startTime)); const stats = statsRes.stats || {}; const golesCat = (stats.athletesStats || []).find(c => c.id === 1); renderGoleadores(golesCat, pastGames); renderMetrics(stats, standingsRes); } catch (err) { console.error('[Atlas Stats] Error:', err); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { injectStyles(); init(); }); } else { injectStyles(); init(); } })();