<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>仮想ギルド掲示板「ドラゴンズクレスト」</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
:root {
--bg: #1c1c2b;
--panel: #2e2e4d;
--card: #3a3a5f;
--accent: #6c63ff;
--text: #fff;
}
body {
margin: 0;
font-family: "Segoe UI", sans-serif;
background: var(--bg);
color: var(--text);
}
header {
background: var(--panel);
padding: 20px;
text-align: center;
font-size: 1.8em;
}
nav {
display: flex;
justify-content: center;
gap: 20px;
background: var(--card);
padding: 10px;
}
nav button {
background: transparent;
border: none;
color: #ddd;
font-size: 1em;
padding: 10px 20px;
cursor: pointer;
}
nav button.active {
border-bottom: 2px solid var(--accent);
color: var(--accent);
}
.container {
display: grid;
grid-template-columns: 1fr 250px;
gap: 20px;
max-width: 1200px;
margin: 20px auto;
padding: 0 10px;
}
.main {
background: var(--card);
padding: 20px;
border-radius: 12px;
}
.sidebar {
background: var(--card);
padding: 15px;
border-radius: 12px;
}
.post-form textarea {
width: 100%;
height: 80px;
border-radius: 6px;
padding: 10px;
border: none;
resize: vertical;
}
.post-form button {
margin-top: 10px;
padding: 10px 20px;
background: var(--accent);
border: none;
border-radius: 6px;
color: #fff;
cursor: pointer;
}
.post {
background: #404070;
border-radius: 10px;
padding: 15px;
margin-top: 15px;
display: flex;
gap: 10px;
flex-direction: row;
}
.avatar {
width: 40px;
height: 40px;
border-radius: 50%;
background: #6c63ff;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
}
.post-content {
flex: 1;
}
.meta {
font-size: 0.9em;
color: #aaa;
margin-bottom: 5px;
}
.actions button {
margin-right: 8px;
background: #5a5a8f;
border: none;
color: white;
padding: 4px 10px;
border-radius: 4px;
cursor: pointer;
font-size: 0.8em;
}
.reply-area {
margin-top: 10px;
}
.reply-area textarea {
width: 100%;
height: 50px;
margin-top: 5px;
padding: 6px;
border-radius: 4px;
border: none;
}
.reply {
margin-top: 5px;
font-size: 0.85em;
color: #ddd;
}
.guild-info, .members, .guild-schedule, .guild-rules {
margin-bottom: 20px;
}
.members ul {
list-style: none;
padding: 0;
}
.members li {
padding: 5px 0;
}
.members li.online::before {
content: "●";
color: #7fff7f;
margin-right: 5px;
}
.members li.offline::before {
content: "●";
color: #888;
margin-right: 5px;
}
@media (max-width: 800px) {
.container {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<header>仮想ギルド掲示板「ドラゴンズクレスト」</header>
<nav>
<button class="tab-button active" onclick="switchTab('general')">🏰 雑談</button>
<button class="tab-button" onclick="switchTab('raid')">⚔️ レイド</button>
<button class="tab-button" onclick="switchTab('trade')">💰 取引</button>
</nav>
<div class="container">
<div class="main">
<div class="post-form">
<textarea id="postText" placeholder="ギルドのみんなに伝えたいことは?"></textarea>
<button onclick="postMessage()">投稿する</button>
</div>
<div id="general" class="tab-content">
<!-- 投稿はここに追加されます -->
</div>
<div id="raid" class="tab-content" style="display:none;"></div>
<div id="trade" class="tab-content" style="display:none;"></div>
</div>
<div class="sidebar">
<div class="guild-info">
<h3>ギルド情報</h3>
<p>設立:2025年<br>メンバー数:32名<br>ギルマス:Reina</p>
</div>
<div class="guild-schedule">
<h3>今週のスケジュール</h3>
<ul>
<li>🗓️ 7月12日(土) 21:00〜:レイド「闇の塔」</li>
<li>🗓️ 7月14日(月) 22:00〜:PvP練習会</li>
<li>🗓️ 7月16日(水) 20:00〜:定例会議</li>
</ul>
</div>
<div class="guild-rules">
<h3>ギルドルール</h3>
<ol>
<li>他プレイヤーへの迷惑行為禁止</li>
<li>無断脱退・長期不在時は一言ください</li>
<li>レイド参加は20分前集合!</li>
</ol>
</div>
<div class="members">
<h3>メンバー(抜粋)</h3>
<ul>
<li class="online">Reina</li>
<li class="online">Shiro</li>
<li class="offline">Yuna</li>
<li class="online">Kuro</li>
<li class="offline">Mika</li>
</ul>
</div>
</div>
</div>
<script>
function postMessage() {
const textarea = document.getElementById("postText");
const content = textarea.value.trim();
if (!content) return;
const now = new Date().toLocaleString("ja-JP", { hour12: false });
const post = document.createElement("div");
post.className = "post";
post.innerHTML = `
<div class="avatar">Y</div>
<div class="post-content">
<div class="meta">あなた | ${now}</div>
<div class="content">${content.replace(/\n/g, "<br>")}</div>
<div class="actions">
<button onclick="likePost(this)">👍 <span>0</span></button>
<button onclick="toggleReply(this)">💬 返信</button>
<button onclick="deletePost(this)">🗑 削除</button>
</div>
<div class="reply-area" style="display:none;">
<textarea placeholder="返信を書く..."></textarea>
<button onclick="submitReply(this)">返信する</button>
</div>
<div class="replies"></div>
</div>
`;
const activeTab = document.querySelector(".tab-button.active").textContent.trim();
const tabId = activeTab.includes("雑談") ? "general" : activeTab.includes("レイド") ? "raid" : "trade";
document.getElementById(tabId).prepend(post);
textarea.value = "";
}
function switchTab(tabId) {
document.querySelectorAll(".tab-content").forEach(tab => tab.style.display = "none");
document.querySelectorAll(".tab-button").forEach(btn => btn.classList.remove("active"));
document.getElementById(tabId).style.display = "block";
event.target.classList.add("active");
}
function likePost(button) {
const span = button.querySelector("span");
span.textContent = parseInt(span.textContent) + 1;
}
function toggleReply(button) {
const replyArea = button.parentElement.nextElementSibling;
replyArea.style.display = replyArea.style.display === "none" ? "block" : "none";
}
function submitReply(button) {
const textarea = button.previousElementSibling;
const replyText = textarea.value.trim();
if (!replyText) return;
const replyDiv = document.createElement("div");
replyDiv.className = "reply";
replyDiv.innerHTML = `<small>あなた: ${replyText}</small>`;
button.closest(".post-content").querySelector(".replies").appendChild(replyDiv);
textarea.value = "";
}
function deletePost(button) {
if (confirm("この投稿を削除しますか?")) {
button.closest(".post").remove();
}
}
</script>
</body>
</html>