您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
一个简易tabs标签页,只需创建该类的实例,按需传入配置即可在页面上创建
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/517538/1484731/DynamicTabs_gz.js
// ==UserScript== // @name DynamicTabs_gz // @namespace http://tampermonkey.net/ // @license Apache-2.0 // @version 0.1 // @author byhgz // @description 一个简易tabs标签页,只需创建该类的实例,按需传入配置即可在页面上创建 // @noframes // ==/UserScript== /** * * 一个简易Tabs标签页,只需创建该类的实例,按需传入配置即可在页面上创建 * * @author byhgz */ class DynamicTabs_gz { #selector; #tabsConfig; #activeTabId; #options; /** * * @param selector{string} css选择器 * @param tabsConfig {Array} 选项卡配置,参数为数组,数组每个对象为一个选项卡和对应的选项卡内容 * @param options {Object} 其他选项,可设置自定义样式和事件处理类名 */ constructor(selector, tabsConfig, options = {}) { this.#selector = selector; // 选项卡容器的选择器 this.#tabsConfig = tabsConfig; // 选项卡配置数组 this.#activeTabId = tabsConfig[0].id; // 默认激活的第一个选项卡ID this.#options = options; // 可选配置项,如自定义样式和事件处理函数 // 初始化选项卡 this.#init(); } // 私有初始化方法 #init() { const tabsContainer = document.querySelector(this.#selector); if (!tabsContainer) { throw new Error(`No element found matching the selector: ${this.#selector}`); } // 添加默认样式 this.#addDefaultStyles(); // 创建选项卡按钮 this.#createButtons(tabsContainer); // 创建选项卡内容 this.#createContents(tabsContainer); } // 私有添加默认样式的方法 #addDefaultStyles() { const defaultClasses = { tabButton: 'dynamic-tab-button', tabButtonActive: 'dynamic-tab-button-active', tabContent: 'dynamic-tab-content', tabContentActive: 'dynamic-tab-content-active' }; // 合并用户提供的类名 const classes = {...defaultClasses, ...this.#options.classes}; // 获取用户提供的样式或默认样式 const backgroundColor = this.#options.backgroundColor || '#ccc'; const borderColor = this.#options.borderColor || '#ccc'; const textColor = this.#options.textColor || 'black'; const fontWeight = this.#options.fontWeight || 'normal'; const activeBackgroundColor = this.#options.activeBackgroundColor || '#007BFF'; const activeTextColor = this.#options.activeTextColor || 'white'; const contentBorderColor = this.#options.contentBorderColor || '#ccc'; const contentBackgroundColor = this.#options.contentBackgroundColor || '#f9f9f9'; const defaultStyle = ` .${classes.tabButton} { padding: 10px 20px; margin-right: 10px; cursor: pointer; border: 1px solid ${borderColor}; background-color: ${backgroundColor}; color: ${textColor}; font-weight: ${fontWeight}; } .${classes.tabButton}.${classes.tabButtonActive} { background-color: ${activeBackgroundColor}; color: ${activeTextColor}; } .${classes.tabContent} { margin-top: 20px; padding: 20px; border: 1px solid ${contentBorderColor}; background-color: ${contentBackgroundColor}; display: none; } .${classes.tabContent}.${classes.tabContentActive} { display: block; } `; // 如果提供了自定义样式,则覆盖默认样式 const customStyle = this.#options.styles || ''; const style = document.createElement('style'); style.innerHTML = defaultStyle + customStyle; document.head.appendChild(style); } // 私有创建选项卡按钮的方法 #createButtons(tabsContainer) { const buttonContainer = document.createElement('div'); const classes = this.#options.classes || {}; this.#tabsConfig.forEach(tab => { const button = document.createElement('button'); button.className = `${classes.tabButton || 'dynamic-tab-button'}`; button.textContent = tab.title; button.dataset.tabId = tab.id; if (tab.id === this.#activeTabId) { button.classList.add(classes.tabButtonActive || 'dynamic-tab-button-active'); } // 添加点击事件监听器 button.addEventListener('click', () => { this.activateTab(tab.id); // 调用自定义的点击事件处理函数(如果存在) if (this.#options.onTabClick) { this.#options.onTabClick(tab.id, tab.content); } }); buttonContainer.appendChild(button); }); tabsContainer.appendChild(buttonContainer); } // 私有创建选项卡内容的方法 #createContents(tabsContainer) { const contentContainer = document.createElement('div'); const classes = this.#options.classes || {}; this.#tabsConfig.forEach(tab => { const contentDiv = document.createElement('div'); contentDiv.className = `${classes.tabContent || 'dynamic-tab-content'}`; contentDiv.innerHTML = tab.content; contentDiv.id = `content-${tab.id}`; if (tab.id === this.#activeTabId) { contentDiv.classList.add(classes.tabContentActive || 'dynamic-tab-content-active'); } contentContainer.appendChild(contentDiv); }); tabsContainer.appendChild(contentContainer); } /** * 激活指定的选项卡 * @param tabId {string} 选项卡id */ activateTab(tabId) { const classes = this.#options.classes || {}; // 更新按钮状态 const buttons = document.querySelectorAll(`.${classes.tabButton || 'dynamic-tab-button'}`); buttons.forEach(button => { if (button.dataset.tabId === tabId) { button.classList.add(classes.tabButtonActive || 'dynamic-tab-button-active'); } else { button.classList.remove(classes.tabButtonActive || 'dynamic-tab-button-active'); } }); // 更新内容状态 const contents = document.querySelectorAll(`.${classes.tabContent || 'dynamic-tab-content'}`); contents.forEach(content => { if (content.id === `content-${tabId}`) { content.classList.add(classes.tabContentActive || 'dynamic-tab-content-active'); } else { content.classList.remove(classes.tabContentActive || 'dynamic-tab-content-active'); } }); this.#activeTabId = tabId; } }