Showing source for: https://nontonbola.gratis/
Duration: 1.730679s
Server: LiteSpeed

<!DOCTYPE html>
<html lang="id">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
  <title>Nonton Bola Gratis & Info Sepak Bola Terlengkap</title>
  <meta name="description" content="Saksikan pertandingan bola gratis dan dapatkan info sepak bola terlengkap dengan klasemen liga, jadwal pertandingan, dan berita terbaru." />
  <meta name="keywords" content="nonton bola, sepak bola, jadwal bola, klasemen liga, streaming bola gratis" />
  <meta name="robots" content="index, follow" />
  <link rel="canonical" href="https://nontonbola.gratis/" />
  <link rel="amphtml" href="https://nontonbola.gratis/amp/">
  <meta name="google-site-verification" content="MNKSlZZXejYPf9gVyVwFJuRB8x2wE5odz6f2MW28iek" />

  <!-- Open Graph untuk preview sosial media -->
  <meta property="og:title" content="Nonton Bola Gratis & Info Sepak Bola Terlengkap" />
  <meta property="og:description" content="Saksikan pertandingan bola gratis dan dapatkan info sepak bola terlengkap dengan klasemen liga, jadwal pertandingan, dan berita terbaru." />
  <meta property="og:type" content="website" />
  <meta property="og:url" content="https://nontonbola.gratis/" />
  <meta property="og:image" content="https://nontonbola.gratis/pngwing.png" />
  
  <!-- Twitter Card -->
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="twitter:title" content="Nonton Bola Gratis & Info Sepak Bola Terlengkap" />
  <meta name="twitter:description" content="Saksikan pertandingan bola gratis dan dapatkan info sepak bola terlengkap dengan klasemen liga, jadwal pertandingan, dan berita terbaru." />
  <meta name="twitter:image" content="https://nontonbola.gratis/pngwing.png" />
    <link rel="icon" href="https://nontonbola.gratis/bola.png" type="image/gif">
<style>
  body {
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  margin: 0;
  padding: 10px;
  background: #eef2f7;
  color: #222;
  transition: background-color 0.3s, color 0.3s;
  display: flex;
  flex-direction: column; /* Tambahkan ini */
  align-items: center;     /* Agar semua anak di tengah */
}
  body.dark {
    background: #121212;
    color: #eee;
  }

  .container {
    max-width: 500px;
    width: 100%;
    background: white;
    padding: 15px;
    border-radius: 8px;
    box-shadow: 0 0 10px rgba(0,0,0,0.1);
    transition: background-color 0.3s, color 0.3s;
  }
  body.dark .container {
    background: #1e1e1e;
    color: #eee;
  }

  .logo {
    text-align: center;
    margin-bottom: 10px;
  }
  .logo img {
    max-width: 400px;
  }

  h1 {
    text-align: center;
    margin-bottom: 15px;
  }

  select, button.toggle-dark {
    margin: 0 5px 15px 0;
    padding: 6px 10px;
    font-size: 0.9rem;
    border-radius: 4px;
    border: 1px solid #aaa;
    cursor: pointer;
  }
  button.toggle-dark {
    background: #2980b9;
    border: none;
    color: white;
  }
  body.dark button.toggle-dark {
    background: #3498db;
  }

  .league-title {
    text-align: center;
    font-weight: 600;
    margin-bottom: 5px;
    font-size: 1.1rem;
  }

  table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.75rem;
  }
  th, td {
    padding: 6px;
    border: 1px solid #ccc;
    text-align: center;
  }
  th {
    background-color: #2980b9;
    color: white;
  }
  body.dark th {
    background-color: #2980b9;
  }
  tr:nth-child(even) {
    background-color: #f2f9ff;
  }
  body.dark tr:nth-child(even) {
    background-color: #333;
  }

  img.logo-team {
    width: 14px;
    vertical-align: middle;
    margin-right: 4px;
  }

  #schedule-container {
    margin-top: 30px;
  }

  .match {
    background: #f9f9f9;
    border: 1px solid #ccc;
    margin-bottom: 8px;
    padding: 8px;
    font-size: 0.75rem;
  }
  body.dark .match {
    background: #2a2a2a;
    border-color: #444;
  }

  #countdown {
    margin: 10px 0 20px 0;
    font-size: 1rem;
    font-weight: 600;
    text-align: center;
  }
  .popup-overlay {
  position: fixed;
  top: 0; left: 0;
  width: 100%; height: 100%;
  background: rgba(0, 0, 0, 0.7);
  display: none;
  justify-content: center;
  align-items: center;
  z-index: 9999;
}

.popup-img {
  width: 100%;
  max-width: 500px;
  border-radius: 12px;
  box-shadow: 0 0 15px rgba(0,0,0,0.5);
  cursor: pointer;
  animation: popupAnim 0.4s ease-in-out;
}

.popup-close {
  position: absolute;
  top: 30px; right: 35px;
  font-size: 32px;
  font-weight: bold;
  color: white;
  cursor: pointer;
}

@keyframes popupAnim {
  from { transform: scale(0.8); opacity: 0; }
  to { transform: scale(1); opacity: 1; }
}
.logo img {
  width: 100%;
  max-width: 400px;
  height: auto;
}

@media (max-width: 768px) {
  .logo img {
    max-width: 450px;
  }
}

@media (max-width: 480px) {
  .logo img {
    max-width: 400px;
  }
}
#league-standings {
  overflow-x: auto; /* buat scroll horizontal kalau konten melebar */
  -webkit-overflow-scrolling: touch; /* agar scroll di iOS smooth */
}

</style>
</head>
<body>
<div id="popup-overlay" class="popup-overlay">
  <a href="https://nontonbola.gratis/cara-nonton-gratis" target="_blank">
    <img src="https://nontonbola.gratis/gifku.gif" alt="nontonbolagratis" class="popup-img" />
  </a>
  <span class="popup-close" onclick="closePopup()">&times;</span>
</div>
</div>
<div style="display: flex; justify-content: center; margin-bottom: 15px;">
  <a href="https://nontonbola.gratis/cara-nonton-gratis" target="_blank" style="display: inline-block;">
    <img src="https://nontonbola.gratis/gifku.gif" 
         alt="Banner Bola" 
         style="width: 100%; max-width: 500px; border-radius: 10px;" />
  </a>
</div>

<div style="display: flex; justify-content: center; margin-bottom: 15px;">
  <a href="https://nontonbola.gratis/cara-daftar" target="_blank" style="display: inline-block;">
    <img src="https://nontonbola.gratis/sbogif.gif" 
         alt="Banner Bola" 
         style="width: 100%; max-width: 500px; border-radius: 10px;" />
  </a>
</div>

<div class="container">
  <div class="logo">
    <img src="https://nontonbola.gratis/pngwing.png" alt="Logo Bola" />
  </div>
	
	
    
  
  <h1>Klasemen Liga & Jadwal Bola</h1>

  <div>
    <label for="league-select">Pilih Liga: </label>
    <select id="league-select">
      <option value="PL">Premier League (Inggris)</option>
      <option value="PD">La Liga (Spanyol)</option>
      <option value="SA">Serie A (Italia)</option>
      <option value="BL1">Bundesliga (Jerman)</option>
      <option value="FL1">Ligue 1 (Prancis)</option>
    </select>
    <button class="toggle-dark" id="toggle-dark">Mode Gelap</button>
  </div>

  <div id="league-standings">
    <!-- Klasemen akan dimuat di sini -->
  </div>
  <div id="schedule-container">
  <h2>Jadwal Pertandingan Terbaru</h2>
    <div id="countdown">Loading countdown...</div>
    <div id="matches-list">
      <!-- Jadwal pertandingan dimuat di sini -->
    </div>
</div>
</div>


<script>
  const leagueSelect = document.getElementById('league-select');
  const standingsDiv = document.getElementById('league-standings');
  const matchesList = document.getElementById('matches-list');
  const countdownEl = document.getElementById('countdown');
  const toggleDarkBtn = document.getElementById('toggle-dark');

  // Load klasemen sesuai pilihan liga
  async function loadStandings(leagueCode) {
    standingsDiv.innerHTML = "Loading klasemen...";
    try {
      const res = await fetch(`api/standings-proxy.php?league=${leagueCode}`);
      if(!res.ok) throw new Error("Gagal mengambil data klasemen");
      const data = await res.json();
      if (!data.standings || data.standings.length === 0) throw new Error("Data klasemen tidak tersedia");
      const table = data.standings[0].table;
      let html = `
        <div class="league-title">${leagueSelect.options[leagueSelect.selectedIndex].text}</div>
        <table>
          <thead>
            <tr>
              <th>Pos</th><th>Tim</th><th>P</th><th>M</th><th>S</th><th>K</th><th>GM</th><th>GK</th><th>Selisih</th><th>Poin</th>
            </tr>
          </thead>
          <tbody>
      `;
      for (const team of table) {
        html += `<tr>
          <td>${team.position}</td>
          <td><img class="logo-team" src="${team.team.crest}" alt="">${team.team.shortName}</td>
          <td>${team.playedGames}</td>
          <td>${team.won}</td>
          <td>${team.draw}</td>
          <td>${team.lost}</td>
          <td>${team.goalsFor}</td>
          <td>${team.goalsAgainst}</td>
          <td>${team.goalDifference}</td>
          <td>${team.points}</td>
        </tr>`;
      }
      html += `</tbody></table>`;
      standingsDiv.innerHTML = html;
    } catch(e) {
      standingsDiv.innerHTML = `<p style="color:red;">${e.message}</p>`;
    }
  }

  // Load jadwal pertandingan terbaru (ambil 5 pertandingan)
  async function loadMatches() {
    matchesList.innerHTML = "Loading jadwal...";
    try {
      const res = await fetch('api/standings-proxy.php?matches=1');
      if(!res.ok) throw new Error("Gagal mengambil data pertandingan");
      const data = await res.json();
      const matches = data.matches.slice(0, 5);
      matchesList.innerHTML = "";
      for (const match of matches) {
        const home = match.homeTeam.shortName || match.homeTeam.name;
        const away = match.awayTeam.shortName || match.awayTeam.name;
        const date = new Date(match.utcDate);
        const dateStr = date.toLocaleString('id-ID');
        const div = document.createElement('div');
        div.className = "match";
        div.textContent = `${home} vs ${away} — ${dateStr}`;
        matchesList.appendChild(div);
      }
      if (matches.length > 0) {
        startCountdown(matches[0].utcDate);
      } else {
        countdownEl.textContent = "Tidak ada pertandingan terbaru";
      }
    } catch(e) {
      matchesList.innerHTML = `<p style="color:red;">${e.message}</p>`;
      countdownEl.textContent = "";
    }
  }

  // Countdown menuju pertandingan (tanggal UTC)
  let countdownInterval;
  function startCountdown(matchUtc) {
    clearInterval(countdownInterval);
    function updateCountdown() {
      const now = new Date();
      const matchDate = new Date(matchUtc);
      const diff = matchDate - now;
      if (diff <= 0) {
        countdownEl.textContent = "Pertandingan sudah dimulai!";
        clearInterval(countdownInterval);
        return;
      }
      const hours = Math.floor(diff / 1000 / 60 / 60);
      const minutes = Math.floor((diff / 1000 / 60) % 60);
      const seconds = Math.floor((diff / 1000) % 60);
      countdownEl.textContent = `Pertandingan pertama dimulai dalam ${hours}j ${minutes}m ${seconds}d`;
    }
    updateCountdown();
    countdownInterval = setInterval(updateCountdown, 1000);
  }

  // Toggle dark mode
  toggleDarkBtn.addEventListener('click', () => {
    document.body.classList.toggle('dark');
  });

  leagueSelect.addEventListener('change', () => {
    loadStandings(leagueSelect.value);
  });

  // Load default data
  loadStandings(leagueSelect.value);
  loadMatches();
</script>
<script>
  window.onload = function() {
    setTimeout(function() {
      document.getElementById("popup-overlay").style.display = "flex";
    }, 2000); // muncul otomatis setelah 2 detik

    window.closePopup = function() {
      document.getElementById("popup-overlay").style.display = "none";
    };
  };
</script>
 
</body>
</html>

Latest requests

# Url Url Source Date
1 https://nontonbola.gratis/ 2026-10-17 21:17:44
2 https://auth.acog.org/OAuth/SignIn… 2026-10-17 21:17:44
3 https://binarenoptionthiergartenu.… 2026-10-17 21:17:43
4 https://auth.acog.org/OAuth/SignIn… 2026-10-17 21:17:43
5 https://www.thebolditalic.com/?gi=… 2026-10-17 21:17:42
6 https://auth.acog.org/OAuth/SignIn… 2026-10-17 21:17:42
7 https://www.thebolditalic.com/?gi=… 2026-10-17 21:17:42
8 https://www.thebolditalic.com/?gi=… 2026-10-17 21:17:42
9 https://www.thebolditalic.com/?gi=… 2026-10-17 21:17:41
10 https://auth.acog.org/OAuth/SignIn… 2026-10-17 21:17:40
11 https://analnoe.com/user/pencilsca… 2026-10-17 21:17:40
12 https://www.thebolditalic.com/?gi=… 2026-10-17 21:17:40
13 https://auth.acog.org/OAuth/SignIn… 2026-10-17 21:17:40
14 https://auth.acog.org/OAuth/SignIn… 2026-10-17 21:17:40
15 https://civicvoice.org.uk/ 2026-10-17 21:17:39
16 https://www.thebolditalic.com/?gi=… 2026-10-17 21:17:39
17 https://www.texarkanatwins.com/%25… 2026-10-17 21:17:39
18 https://coeurdevoyageur.blogspot.c… 2026-10-17 21:17:39
19 https://auth.acog.org/OAuth/SignIn… 2026-10-17 21:17:38
20 https://www.thebolditalic.com/?gi=… 2026-10-17 21:17:38