您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
日向坂46 ルックアンドフィール
此脚本不应直接安装,它是供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyforks.org/scripts/532855/1594533/hinatazaka46-lookandfeel.js
// ==UserScript== // @name hinatazaka46-lookandfeel // @namespace https://greasyforks.org/ja/users/1328592-naoqv // @description 日向坂46 ルックアンドフィール // @version 0.28 // @require https://cdn.jsdelivr.net/npm/[email protected]/libs/lz-string.min.js // @icon https://cdn.hinatazaka46.com/files/14/hinata/img/favicons/favicon-32x32.png // @compatible chrome // @compatible firefox // @grant none // @license MIT // ==/UserScript== const PAGE_TYPE_ERROR_MSG = "Processing of out-of-scope pages. Check the settings @match."; const isMobile = () => { const userAgent = navigator.userAgent || navigator.vendor || window.opera; const mobileRegex = /Android|iPhone|iPad|iPod|BlackBerry|Windows Phone|Opera Mini|IEMobile/i; return mobileRegex.test(userAgent) || window.matchMedia("only screen and (max-width: 768px)").matches; } /* * inlineスタイルを適用 * @param {string} styleText - スタイル定義 */ document.appendStyle = (styleText) => { const styleElem = document.createElement("style"); styleElem.setAttribute("rel", "stylesheet"); styleElem.textContent = styleText; document.head.appendChild(styleElem); }; /* * スクロールダウン時にメニューバー細める */ const slimDownMenuBar = () => { const styleElem = document.createElement("style"); styleElem.setAttribute("rel", "stylesheet"); const styleText = `.l-header { height: 55px; } .p-header-wrap.is-fixed .p-header { height: 30px; } .c-header__logo { top: 5px; width: 155px; } .p-header.p-header__in { height: 60px; position: relative; } nav.p-menu.p-menu--pc { position: absolute; top: 50%; transform: translateY(-50%); }`; styleElem.textContent = styleText; document.head.appendChild(styleElem); }; const COLOR_MODE = {DEFAULT_COLOR: "0", DARK_COLOR: "1"}; /** * カラーモードを取得 * @returns {string} カラーモード */ const getColorMode = () => { let currentMode = CookieUtils.getCookie('color_mode'); if (currentMode !== "0" && currentMode !== "1") { currentMode = COLOR_MODE.DEFAULT_COLOR; } return currentMode; } /** * カラーモードを設定 * @param {string} mode - カラーモード */ const setColorMode = (mode) => { if (mode !== COLOR_MODE.DEFAULT_COLOR && mode !== COLOR_MODE.DARK_COLOR) { throw new Error("Illegal parameter error. [HinatazakaSigthtStyleUtils#setColorMode]"); } CookieUtils.setCookie('color_mode', mode); }; /** * カラーモードを切り替える * @returns {string} 切り替え後のカラーモード */ const toggleColorMode = () => { const mode = ((parseInt(getColorMode()) + 1) % 2).toString(); setColorMode(mode); return mode; }; const DEFAULT_BLUE = '#8cc8d1'; const DEFAULT_FONT_CL = "#8babab"; const DEFAULT_TITLE_FONT_CL ="#abbaba"; const DARK_FONT_CL = "#eeeeee"; const DARK_BG_CL = "#202040"; const DARK_MENU_CL = "#404070"; const DARK_SVG_CL = "#eeeeee"; const DARK_IMG_BG_CL = "#eeeeee"; const HOVER_BG_UPPER_CL = "#5bbee4"; const HOVER_BG_LOWER_CL = "#ebf4f7"; const HOVER_BORDER_CL = "#5bbee4"; const DARK_HOVER_BG_UPPER_CL = "#20cccc"; const DARK_HOVER_BG_LOWER_CL = "#202050"; const DARK_PAST_BG_CL = "#303040"; const DARK_TODAY_UPPER_CL = "#30aaaa"; const DARK_TODAY_LOWER_CL = "#303050"; const DARK_HOVER_BORDER_CL = "#79fcfc"; const DARK_STRONG_FONT_CL = 'crimson'; const DARK_STRONG_BG_CL = 'aquamarine'; const DARK_FC_TEXT_CL = 'rgb(99, 103, 103)'; const KEY_BACKGROUND = "backGround"; const KEY_MENUBAR = "manuBar"; const KEY_BREADCRUMB = "breadcrumb"; const KEY_LIST = "list"; const KEY_ARTICLE = "article"; const KEY_PASTDAY = "pastday"; const KEY_TODAY = "today"; const KEY_MEMBER_PROP = "memberProp"; const KEY_SVG_PATH = "svgPath"; const KEY_BLOG = "blog"; const KEY_STRONG = "strong"; const KEY_DISCO = "disco"; const KEY_AFTER = "after"; const KEY_BIOGRAPHY = "biography"; const KEY_FC_LOGO = "fc_logo"; const KEY_FC_TEXT = "fc_text"; const KEYS = [KEY_BACKGROUND, KEY_MENUBAR, KEY_BREADCRUMB, KEY_LIST, KEY_ARTICLE, KEY_PASTDAY, KEY_TODAY, KEY_MEMBER_PROP, KEY_SVG_PATH, KEY_BLOG, KEY_STRONG, KEY_DISCO, KEY_AFTER, KEY_BIOGRAPHY, KEY_FC_LOGO, KEY_FC_TEXT]; const SELECTOR_DIC = {}; SELECTOR_DIC[KEY_BACKGROUND] = '.pages, .module-modal.js-member-filter .mordal-box, .l-container, .schedule__list-future'; SELECTOR_DIC[KEY_MENUBAR] = '.l-header, .p-header-wrap, .p-header-wrap.is-fixed'; SELECTOR_DIC[KEY_BREADCRUMB] = '.p-page-breadcrumb__list, .c-page-breadcrumb__item:last-child span'; SELECTOR_DIC[KEY_LIST] = '.l-container, .p-news__list '; SELECTOR_DIC[KEY_ARTICLE] = '.c-blog-main__title, .c-blog-main__date, .c-article__title, .p-article__text, .p-article__text span, .c-blog-article__text div *, .c-blog-article__text p span, .tbcms_program-detail__inner p, .c-tv-backnumber-kiji-time, .c-tv-backnumber-kiji-text'; SELECTOR_DIC[KEY_PASTDAY] = '.schedule__list-pastday'; SELECTOR_DIC[KEY_TODAY] = '.schedule__list-today'; SELECTOR_DIC[KEY_MEMBER_PROP] = '.c-member__name, .c-member__name--info, .c-member__info-td__text, .c-blog-member__name, .c-blog-member__info-td__text, .c-mamber__category_title span, .c-section-title--member-name'; SELECTOR_DIC[KEY_SVG_PATH] = '.c-member__info-td__text a svg path'; SELECTOR_DIC[KEY_BLOG] = '.l-maincontents--blog, .p-blog-entry__group, .p-blog-entry__list, .s-blog__index, .p-blog-group, .p-blog-entry__list'; SELECTOR_DIC[KEY_STRONG] = '.p-article__text strong span, .p-article__text span strong'; SELECTOR_DIC[KEY_DISCO] = '.formation_image li i, .c-page-breadcrumb__item, .c-disco__title, .c-disco__date, .c-video-detail__title, .formation_image li i'; SELECTOR_DIC[KEY_AFTER] = '.l-other-contents--blog'; SELECTOR_DIC[KEY_BIOGRAPHY] = '.p-biography__text'; SELECTOR_DIC[KEY_FC_LOGO] = '.fc-logo'; SELECTOR_DIC[KEY_FC_TEXT] = '.fc-contents .text'; const CSS_DIC = {}; CSS_DIC[KEY_BACKGROUND] = new Array('background-color'); CSS_DIC[KEY_MENUBAR] = new Array('background-color'); CSS_DIC[KEY_BREADCRUMB] = new Array('color'); CSS_DIC[KEY_LIST] = new Array('color'); CSS_DIC[KEY_ARTICLE] = new Array('color'); CSS_DIC[KEY_PASTDAY] = new Array('background-color'); CSS_DIC[KEY_TODAY] = new Array('background'); CSS_DIC[KEY_MEMBER_PROP] = new Array('color'); CSS_DIC[KEY_SVG_PATH] = new Array('fill'); CSS_DIC[KEY_BLOG] = new Array('color', 'background-color'); CSS_DIC[KEY_STRONG] = new Array('color', 'background-color'); CSS_DIC[KEY_DISCO] = new Array('color'); CSS_DIC[KEY_AFTER] = new Array('color', '--bg-color'); CSS_DIC[KEY_BIOGRAPHY] = new Array('color'); CSS_DIC[KEY_FC_LOGO] = new Array('background-color'); CSS_DIC[KEY_FC_TEXT] = new Array('color'); const DEFAULT_COLOR_CONFIG = {}; const DARK_COLOR_CONFIG = {}; DARK_COLOR_CONFIG[KEY_BACKGROUND] = {"background-color": DARK_BG_CL}; DARK_COLOR_CONFIG[KEY_MENUBAR] = {"background-color": DARK_MENU_CL}; DARK_COLOR_CONFIG[KEY_BREADCRUMB] = {"color": DARK_FONT_CL}; DARK_COLOR_CONFIG[KEY_LIST] = {"color": DARK_FONT_CL}; DARK_COLOR_CONFIG[KEY_ARTICLE] = {"color": DARK_FONT_CL}; DARK_COLOR_CONFIG[KEY_PASTDAY] = {"background-color": DARK_PAST_BG_CL}; DARK_COLOR_CONFIG[KEY_TODAY] = {"background": `linear-gradient(${DARK_TODAY_UPPER_CL}, 10%, ${DARK_TODAY_LOWER_CL})`}; DARK_COLOR_CONFIG[KEY_MEMBER_PROP] = {"color": DARK_FONT_CL}; DARK_COLOR_CONFIG[KEY_SVG_PATH] = {"fill": DARK_SVG_CL}; DARK_COLOR_CONFIG[KEY_BLOG] = {"color": DARK_FONT_CL, "background-color": DARK_BG_CL}; DARK_COLOR_CONFIG[KEY_STRONG] = {"color": DARK_STRONG_FONT_CL, "background-color": DARK_STRONG_BG_CL}; DARK_COLOR_CONFIG[KEY_DISCO] = {"color": DARK_FONT_CL}; DARK_COLOR_CONFIG[KEY_AFTER] = {"color": DARK_FONT_CL, "--bg-color": DARK_BG_CL}; DARK_COLOR_CONFIG[KEY_BIOGRAPHY] = {"color": DARK_FONT_CL}; DARK_COLOR_CONFIG[KEY_FC_LOGO] = {"background-color": DARK_IMG_BG_CL}; DARK_COLOR_CONFIG[KEY_FC_TEXT] = {"color": DARK_FC_TEXT_CL}; /* * cssプロパティの値を取得 * @param {string} selector - cssセレクタ * @param {string} cssProperty - cssプロパティ名 * @return {string} cssプロパティの値 */ const getSelectorStyle = (selector, cssProperty) => (((element, cssProperty) => (element != null) ? getComputedStyle(element).getPropertyValue(cssProperty) : 'rgb(0, 0, 0)')(document.querySelector(selector), cssProperty)); const getBeforeFirstComma = (str) => { const index = str.indexOf(","); return index !== -1 ? str.slice(0, index) : str; }; const COLOR_CONFIGS = []; const analyzeDefaultColor = () => { Array.prototype.forEach.call(KEYS, (k) => { DEFAULT_COLOR_CONFIG[k] = {}; Array.prototype.forEach.call(CSS_DIC[k], (c) => { DEFAULT_COLOR_CONFIG[k][c] = getSelectorStyle(getBeforeFirstComma(SELECTOR_DIC[k]), c); }); }); COLOR_CONFIGS.push(DEFAULT_COLOR_CONFIG, DARK_COLOR_CONFIG); }; const setMenuFontColor = (selector, originColor = DEFAULT_BLUE) => { Array.prototype.forEach.call(document.querySelectorAll(selector), (x) => { x.style.color = originColor; x.addEventListener('mouseover', () => { if (getColorMode() === COLOR_MODE.DARK_COLOR) { x.style.color = '#e0ffff'; } else { x.style.color = '#5d5d5d'; } }); x.addEventListener('mouseout', () => { x.style.color = originColor; }); }); }; const setHoveredFontColor = (itemSelector, titleSelector, datetimeSelector) => { Array.prototype.forEach.call(document.querySelectorAll(itemSelector), (x) => { x.addEventListener('mouseover', () => { if (getColorMode() === COLOR_MODE.DARK_COLOR) { x.querySelector(titleSelector).style.color = `${DARK_FONT_CL}`; const datetime = x.querySelector(datetimeSelector); if (datetime) { datetime.style.color = `${DARK_FONT_CL}`;} } else { x.querySelector(titleSelector).style.color = `${DEFAULT_FONT_CL}`; const datetime = x.querySelector(datetimeSelector); if (datetime) { datetime.style.color = `${DEFAULT_FONT_CL}`;} } }); }); Array.prototype.forEach.call(document.querySelectorAll(itemSelector), (x) => { x.addEventListener('mouseout', () => { x.querySelector(titleSelector).style.color = `${DEFAULT_TITLE_FONT_CL}`; const datetime = x.querySelector(datetimeSelector); if (datetime) { datetime.style.color = `${DEFAULT_FONT_CL}`;} }); }); }; const setHoveredFontAndBgColor = (itemSelector, textSelector, doBackgroundGradient = true) => { Array.prototype.forEach.call(document.querySelectorAll(itemSelector), (x) => { x.addEventListener('mouseover', () => { if (getColorMode() === COLOR_MODE.DARK_COLOR) { x.style.background = `linear-gradient(${DARK_HOVER_BG_UPPER_CL}, 20%, ${DARK_HOVER_BG_LOWER_CL})`; x.style.outline = `1px solid ${DARK_HOVER_BORDER_CL}` x.style.color = `${DARK_FONT_CL}`; x.children[0].style.color = `${DARK_FONT_CL}`; const text = x.querySelector(textSelector); if (text) { text.style.color = `${DARK_FONT_CL}`;} } else { x.style.background = `linear-gradient(${HOVER_BG_UPPER_CL}, 20%, ${HOVER_BG_LOWER_CL})`; x.style.outline = `1px solid ${HOVER_BORDER_CL}` x.style.color = `${DEFAULT_FONT_CL}`; x.children[0].style.color = `${DEFAULT_FONT_CL}`; const text = x.querySelector(textSelector); if (text) { text.style.color =`${DEFAULT_FONT_CL}`;} } }); }); Array.prototype.forEach.call(document.querySelectorAll(itemSelector), (x) => { x.addEventListener('mouseout', () => { x.style.background = `transparent`; x.style.outline = `1px solid transparent` x.style.color = `${DEFAULT_FONT_CL}`; x.children[0].style.color = `${DEFAULT_FONT_CL}`; const text = x.querySelector(textSelector); if (text) { text.style.color = `${DEFAULT_FONT_CL}`;} }); }); }; /* * ページに対応した色設定を行う * @param {string} pageType - ページ種類 * @param {string} colorMode - カラーモード */ const setColor = (pageType, colorMode) => { const configIndex = parseInt(colorMode); Array.prototype.forEach.call(KEYS, (k) => { Array.prototype.forEach.call(document.querySelectorAll(SELECTOR_DIC[k]), (e) => { Array.prototype.forEach.call(CSS_DIC[k], (c) => { e.style.setProperty(c, COLOR_CONFIGS[configIndex][k][c]); }); }); }); // パンくずリスト Array.prototype.forEach.call(document.querySelectorAll('.p-page-breadcrumb__list .c-page-breadcrumb__item:not(:last-child)'), (x) => { x.addEventListener('mouseover', () => { if (getColorMode() === COLOR_MODE.DARK_COLOR) { x.children[0].style.color = "lightcyan"; } else { x.children[0].style.color = '#5d5d5d'; } }); x.addEventListener('mouseout', () => { if (getColorMode() === COLOR_MODE.DARK_COLOR) { x.children[0].style.color = "lightcyan"; } else { x.children[0].style.color = '#a9a9a9'; } }); }); switch (pageType) { case "news": case "media": setMenuFontColor('.cale_prev a, .cale_month a, .cale_next a, .cale_table tbody tr td a'); setHoveredFontAndBgColor('.p-news__item, .p-other__item, .p-schedule__item', 'time'); break; case "artist": setHoveredFontAndBgColor('.p-news__item', '.c-news__date'); break; case "diary/member": shortenYear('.c-blog-main__date, .c-blog-top__date'); setHoveredFontColor('.p-blog-top__item', '.c-blog-top__title', '.c-blog-top__date'); break; case "diary/detail": case "diary/member/list": setMenuFontColor('.cale_prev a, .cale_month a, .cale_next a, .cale_table tbody tr td a'); setHoveredFontAndBgColor('.p-blog-entry__item', '.c-blog-entry__title'); setHoveredFontAndBgColor('.d-article', '.s-article-title'); setHoveredFontAndBgColor('.c-pager__item__text', 'time'); break; // 動画 case "video": case "contents": // 動画タイトル Array.prototype.forEach.call(document.querySelectorAll('.p-video__item.p-video__item--medium'), (x) => { x.addEventListener('mouseover', () => { if (getColorMode() === COLOR_MODE.DARK_COLOR) { x.children[1].children[0].style.color = "lightcyan"; } else { x.children[1].children[0].style.color = '#5d5d5d'; } }); x.addEventListener('mouseout', () => { x.children[1].children[0].style.color = '#a9a9a9'; }); }); break; case "event": Array.prototype.forEach.call(document.querySelectorAll('.p-shakehands__item'), (x) => { x.addEventListener('mouseover', () => { if (getColorMode() === COLOR_MODE.DARK_COLOR) { x.children[1].children[1].style.color = "lightcyan"; x.children[1].children[2].style.color = "lightcyan"; } else { x.children[1].children[1].style.color = '#5d5d5d'; x.children[1].children[2].style.color = '#5d5d5d'; } }); x.addEventListener('mouseout', () => { x.children[1].children[1].style.color = '#8babab'; x.children[1].children[2].style.color = '#8babab'; }); }); Array.prototype.forEach.call(document.querySelectorAll('.p-other__item'), (x) => { x.addEventListener('mouseover', () => { if (getColorMode() === COLOR_MODE.DARK_COLOR) { x.children[0].style.color = "lightcyan"; } else { x.children[0].style.color = '#5d5d5d'; } }); x.addEventListener('mouseout', () => { x.children[0].style.color = '#8babab'; }); }); Array.prototype.forEach.call(document.querySelectorAll('.c-pager__item--count a'), (x) => { x.addEventListener('mouseover', () => { if (getColorMode() === COLOR_MODE.DARK_COLOR) { x.style.color = "lightcyan"; } else { x.style.color = '#5d5d5d'; } }); x.addEventListener('mouseout', () => { x.style.color = '#8babab'; }); }); break; default: ; } }; const leftPosition = (colorMode) => (colorMode === COLOR_MODE.DEFAULT_COLOR) ? "-3px" : "36px"; /** * カラーモードトグルのスイッチボタンを生成 * @param {COLOR_MODE} colorMode */ const createSwitchButton = (colorMode) => { const switchButton = document.createElement('div'); switchButton.classList.add("switch_button"); const left = leftPosition(colorMode); switchButton.style.cssText = `left: ${left}; margin-top: -5px; width: 24px; height: 24px; border-radius: 50%; position: absolute; background-color: white; box-shadow: 1px 1px 7px #B7B7B7, -1px -1px 4px #CECECE inset; transition: left .3s ease-in-out;`; return switchButton; }; /* * カラーモードのトグルスイッチを初期化 * @param {string} colorMode - "0": ライトモード、 "1": ダークモード */ const initializeColorToggle = (colorMode) => { const menuList = document.querySelector('.p-menu__list'); if (menuList && !document.querySelector('.color_toggle')) { const colorToggle = document.createElement('div'); colorToggle.classList.add("color_toggle"); menuList.appendChild(colorToggle); colorToggle.style.cssText = `margin-top: 2px; margin-left: 16px; width: 60px; height: 18px; border: solid 2px gray; border-radius: calc(infinity * 1px); background: linear-gradient(to right, #fff 0%, #fefefe 30%, #606080 70%, #404060 80%, #202040 100%); position: relative; cursor: pointer; transition: background-color .2s ease-in-out;`; const switchButton = createSwitchButton(colorMode); colorToggle.appendChild(switchButton); colorToggle.addEventListener("click", () => { const colorMode = toggleColorMode(); switchButton.style.left = leftPosition(colorMode); setColor(getPageType(), colorMode); }); return true; } else { return false; } }; const doProcessList = (func) => { const isDetail = ((location.href).match(new RegExp('\/detail\/')) != null); if (isDetail) { return; } const PAGE_TYPE_ERROR_MSG = "Processing of out-of-scope pages. Check the settings @match."; const pageType = (location.href).match(new RegExp('\/(media|news)\/'))[1]; if (! pageType) { throw new Error(PAGE_TYPE_ERROR_MSG); } const SELECTORS = ((x) => { switch (x) { case "news": return {"pArrow": ".p-news__pager-arrow", "cArrowLeft": ".c-news_pager-arrow--left", "cArrowRight" : ".c-news_pager-arrow--right", "cPageMonth": ".c-news__page_month", "cPageYear": ".c-news__page_year", "lMainContentsUl": ".l-maincontents--news ul", "pDate": ".p-news__page_date", "lSubContents": ".l-sub-contents--news"}; case "media": return {"pArrow": ".p-schedule__pager-arrow", "cArrowLeft": ".c-schedule_pager-arrow--left", "cArrowRight" : ".c-schedule_pager-arrow--right", "cPageMonth": ".c-schedule__page_month", "cPageYear": ".c-schedule__page_year", "lMainContentsUl": ".l-maincontents--schedule ul", "pDate": ".p-schedule__page_date", "lSubContents": ".l-sub-contents--schedule"}; default: throw new Error(PAGE_TYPE_ERROR_MSG); } })(pageType); const pageYear = ((y) => {return (y === null || y === undefined) ? null : y.innerText;})(document.querySelector(SELECTORS.cPageYear)); const now = new Date(); // "年"の表示がない場合 if (pageYear !== "年") { const daysOfWeek = ['Su', 'M', 'Tu', 'W', 'Th', 'F', 'Sa']; const year = now.getFullYear(); const month = now.getMonth() + 1; // 月初 const first = new Date(year, month - 1, 1); // 月末 const end = new Date(year, month, 0); // 月末の日 const endDate = end.getDate(); // 前月末 const endPrevMonth = new Date(year, month - 1, 0); // 前月末の日 const endDatePrevMonth = endPrevMonth.getDate(); // 月初の曜日 const firstDayOfWeek = first.getDay(); let numOfDay = 1; let calendarHtml = ''; const pageMonth = ((m) => {return m !== null ? m.innerText : "";})(document.querySelector(SELECTORS.cPageMonth)); const leftArrowHref = document.querySelector(SELECTORS.cArrowLeft).children[0].href; const rightArrowHref = document.querySelector(SELECTORS.cArrowRight).children[0].href; calendarHtml += '<table class="cale_table" style="width: 210px; margin: -130px 0 20px -50px;">'; calendarHtml += `<tr><td></td><td class="cale_prev"><a id="cale_prev" href="${leftArrowHref}"><</a></td> <td class="cale_month" colspan="3">${pageYear} ${pageMonth}</td><td class="cale_next"><a href="${rightArrowHref}">></a></td><td></td></tr>`; calendarHtml += '<tr>'; for (let i = 0; i < daysOfWeek.length; i++) { calendarHtml += '<td class="cale_wek' + i + '">' + daysOfWeek[i] + '</td>'; } calendarHtml += '</tr>'; for (let w = 0; w < 6; w++) { calendarHtml += '<tr>' for (let d = 0; d < 7; d++) { if (w == 0 && d < firstDayOfWeek) { // 前月 let num = endDatePrevMonth - firstDayOfWeek + d + 1; calendarHtml += '<td class="cale_day' + d + ' is-disabled">' + num + '</td>'; } else if (numOfDay > endDate) { // 次月 let num = numOfDay - endDate; calendarHtml += '<td class="cale_day' + d + ' is-disabled">' + num + '</td>'; numOfDay++; w = 99; // カレンダーの最下端が次月の日付のみになるのを防止 } else { calendarHtml += '<td class="cale_day' + d + '">' + numOfDay + '</td>'; numOfDay++; } } calendarHtml += '</tr>' } calendarHtml += '</table>'; document.querySelector(SELECTORS.lSubContents).insertAdjacentHTML('afterbegin', calendarHtml); } // 選択カテゴリ(ALL / 握手会・・・) const categorySelectorSuffix = ((c) => { let value = ""; if (c.length == 0) { value = "all"; } else { const tempValue = c[0].value; switch (tempValue) { case "birthday": value = "birth"; break; case "fanclub": value = "fanclubonly"; break; default: value = tempValue; } } return value; })(document.getElementsByName("cd")); const categoryElem = document.querySelector('.c-button-category.category_' + categorySelectorSuffix); const categoryStyles = window.getComputedStyle(categoryElem); const categoryParent = categoryElem.parentElement; categoryParent.style.marginLeft = "-5px"; categoryParent.style.paddingLeft = "4.5px"; categoryParent.style.marginRight = "40px"; categoryElem.style.color = `rgb(from ${categoryStyles.color} calc(r - 64) calc(g - 64) calc(b - 64))`; categoryParent.style.backgroundColor = `rgb(from ${categoryStyles.color} calc(r + 64) calc(g + 64) calc(b + 64))`; categoryParent.style.border = `solid 0.5px ${categoryElem.style.color}`; // 詳細ページの場合 処理を終了 if (isDetail) { return; } /* * フルブラウザ上ではNEWS/スケジュールが多い月は見づらいため * 自動スクロール、表示色を追加設定 */ const PAGER_MARGIN_TOP = 20; const PASTDAY_BG_CL = "#ededf0"; const TODAY_DATE_CL = "orange"; const TODAY_BG_CL = "#fafeff"; const TODAY_BORDER_CL_UPPER = "#d7eeff"; const TODAY_BORDER_CL_LOWER = "#5bbee4"; let styleText = ` .is-disabled { color: silver; } .p-page-head { padding-top: 20px; } .c-pager__item a svg { fill: #7ab6db; } .schedule__list-pastday { background-color: ${PASTDAY_BG_CL}; } .schedule__list-today { background-color: ${TODAY_BG_CL}; border: 2px solid; border-image: linear-gradient(to right bottom, ${TODAY_BORDER_CL_UPPER}, ${TODAY_BORDER_CL_LOWER}) 1; } .schedule__date-today { color: ${TODAY_DATE_CL}; } .p-news__item, .p-schedule__item { outline-offset: 1px; } .module-modal.js-member-filter .mordal-box .member-box ul li p.check input[type=checkbox]:checked+label:before { background-color:#6bcaea; border:1px solid #6bcaea; }`; document.appendStyle(styleText); // リスト上方 "xxxx年 yy月" 行 const pDate = document.querySelector(SELECTORS.pDate); // "xxxx年" ではなく "年"のみの場合 if (pageYear === "年") { const cPageYear = document.querySelector(SELECTORS.cPageYear); cPageYear.innerText = String(now.getFullYear()) + "年"; cPageYear.style.fontSize = "4.8rem"; document.querySelector(SELECTORS.cPageMonth).remove(); document.querySelector(SELECTORS.pArrow).remove(); } pDate.style.marginBottom = "5px"; // ニュース/スケジュール リスト const lMainContentsUl = document.querySelector(SELECTORS.lMainContentsUl); const lMainContentsUlTop = lMainContentsUl.getBoundingClientRect().top; const pDateHeight = pDate.offsetHeight; // リスト下方 前月/次月ページャ const pPager = document.querySelector(".p-pager"); // "xxxx年" ではなく "年"のみの場合 if (pageYear === "年") { pPager.innerText = ""; pPager.style.marginTop = "0px"; } else { pPager.style.marginTop = `${PAGER_MARGIN_TOP}px`; } const pPagerHeight = PAGER_MARGIN_TOP + pPager.offsetHeight; const lMainContentsUlHeight = document.documentElement.clientHeight - pDateHeight - pPagerHeight; // スクロール表示 lMainContentsUl.setAttribute("style", `height:${lMainContentsUlHeight}px; overflow: scroll; border: solid 1px #32a1ce;`); const scrollTop = lMainContentsUlTop - pDateHeight; // スクロール位置リセット 〜「再読み込み」ボタン押下時の位置ズレ対応 scrollTo(0, 0); // リスト位置までページ内で縦スクロール scrollTo({ top: scrollTop, behavior: "smooth" }); const nowYearMonth = String(now.getFullYear()) + String(now.getMonth() + 1).padStart( 2, '0'); const dispYear = document.querySelector(SELECTORS.cPageYear); const dispMonth = document.querySelector(SELECTORS.cPageMonth); // 表示対象の年月(ex.202404)を取得。設定がなければ当月 const dispYearMonth = ((y, m) => {return (y == null || m == null) ? nowYearMonth : y.innerText.replace('年', '') + m.innerText.replace('月', '')})(dispYear, dispMonth); // NEWS/スケジュールが当月以前の月の場合 if (dispYearMonth < nowYearMonth) { lMainContentsUl.classList.add('schedule__list-pastday'); } const createAnchor = (y, d) => `<a href="javascript:document.querySelector('${SELECTORS.lMainContentsUl}').scroll({top:${y}, behavior: 'smooth'});">${d}</a>`; if (pageType === "news") { doProcessNews(lMainContentsUlTop, createAnchor); } else { doProcessMedia(lMainContentsUl, lMainContentsUlTop, dispYearMonth, now, nowYearMonth, createAnchor); } }; const COMPRESSED = `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=`; const HINATAZAKA46 = JSON.parse(LZString.decompressFromBase64(COMPRESSED)); const CURRENT_MEMBERS = []; HTMLElement.prototype.setPenlightColor = function(color_01, color_02, thickness, intensity) { this.style.borderLeftColor = "#" + color_01; this.style.borderTopColor = "#" + color_01; this.style.borderRightColor = "#" + color_02; this.style.borderBottomColor = "#" + color_02; this.style.boxShadow = ` -${thickness} 0px ${thickness} -4px #${color_01}, 0px -${thickness} ${thickness} -4px #${color_01}, ${thickness} 0px ${thickness} -4px #${color_02}, 0px ${thickness} ${thickness} -4px #${color_02}, inset 0px 2px 4px white, inset 2px 0px 4px white, inset 0px -2px 4px white, inset -2px 0px 4px white, inset 0px 4px 4px #${color_01}, inset 4px 0px 4px #${color_01}, inset 0px -4px 4px #${color_02}, inset -4px 0px 4px #${color_02}, inset 0px ${thickness} 4px rgb(from #${color_01} calc(r + ${intensity}) calc(g + ${intensity}) calc(b + ${intensity})), inset ${thickness} 0px 4px rgb(from #${color_01} calc(r + ${intensity}) calc(g + ${intensity}) calc(b + ${intensity})), inset 0px -${thickness} 4px rgb(from #${color_02} calc(r + ${intensity}) calc(g + ${intensity}) calc(b + ${intensity})), inset -${thickness} 0px 4px rgb(from #${color_02} calc(r + ${intensity}) calc(g + ${intensity}) calc(b + ${intensity})), -4px 0px 4px -4px white, 0px -4px 4px -4px white, 4px 0px 4px -4px white, 0px 4px 4px -4px white, -4px 0px 4px -4px rgb(from #${color_01} calc(r + ${intensity}) calc(g + ${intensity}) calc(b + ${intensity})), 0px -4px 4px -4px rgb(from #${color_01} calc(r + ${intensity}) calc(g + ${intensity}) calc(b + ${intensity})), 4px 0px 4px -4px rgb(from #${color_02} calc(r + ${intensity}) calc(g + ${intensity}) calc(b + ${intensity})), 0px 4px 4px -4px rgb(from #${color_02} calc(r + ${intensity}) calc(g + ${intensity}) calc(b + ${intensity})) `; }; const createGeneration = (gen) => { const fragment = document.createDocumentFragment(); const sub = document.createElement('div'); sub.classList.add('p-page-head-sub'); const subtitle = document.createElement('h2'); subtitle.classList.add('c-page-subtitle', 'en'); switch(gen) { case "1": subtitle.append(document.createTextNode('一期生')); break; case "2": subtitle.append(document.createTextNode('二期生')); break; case "3": subtitle.append(document.createTextNode('三期生')); break; case "4": subtitle.append(document.createTextNode('四期生')); break; case "5": subtitle.append(document.createTextNode('五期生')); break; } sub.appendChild(subtitle); fragment.append(sub); const lcontents = document.createElement('div'); lcontents.classList.add('l-contents'); const lmaincontents = document.createElement('div'); lmaincontents.classList.add('l-maincontents'); const pmemberlist = document.createElement('div'); pmemberlist.classList.add('p-member__list'); lmaincontents.appendChild(pmemberlist); lcontents.appendChild(lmaincontents); fragment.append(lcontents); //console.log(new XMLSerializer().serializeToString(fragment)); return fragment; }; const IMG_PREFIX = "https://cdn.hinatazaka46.com/images/14/"; const IMG_SUFFIX = "/800_800_102400.jpg";//1000_1000_102400.jpg const createMember = (number, memberName, memberKana, imgUrl, linkUrl) => { const li = document.createElement('li'); li.classList.add('p-member__item'); li.style.display = "block"; li.dataset.member = number; const anchor = document.createElement('a'); const thumb = document.createElement('div'); thumb.classList.add('c-member__thumb'); thumb.style.position = "relative"; const img = document.createElement('img'); img.setAttribute('src', IMG_PREFIX + imgUrl + IMG_SUFFIX); thumb.appendChild(img); if (linkUrl) { img.style.cursor = "pointer"; const linkButton = document.createElement('a'); linkButton.append(document.createTextNode('Open Link in New Tab')); linkButton.classList.add('open-link-button'); linkButton.style.display = "none"; linkButton.setAttribute('href', "https://" + linkUrl); linkButton.setAttribute('target', '_blank'); img.addEventListener('click', () => { linkButton.style.display = (linkButton.style.display == "none") ? 'flex' : 'none'; }); linkButton.addEventListener('click', (event) => { event.stopPropagation(); }); thumb.appendChild(linkButton); } anchor.appendChild(thumb); const name = document.createElement('div'); name.classList.add('c-member__name'); name.append(document.createTextNode(memberName)); anchor.appendChild(name); const kana = document.createElement('div'); kana.classList.add('c-member__kana'); kana.append(document.createTextNode(memberKana)); anchor.appendChild(kana); li.appendChild(anchor); return li; }; const doProcessMember = () => { const generations = {}; Array.prototype.forEach.call(Object.keys(HINATAZAKA46.DATA), (n) => { const member = HINATAZAKA46.DATA[n]; if (member.end) { if (! generations[member.gen]) { generations[member.gen] = createGeneration(member.gen); } genTree = generations[member.gen]; const list = genTree.querySelector('.p-member__list'); list.appendChild(createMember(n, member.nm, member.kn, member.img, member.lnk)); } }); const memberList = document.querySelector('.sorted.sort-default.current'); Array.prototype.forEach.call(Object.values(generations), (g) => { memberList.appendChild(g); }); document.appendStyle(` .p-member__item a div img { border: 1px solid; border-radius: 8px; padding: 0.2rem; transition: transform 0.3s ease, z-index 0.3s ease; transform-origin: center center; } .p-member__item:hover a div img { transform:scale(1.1, 1.1); } .p-member__item { display: block; } .open-link-button { color: #dddddd; background-color: #303030; justify-content: center; align-items: center; font-size: 14px; width: 190px; height: 30px; border-radius: 15px 5px; cursor: pointer; position: absolute; bottom: 3px; right: 3px; z-index: 10000; transition: 0.3s; } .open-link-button:hover { color: lightyellow; }` ); Array.prototype.forEach.call(document.querySelectorAll('.p-member__item'), (m) => { const color_set = HINATAZAKA46.DATA[m.dataset.member].cl; const code_01 = HINATAZAKA46.LIGHT[color_set[0]].cd; const code_02 = HINATAZAKA46.LIGHT[color_set[1]].cd; const img = m.children[0].children[0].children[0]; img.setPenlightColor(code_01, code_02, "4px", 64); m.addEventListener('mouseover', () => {img.setPenlightColor(code_01, code_02, "12px", 128);}); m.addEventListener('mouseout', () =>{img.setPenlightColor(code_01, code_02, "4px", 64);}); }); } const doProcessMemberDetail = () => { document.appendStyle(` .p-member__box { padding-top: 40px; } .c-member__thumb img { border: 3px solid; border-radius: 8px; padding: 0.2rem; position: relative; } .c-mamber__category_title { margin-bottom: 0; } .p-section { z-index: 100; } .p-button--center { padding-top: 0; } .p-contents.p-contents--news { padding-bottom: 0px; } .c-btn-member-greeting-popup-close { --color: black; } .c-btn-member-greeting-popup-close:before { border: solid 1px; background-color: var(--color); } .c-btn-member-greeting-popup-close:after { border: solid 1px; background-color: var(--color); }`); const close_button = document.querySelector('.c-btn-member-greeting-popup-close'); close_button.style.setProperty("--color", DEFAULT_FONT_CL); const img = document.querySelector('.c-member__thumb > img:nth-child(1)'); if (img) { const ct = (location.href).match(/artist\/([0-9]{1,2})/)[1]; const color_set = HINATAZAKA46.DATA[ct].cl; const color_01 = HINATAZAKA46.LIGHT[color_set[0]]; const color_02 = HINATAZAKA46.LIGHT[color_set[1]]; img.setPenlightColor(color_01.cd, color_02.cd, "8px", 64); } }; const doProcessGreeting = () => { document.appendStyle(` .card, .member_thumb { cursor: pointer; } div.card { transition: transform 0.3s ease, z-index 0.3s ease; transform-origin: center center; } div.card:hover { transform: scale(1.05) translateZ(10px); z-index: 10; /* 前面に出す */ }` ); Array.prototype.forEach.call(document.querySelectorAll('[class^="card_"]'), (c) => { const cardNo = c.classList[0].match(/[0-9]{1,2}/)[0]; const member = c.querySelector('.member_thumb'); member.addEventListener('click', () => { location.href = "https://www.hinatazaka46.com/s/official/artist/" + cardNo + "?ima=0000"; }); c.addEventListener('mouseover', () => { const menberName = c.querySelector('.name'); if (getColorMode() === COLOR_MODE.DARK_COLOR) { menberName.style.color = `${DARK_FONT_CL}`; } else { menberName.children[0].style.color = `${DEFAULT_FONT_CL}`; } }); c.addEventListener('mouseout', () => { const menberName = c.querySelector('.name'); menberName.style.color = `${DEFAULT_FONT_CL}`; }); const card = c.querySelector('.card'); const btn = c.querySelector('a.btn01'); card.addEventListener('click', (e) => { btn.click(); }); }); }; const DELTA = 2; const doProcessNews = (lMainContentsUlTop, createAnchor) => { const newsList = Array.prototype.map.call(document.getElementsByClassName("c-news__date"), (x) => [parseInt(x.innerText.match(new RegExp(/\d{4}\.\d{2}\.(\d{2})/))[1]), x.getBoundingClientRect().top] ); const dayMap = new Map(); Array.prototype.forEach.call(newsList, (x) => { if (! dayMap.has(x[0]) || x[1] < dayMap.get(x[0])) { // Map(day, top) dayMap.set(x[0], x[1]); } }); Map.prototype.forEach.call(dayMap, (top, day) => { Array.prototype.some.call(document.querySelectorAll("table.cale_table tbody tr td"), (td) => { if (!td.classList.contains("is-disabled") && day === parseInt(td.innerText)) { td.innerHTML = createAnchor((top - lMainContentsUlTop - DELTA), day); return true; } }); }); }; // SCHEDULE const doProcessMedia = (lMainContentsUl, lMainContentsUlTop, dispYearMonth, now, nowYearMonth, createAnchor) => { const today = now.getDate(); lMainContentsUl.scroll(0, 0); let isScrolled = false; Array.prototype.forEach.call(document.getElementsByClassName("c-schedule__date--list"), (dayElem) => { // 日付(innerText)の文字列 '(日付)\n(曜日)' から日付を抽出 let day = ((x) => {return parseInt(x.substr(0, x.indexOf(`\n`)));})(dayElem.innerText); Array.prototype.some.call(document.querySelectorAll("table.cale_table tbody tr td"), (td) => { if ( !td.classList.contains("is-disabled") && day === parseInt(td.innerText)) { td.innerHTML = createAnchor((dayElem.getBoundingClientRect().top - lMainContentsUlTop - DELTA), day); return true; } }); // 表示スケジュールが当月の場合 if (dispYearMonth === nowYearMonth) { // 過去日 if (day < today) { dayElem.parentElement.classList.add("schedule__list-pastday"); // 「今日」(ページを表示した日付) } else if (day === today) { dayElem.classList.add("schedule__date-today"); dayElem.parentElement.classList.add("schedule__list-today"); } if (day >= today) { dayElem.parentElement.classList.add("schedule__list-future"); if (!isScrolled) { // 「今日」以降(「今日」を含めて)で最早のスケジュール日要素にスクロール lMainContentsUl.scroll({ top: dayElem.getBoundingClientRect().top - lMainContentsUlTop - DELTA, behavior: "smooth" }); isScrolled = true; } } } }); }; /* * "ディスコグラフィー"向けリリース年リストを画面に配置する */ const setReleaseYear4Disco = () => { const releaseYearSelector = '.c-disco__year'; let navText = `<header class="header" role="banner" style="z-index: 1000;"> <nav class="nav"> <div class="release">RELEASE<br/>YEAR</div> <ul class="nav-list">`; Array.prototype.forEach.call(document.querySelectorAll(releaseYearSelector), (x) => { const year = x.innerText; const id_year = "y_" + year; x.parentNode.setAttribute("id", id_year); navText += `<li><a class="rel_year">${year}</a></li>`; }); navText += `</ul> </nav> </header>`; const main = document.querySelector('.l-main'); main.setAttribute("style", 'padding-top:0; margin: 20px 0 0 40px; font-size: larger;'); main.insertAdjacentHTML('afterbegin', navText); setTimeout(() => { const header = document.querySelector('header'); const nav = document.querySelector('.nav'); const navHeight = nav.clientHeight; window.onscroll = () => { if (window.pageYOffset >= header.clientHeight) { nav.classList.add('fixed'); main.setAttribute('style', 'padding-top:' + navHeight + 'px'); } else { nav.classList.remove('fixed'); main.setAttribute('style', 'padding-top:0; margin: 20px 0 0 40px; font-size: larger;'); } }; const latestYear = document.querySelector(releaseYearSelector); const scrollTop = latestYear.parentNode.getBoundingClientRect().top; // スクロール位置リセット 〜「再読み込み」ボタン押下時の位置ズレ対応 scrollTo(0, 0); // リスト位置までページ内で縦スクロール scrollTo({ top: scrollTop, behavior: "smooth" }); Array.prototype.forEach.call(document.querySelectorAll('.rel_year'), (x, i) => { const year = x.innerText; const yearElement = document.getElementById("y_" + year); const top = yearElement.getBoundingClientRect().top; x.setAttribute("href", `javascript:scrollTo({top:${top}, behavior:'smooth'});`); }); }, 100); }; const doProcessDiscography = () => { const styleText = ` .fixed { width: 12rem; position: fixed; top: 60px; left: 40px; z-index: 1; font-size:larger; } .release { line-height: 20px; } .l-container { margin-top: -280px; } .c-disco__year { padding-top: 20px; } .c-disco__year {font-size: 4rem; width: 12rem;} .c-disco__category {font-size: 14px;} .p-page-head-sub--first {padding-top: 10px;} `; document.appendStyle(styleText); setReleaseYear4Disco(); }; /* * "フォーメーション"向けリリース年リストを画面に配置する */ const setReleaseYear4Formation = () => { const releaseYearSelector = '.c-page-subtitle'; let navText = `<header class="header" role="banner" style="z-index: 1000;"> <nav class="nav"> <div class="release">RELEASE<br/>YEAR</div> <ul class="nav-list">`; Array.prototype.forEach.call(document.querySelectorAll(releaseYearSelector), (x) => { const year = x.innerText; const id_year = "y_" + year; x.parentNode.setAttribute("id", id_year); navText += `<li><a href="#${id_year}">${year}</a></li>`; }); navText += `</ul> </nav> </header>`; const main = document.querySelector('.l-main'); main.setAttribute("style", 'padding-top:0; margin: 20px 0 0 40px; font-size: larger;'); main.insertAdjacentHTML('afterbegin', navText); const header = document.querySelector('header'); const nav = document.querySelector('.nav'); const navHeight = nav.clientHeight; window.onscroll = () => { if (window.pageYOffset >= header.clientHeight) { nav.classList.add('fixed'); main.setAttribute('style', 'padding-top:' + navHeight + 'px'); } else { nav.classList.remove('fixed'); main.setAttribute('style', 'padding-top:0; margin: 20px 0 0 40px; font-size: larger;'); } }; const latestYear = document.querySelector(releaseYearSelector); const scrollTop = latestYear.parentNode.getBoundingClientRect().top; // スクロール位置リセット 〜「再読み込み」ボタン押下時の位置ズレ対応 scrollTo(0, 0); // リスト位置までページ内で縦スクロール scrollTo({ top: scrollTop, behavior: "smooth" }); }; const doProcessFormation = () => { const styleText = ` .l-container { margin-top: -280px; } .formation_image :not(.small_f) li, small_f span { transition: transform 0.3s ease, z-index 0.3s ease; transform-origin: center center; } .formation_image :not(.small_f) li:hover, .small_f span:hover { transform: scale(1.4, 1.4) translateZ(10px); z-index: 10; } .formation_image li:hover i { font-size: 16px; } .formation_image li i { font-size: 14px; } .fixed { width: 12rem; position: fixed; top: 60px; left: 40px; z-index: 1; font-size:larger; } .release { line-height: 20px; } .p-page-head-sub--first { padding-top: 20px; } .p-page-head-sub { margin: 0px auto 0px auto; }`; document.appendStyle(styleText); setReleaseYear4Formation(); }; // Blog /** yyyy → 'yy */ const shortenYear = (x) => { Array.prototype.forEach.call(document.querySelectorAll(x), (y) => { const text = y.innerText; y.innerText = "'" + text.replace(/\d{2}(\d{2}\.)/, '$1'); }); }; const getBackgroundImageUrl = (el) => { const bg = window.getComputedStyle(el).backgroundImage; const urlMatch = bg.match(/url\(["']?(.*?)["']?\)/); return urlMatch ? urlMatch[1] : null; } /* * パタメータのrgb要素から補色を生成して返す * ただしパラメータの色が白に近い場合は#202040(青)、黒に近い場合は#eeeeeeを返す * @param {number} r - red * @param {number} g - green * @param {number} b - blue * @param {number} threshold - 閾値 */ const getComplementaryColor = (r, g, b, threshold = 30) => { const isNearlyWhite = r >= 255 - threshold && g >= 255 - threshold && b >= 255 - threshold; if (isNearlyWhite) { return '#202040'; } const isNearlyBlack = r <= threshold && g <= threshold && b <= threshold; if (isNearlyBlack) { return '#eeeeee'; } // 通常の補色 const compR = 255 - r; const compG = 255 - g; const compB = 255 - b; return `rgb(${compR}, ${compG}, ${compB})`; }; const updateFontColorOnImage = (selector, imageUrl) => { const img = new Image(); img.crossOrigin = "anonymous"; // CORS対策(必要) img.src = imageUrl; img.onload = () => { const canvas = document.createElement('canvas'); canvas.width = img.naturalWidth; canvas.height = img.naturalHeight; const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0); const data = ctx.getImageData(0, 0, canvas.width, canvas.height).data; let r = 0, g = 0, b = 0, count = 0; for (let i = 0; i < data.length; i += 4) { r += data[i]; g += data[i + 1]; b += data[i + 2]; count++; } r = Math.round(r / count); g = Math.round(g / count); b = Math.round(b / count); Array.prototype.forEach.call(document.querySelectorAll(selector), (e) => { e.style.color = getComplementaryColor(r, g, b); }); }; img.onerror = () => { console.error("画像の読み込みに失敗しました"); }; }; const updateHeaderFontColor = (imgSelector, textSelector) => { const blogContainer = document.querySelector(imgSelector); const imageUrl = getBackgroundImageUrl(blogContainer); if (imageUrl) { updateFontColorOnImage(textSelector, imageUrl); } } /* * 五期生リレーブログの写真を設定 */ const create5thRelayPhoto = () => { const relayPhoto = document.createElement('div'); relayPhoto.classList.add("c-blog-member__icon"); relayPhoto.style.backgroundImage = "url(https://cdn.hinatazaka46.com/images/14/fa2/dcd3c79b9d66efeed5a13af038129.jpg)"; relayPhoto.style.backgroundSize = "cover"; relayPhoto.style.backgroundPosition = "center"; relayPhoto.style.backgroundRepeat = "no-repeat"; relayPhoto.style.width = "220px"; relayPhoto.style.height = "122px"; relayPhoto.style.position = "relative"; relayPhoto.style.zIndex = "2"; return relayPhoto; }; const scrollOnLoad = () => { // 半透明ヘッダーメニュー 高さ const headerHeight = document.querySelector(".p-header-wrap").offsetHeight; // スクロール位置リセット リロード時のズレ対応 scrollTo(0, 0); // 文頭までスクロール scrollTo({ top: document.querySelector(".p-blog-article__head").getBoundingClientRect().top - headerHeight, behavior: "smooth" }); } /** ブログ */ const blogDetail = () => { const pBlogArticleHead = document.querySelector('.p-blog-article__head'); document.appendStyle(` .p-blog-article { border-bottom: none; } .c-blog-article__title { --height: auto; height: var(--height); transition: height .3s ease-out; } .c-blog-article__title.open { height: var(--height); overflow: visible; white-space: wrap; } .c-blog-article__title.hidden { height: 58px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis "… 🔽"; } .c-blog-article__text { padding: 0 10px; overflow: scroll; border: none; } .p-pager { margin-top: 10px; } .p-button--center { padding-top: 0; margin-top: -20px; } .c-button-grad.c-button-grad--big { min-width: 280px; }`); const articleTitleDiv = document.querySelector('.c-blog-article__title'); const height = articleTitleDiv.scrollHeight + 'px'; articleTitleDiv.style.setProperty("--height", height); articleTitleDiv.style.marginBottom = "0px"; articleTitleDiv.classList.add("hidden"); setTimeout(() => { const articleHeight = document.documentElement.clientHeight - pBlogArticleHead.getBoundingClientRect().bottom + 20; document.querySelector('.c-blog-article__text').style.height = articleHeight + "px"; if (articleTitleDiv.offsetWidth < articleTitleDiv.scrollWidth) { const articleTitle = articleTitleDiv.innerText; articleTitleDiv.innerText = articleTitle + "🔼"; articleTitleDiv.style.cursor = "pointer"; articleTitleDiv.addEventListener('click', function() { articleTitleDiv.classList.toggle("hidden"); articleTitleDiv.classList.toggle("open"); }); } scrollOnLoad(); }, 100); }; /** 記事一覧 */ const blogList = () => { const blogGroupHeight = document.documentElement.clientHeight; const styleText = ` .c-blog-member__icon--all { height: 60px; } .p-button { padding-top: 0; } .d-article { line-height: 20px; margin-bottom: 8px; } .s-member-icon { font-size: larger } .s-article-title { font-size: smaller; } .s-datetime { font-size: smaller; } .p-blog-group { height: ${blogGroupHeight - 60}px; overflow: scroll; .l-maincontents--blog { border: none; } .c-blog-article__title { margin-bottom: 0px; }`; document.appendStyle(styleText); shortenYear('.c-blog-article__date'); const titleList = document.createElement('div'); titleList.setAttribute("class", "s-blog__index"); const memberName = document.querySelector('.c-blog-member__name'); if (memberName) { if (memberName.innerText == "ポカ") { const profileTable = document.querySelector('.p-blog-member__info-table'); profileTable.after(titleList); } else { const profileButton = document.querySelector('.p-button'); profileButton.after(titleList); } // リレーブログ } else { const info = document.querySelector('.p-blog-member__info'); info.after(titleList); } const createAnchor = (idx, datetime, icon, articleTitle) => `<div class="d-article"><a href="#article${idx}"> <span class="s-member-icon">${icon}</span> <span class="s-article-title">${articleTitle}</span><br/><span class="s-datetime">${datetime}</span> </a></div>`; const lMainContentsBlogTop = document.querySelector('.l-maincontents--blog').getBoundingClientRect().top; Array.prototype.forEach.call(document.querySelectorAll('.p-blog-article'), (x, i) => { x.setAttribute('id', "article" + i); const datetimeDiv = x.childNodes[1].childNodes[3].childNodes[1]; const datetime = datetimeDiv.firstChild.textContent.trim(); const articleTitleDiv = x.childNodes[1].childNodes[1]; const articleTitle = articleTitleDiv.firstChild.textContent.trim(); // メンバー混合リストの場合があるので名前を取得 const memberName = x.childNodes[1].childNodes[3].childNodes[3].innerText; const icon = HINATAZAKA46.DATA[HINATAZAKA46.MEMBER[memberName]].icon; titleList.insertAdjacentHTML('beforeend', createAnchor(i, datetime, icon, articleTitle)); }); setTimeout(() => { document.querySelector('.p-blog-group').style.hight = "px"; scrollOnLoad(); }, 100); }; const doProcessBlog = (blogPageType) => { const body = document.querySelector('body'); // 内容が空のページ(卒業メンバーのブログなど) if (body.getElementsByTagName('*').length === 0) { body.innerHTML = 'This page is no longer available'; return; } // ひなたフェス/握手会 は非メンバーブログ const isNotMemberBlog = (location.search).match(/(cd=hinafes_blog|cd=event)/g); if (isNotMemberBlog) { return; } if (isMobile()) { return; } updateHeaderFontColor('.p-blog-head-container', '.c-blog-page__title, .c-blog-page__subtitle, .c-blog-main__name, .c-blog__profilelink'); const faceSelector = '.p-blog-face__list'; // 画面下部の顔写真 Array.prototype.forEach.call(document.querySelectorAll(faceSelector), (x) => { x.addEventListener('mouseover', () => { x.children[1].style.color = getColorMode() === COLOR_MODE.DARK_COLOR ? `${DARK_FONT_CL}` : `${DEFAULT_FONT_CL}`; }); }); Array.prototype.forEach.call(document.querySelectorAll(faceSelector), (x) => { x.addEventListener('mouseout', () => { x.children[1].style.color = `${DEFAULT_FONT_CL}`; }); }); const styleText_common = ` .c-blog-face__item { transition: transform 0.3s ease, z-index 0.3s ease; transform-origin: center center; } .p-blog-face__list:hover > * { transform: scale(1.2, 1.2) translateZ(10px); } .p-blog-face__list:hover >.c-blog-face__item { box-shadow: 0px 0px 0px 3px ${DEFAULT_BLUE}; } `; if (blogPageType == "blog_top") { ((x) => { if (x) { x.style.cursor = "pointer"; } })(document.querySelector('.js-select.sort')); document.appendStyle(styleText_common + ` .l-contents { padding-bottom: 20px; }`); return; } const blogEntryItem = document.querySelector('.p-blog-entry__item'); const blogEntryItemStyles = window.getComputedStyle(blogEntryItem, null); const blogEntryItemHeight = parseInt(blogEntryItemStyles.height.replace('px', '')); const blogEntryItemMarginBottom = parseInt(blogEntryItemStyles["margin-bottom"].replace('px', '')); const blogEntryItemHeightWithMargin = blogEntryItemHeight + blogEntryItemMarginBottom; const screenWidth = screen.width; const CONTENTS_WIDTH = Math.floor(screen.width * 0.1 * 0.9) * 10; const MAIN_CONTENTS_WIDTH = Math.floor(CONTENTS_WIDTH * 0.6) + "px"; const OTHER_BLOG_LIST_WIDTH = Math.floor(CONTENTS_WIDTH * 0.22) + "px"; const styleText = styleText_common + ` .l-contents { width: ${CONTENTS_WIDTH}px; } .l-other-contents--blog { width: ${OTHER_BLOG_LIST_WIDTH}; margin-top: -160px; padding-top: 20px; --bg-color: #ffffff; background-color: var(--bg-color); } .c-button-grad { padding: 6px 40px 6px 32px; } .l-other-contents--blog::after, .c-button-grad.c-button-grad--big::after { background-color: var(--bg-color); } .p-blog-head { padding-top: 0; } .c-blog-page__title { margin-bottom: 0; } .c-blog-member__icon { margin-bottom: 10px; } .p-blog-member__head { margin-bottom: 5px; } .c-blog-member__info-td__name { padding-bottom: 5px; } .s-blog__index { position: relative; z-index: 50; margin: 0 0 0 -50px; height: 160px; width: 290px; overflow: scroll; } .cale_table { margin-top: 0px; } .p-blog-article__head { background-color: #f6ffff; border: 1px solid #a0d8ef ; border-radius: 10px; } .c-blog-article__title { font-size: 2.5rem; line-height: 58px; color: #636767; background-color: #e0ffff; border-radius: 10px; } .c-blog-article__title, .c-blog-article__date { text-indent: 5px; } .l-maincontents--blog { width: ${MAIN_CONTENTS_WIDTH}; margin-top:-160px; padding: 20px; } .l-contents--blog-list { padding-bottom: 0; } .c-blog-entry_area__title { margin-bottom: 2px; } .p-blog-group { border: solid 1px #32a1ce; } .p-blog-article { padding-bottom: 0; margin-bottom: 0; } .p-blog-article__info { margin-bottom: 10px; } .c-pager__item__text time { font-size: 1.4rem; } .p-button--center { padding: 0; } .p-blog-face__title { margin-bottom: 10px; } .p-blog-face__group { padding-top: 20px; } .p-blog-face__list { width: 122px; height: 162px; } .p-blog-entry__group { padding-bottom: 0; width: ${OTHER_BLOG_LIST_WIDTH}; } .p-blog-entry__list { height: ${blogEntryItemHeightWithMargin * 3}px; width: ${OTHER_BLOG_LIST_WIDTH}; overflow: scroll; border: none; margin-bottom: 20px; } .c-blog-entry__name { font-size: 1.3rem; }`; document.appendStyle(styleText); shortenYear('.c-blog-article__date time'); shortenYear('.c-blog-entry__name'); shortenYear('.c-pager__item__text time'); setModalEvent('.c-blog-article__text img'); const memberIcon = document.querySelector('.c-blog-member__icon'); if (! memberIcon) { const info = document.querySelector('.p-blog-member__info'); const relayPhoto = create5thRelayPhoto(); info.prepend(relayPhoto); } switch (blogPageType) { case "blog_detail": blogDetail(); break; case "blog_list": blogList(); break; default: throw new Error(PAGE_TYPE_ERROR_MSG); } }; const doProcessEvent = () => { updateHeaderFontColor('.p-section--shakehands', '.c-shakehands-calender.pc, .c-shakehands-calender.pc a'); }; const doProcessFc = () => { const styleText = ` .fc-logo { padding: 15px; }`; document.appendStyle(styleText); };