diff --git a/system/test/index.html b/system/test/index.html new file mode 100644 index 0000000..afcd769 --- /dev/null +++ b/system/test/index.html @@ -0,0 +1,25 @@ + + + + + + イベントページ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/system/test/script.js b/system/test/script.js new file mode 100644 index 0000000..8295f91 --- /dev/null +++ b/system/test/script.js @@ -0,0 +1,113 @@ +// GASからJSONデータを取得してHTML要素を生成する +async function fetchAndGenerateData() { + const response = await fetch('https://script.google.com/macros/s/AKfycbyeQSlJhKhBvzVIDANf8YJK147WA0Rzh55yhzl0a_73_YYQJnLFm02QGlnx3xE9W_60Bw/exec'); + const jsonData = await response.json(); + // HTML内の要素を取得 + const nameElement = document.getElementById('name'); + const eventContainer = document.getElementById('eventContainer'); + + nameElement.textContent = jsonData[0].areaID; + + const categories = {}; + // JSONデータをもとに要素を生成 + for (const data of jsonData) { + const category = data.category; + if (!categories[category]) { + categories[category] = []; + } + categories[category].push(data); + } + + for (const category in categories) { + const categoryId = categories[category].length; + const categoryContainer = createCategoryContainer(category, categoryId); + + // カテゴリーごとにメニューを追加できるようにした + for (const data of categories[category]) { + const eventDiv = createEventElement(data); + categoryContainer.appendChild(eventDiv); + } + eventContainer.appendChild(categoryContainer); + } +} + +// カテゴリーごとのコンテナを生成 +function createCategoryContainer(category, categoryId) { + const categoryContainer = document.createElement('div'); + categoryContainer.classList.add('categoryContainer'); + + const h2 = document.createElement('h2'); + h2.classList.add('category'); + h2.textContent = category; + h2.id = `category-${categoryId}`; + eventContainer.appendChild(h2); + + const navLink = document.createElement('a'); + navLink.href = `#category-${categoryId}`; + navLink.textContent = category; + const navItem = document.createElement('li'); + navItem.appendChild(navLink); + document.querySelector('.navbar ul').appendChild(navItem); + + return categoryContainer; +} + +// イベント要素を生成 +function createEventElement(data) { + const div = document.createElement('div'); + div.classList.add('event-item'); + + if (data.pageLink) { + const a = document.createElement('a'); + a.href = data.pageLink; + a.target = '_blank'; + div.appendChild(a); + + const img = createImageElement(data.img); + a.appendChild(img); + } else { + const img = createImageElement(data.img); + div.appendChild(img); + } + + const h3 = createHeadingElement('h3', 'eventName', data.eventName); + div.appendChild(h3); + + if (data.location) { + const p1 = createParagraphElement('p', 'location', `場所: ${data.location}`); + div.appendChild(p1); + } + + if (data.date) { + const p2 = createParagraphElement('p', 'date', `開催期間: ${data.date}${data.inSession === 'O' ? ' (終了)' : ''}`); + div.appendChild(p2); + } + + return div; +} + +// 画像要素を生成 +function createImageElement(imgSrc) { + const img = document.createElement('img'); + img.src = imgSrc; + return img; +} + +// ヘッディング要素を生成 +function createHeadingElement(tag, className, textContent) { + const element = document.createElement(tag); + element.classList.add(className); + element.textContent = textContent; + return element; +} + +// 段落要素を生成 +function createParagraphElement(tag, className, textContent) { + const element = document.createElement(tag); + element.classList.add(className); + element.textContent = textContent; + return element; +} + +// ページ読み込み時にJSONデータを取得してHTML要素を生成 +window.addEventListener('DOMContentLoaded', fetchAndGenerateData); diff --git a/system/test/style.css b/system/test/style.css new file mode 100644 index 0000000..2cdedcf --- /dev/null +++ b/system/test/style.css @@ -0,0 +1,155 @@ +html{ + scroll-behavior: smooth; + scroll-padding-top: 100px; +} + +body { + font-family: 'Noto Sans JP', sans-serif; + margin: 0; + padding: 0; + background-color: #f4f4f4; + width: 100%; +} + +p{ + margin: 2% 2%; + font-size:clamp(0.875rem, 0.818rem + 0.24vw, 1rem); +} + +.navbar { + background-color: #02465b; + color: #f4f4f4; + width: 100%; + position: sticky;/* 2行だけの記述でfixedと同じ配置ができる*/ + top: 0; + z-index: 100; + box-shadow: 0px 4px 8px #adadad; +} + +.barContainer { + width: 80%; + margin: auto; + padding: 1em 0; + display: flex; + justify-content: space-between; + align-items: center; +} + +.navbar h1 { + margin: 0; + padding: 0; + font-size: clamp(1.75rem, 1.693rem + 0.24vw, 1.875rem); +} + +.navbar nav ul { + list-style: none; + margin: 0; + padding: 0; + display: flex; +} + +.navbar nav ul li { + margin-right: 1em; +} + +.navbar nav ul li a { + text-decoration: none; + color: #f4f4f4; +} + +.navbar nav ul li a:hover { + border-bottom: 2px solid #ccb540; +} + +/* ここまでは共通で記載する */ +.category{ + border-bottom: 1px solid #acacac; + width: 100%; +} +.categoryContainer{ + display: grid; + grid-template-columns: repeat(auto-fit, 300px); + justify-content: center; + grid-gap:1em; + /* + ウィンドウに合わせて自動で改行(中央揃え左揃え)を再現するにはflexboxでは難しかった。 + flex-wrap:wrapとjustify-content:centerでは改行した時に真ん中配置から始まっちゃう(>_<) + しかし、gridなら4行でいけた。もっと短くできるかも。 + */ +} +#eventContainer { + width: 98%; + margin:0 auto; +} + +.event-item { + background-color: #ffffff; + border-radius: 10px; + box-shadow: 0px 0px 8px #acacac; + padding: 0; + text-align: center; + width: 100%; + margin: .5em auto; +} + +.event-item:hover { + transform: scale(1.1); + transition: transform 0.3s ease; +} + +.event-item img { + width: 100%; + height: 25vh; + object-fit: cover; + border-radius: 10px 10px 0 0 ; + padding: 0; +} + +.event-item a img:hover{ + opacity:0.5; +} + +.event-item h3 { + font-size: clamp(1rem, 0.943rem + 0.24vw, 1.125rem); + margin: 0 1em; + border-bottom: 2px solid #acacac; + text-align: center; +} + +@media screen and (max-width: 1036px){ + .navbar{ + width: 100%; + } + #eventContainer{ + width: 95%; + margin: 0 auto; + } + .category{ + width: 80%; + margin: 1em auto; + } + + @media screen and (max-width: 820px){ + .category{ + text-align: center; + } + .barContainer { + width: 80%; + margin: auto; + padding: 1em 0; + flex-direction: column; + } + + @media screen and (max-width: 430px){ + .categoryContainer{ + display: block; + } + .event-item{ + width: 90%; + margin-bottom: 10%; + } + .barContainer { + width: 95%; + } + } +} \ No newline at end of file