|
8 | 8 | <link rel="stylesheet" href="index.css"> |
9 | 9 | <script src="https://cdn.jsdelivr.net/npm/@unocss/runtime"></script> |
10 | 10 | </head> |
11 | | -<body class="bg-gray-900 text-white flex flex-col items-center justify-center min-h-screen font-sans p-4"> |
| 11 | +<body> |
12 | 12 |
|
13 | | - <!-- ヘッダー部分 --> |
14 | | - <div class="flex flex-col md:flex-row items-center space-x-0 md:space-x-2 space-y-2 md:space-y-0"> |
15 | | - <div class="animate-spin text-4xl sm:text-5xl md:text-6xl">🌍</div> |
16 | | - <h1 class="text-2xl sm:text-3xl md:text-4xl font-bold">最新の地震・津波情報</h1> |
| 13 | + <!-- ヘッダー --> |
| 14 | + <div class="header"> |
| 15 | + <div class="spin-slow">🌍</div> |
| 16 | + <h1>最新の地震・津波情報</h1> |
17 | 17 | </div> |
18 | 18 |
|
19 | 19 | <!-- タブメニュー --> |
20 | | - <div class="flex mt-4 space-x-4"> |
21 | | - <button id="tab-earthquake" class="tab-button active">地震情報</button> |
22 | | - <button id="tab-tsunami" class="tab-button">津波情報</button> |
| 20 | + <div class="tab-menu"> |
| 21 | + <button class="tab-button active" data-tab="earthquake">地震情報</button> |
| 22 | + <button class="tab-button" data-tab="tsunami">津波情報</button> |
23 | 23 | </div> |
24 | 24 |
|
25 | | - <!-- 情報エリア --> |
26 | | - <div id="earthquake-info" class="info-tab"></div> |
27 | | - <div id="tsunami-info" class="info-tab hidden"></div> |
28 | | - |
29 | | - <footer class="mt-4 text-sm text-gray-400">Developer By Kaede</footer> |
30 | | - |
31 | | - <script> |
32 | | - // 📌 震度の変換マップ |
33 | | - function convertIntensity(scale) { |
34 | | - const intensityMap = { |
35 | | - 10: '震度1', 20: '震度2', 30: '震度3', |
36 | | - 40: '震度4', 45: '震度5弱', 50: '震度5強', |
37 | | - 55: '震度6弱', 60: '震度6強', 70: '震度7' |
38 | | - }; |
39 | | - return intensityMap[scale] || '情報なし'; |
40 | | - } |
41 | | - |
42 | | - // 📌 日時のフォーマット処理 |
43 | | - function formatDateTime(dateString) { |
44 | | - try { |
45 | | - const date = new Date(dateString); |
46 | | - if (isNaN(date.getTime())) return '情報なし'; |
47 | | - return date.toLocaleString('ja-JP', { |
48 | | - year: 'numeric', month: '2-digit', day: '2-digit', |
49 | | - hour: '2-digit', minute: '2-digit', second: '2-digit' |
50 | | - }); |
51 | | - } catch (error) { |
52 | | - console.error('日時の変換エラー:', error); |
53 | | - return '情報なし'; |
54 | | - } |
55 | | - } |
56 | | - |
57 | | - // 📌 震度ごとのボーダーカラーを決定 |
58 | | - function getBorderClass(intensity) { |
59 | | - if (intensity >= 70) return "border-t-purple-500 border-b-purple-500"; // 震度7 |
60 | | - if (intensity >= 60) return "border-t-red-500 border-b-red-500"; // 震度6 |
61 | | - if (intensity >= 50) return "border-t-yellow-500 border-b-yellow-500"; // 震度5 |
62 | | - return "border-t-gray-600 border-b-gray-600"; // 震度4以下 |
63 | | - } |
64 | | - |
65 | | - // 📌 地震情報を取得 |
66 | | - function fetchEarthquakeInfo() { |
67 | | - fetch('https://api.p2pquake.net/v2/history?codes=551&limit=2') |
68 | | - .then(response => response.json()) |
69 | | - .then(data => { |
70 | | - const infoDiv = document.getElementById('earthquake-info'); |
71 | | - if (!data || data.length === 0) { |
72 | | - infoDiv.innerHTML = '<p class="text-center">地震情報が見つかりませんでした。</p>'; |
73 | | - return; |
74 | | - } |
75 | | - |
76 | | - let content = ""; |
77 | | - data.forEach(earthquake => { |
78 | | - const hypocenter = earthquake.earthquake?.hypocenter?.name || '情報なし'; |
79 | | - const magnitude = earthquake.earthquake?.hypocenter?.magnitude?.toFixed(1) || '情報なし'; |
80 | | - const maxIntensity = earthquake.earthquake?.maxScale || 0; |
81 | | - const time = earthquake.earthquake?.time || '情報なし'; |
82 | | - const borderClass = getBorderClass(maxIntensity); |
83 | | - |
84 | | - content += ` |
85 | | - <div class="w-full max-w-md p-4 bg-gray-800 rounded-lg shadow-lg text-center my-2 border-4 ${borderClass}"> |
86 | | - <p><strong>震源地:</strong> ${hypocenter}</p> |
87 | | - <p><strong>マグニチュード:</strong> ${magnitude}</p> |
88 | | - <p><strong>最大震度:</strong> ${convertIntensity(maxIntensity)}</p> |
89 | | - <p><strong>発生日時:</strong> ${formatDateTime(time)}</p> |
90 | | - </div> |
91 | | - `; |
92 | | - }); |
93 | | - |
94 | | - infoDiv.innerHTML = content; |
95 | | - }) |
96 | | - .catch(error => { |
97 | | - console.error('エラー:', error); |
98 | | - document.getElementById('earthquake-info').innerHTML = '<p class="text-center">データの取得に失敗しました。</p>'; |
99 | | - }); |
100 | | - } |
101 | | - |
102 | | - // 📌 津波情報を取得 |
103 | | - function fetchTsunamiInfo() { |
104 | | - fetch('https://www.data.jma.go.jp/developer/xml/feed/eqvol_l.xml') |
105 | | - .then(response => response.text()) |
106 | | - .then(str => new window.DOMParser().parseFromString(str, "text/xml")) |
107 | | - .then(data => { |
108 | | - const items = data.querySelectorAll("entry"); |
109 | | - let content = ""; |
110 | | - |
111 | | - items.forEach(item => { |
112 | | - const title = item.querySelector("title")?.textContent || "情報なし"; |
113 | | - const link = item.querySelector("link")?.getAttribute("href") || "#"; |
114 | | - |
115 | | - if (title.includes("津波")) { |
116 | | - content += ` |
117 | | - <div class="w-full max-w-md p-4 bg-blue-800 rounded-lg shadow-lg text-center my-2"> |
118 | | - <p><strong>${title}</strong></p> |
119 | | - <p><a href="${link}" class="text-blue-300 underline" target="_blank">詳細を見る</a></p> |
120 | | - </div> |
121 | | - `; |
122 | | - } |
123 | | - }); |
124 | | - |
125 | | - document.getElementById('tsunami-info').innerHTML = content || '<p class="text-center">津波情報はありません。</p>'; |
126 | | - }) |
127 | | - .catch(error => { |
128 | | - console.error('エラー:', error); |
129 | | - document.getElementById('tsunami-info').innerHTML = '<p class="text-center">データの取得に失敗しました。</p>'; |
130 | | - }); |
131 | | - } |
| 25 | + <!-- 地震情報 --> |
| 26 | + <div id="earthquake-info" class="info-tab active"> |
| 27 | + <p>地震情報を取得中...</p> |
| 28 | + </div> |
132 | 29 |
|
133 | | - // 📌 初回データ取得 |
134 | | - fetchEarthquakeInfo(); |
135 | | - fetchTsunamiInfo(); |
| 30 | + <!-- 津波情報 --> |
| 31 | + <div id="tsunami-info" class="info-tab"> |
| 32 | + <p>津波情報を取得中...</p> |
| 33 | + </div> |
136 | 34 |
|
137 | | - // 📌 タブ切り替え |
138 | | - document.getElementById('tab-earthquake').addEventListener('click', () => { |
139 | | - document.getElementById('earthquake-info').classList.remove('hidden'); |
140 | | - document.getElementById('tsunami-info').classList.add('hidden'); |
141 | | - }); |
| 35 | + <footer>Developer By Kaede</footer> |
142 | 36 |
|
143 | | - document.getElementById('tab-tsunami').addEventListener('click', () => { |
144 | | - document.getElementById('earthquake-info').classList.add('hidden'); |
145 | | - document.getElementById('tsunami-info').classList.remove('hidden'); |
146 | | - }); |
147 | | - </script> |
| 37 | + <script src="script.js"></script> |
148 | 38 | </body> |
149 | 39 | </html> |
0 commit comments