// 配色方案生成器 JavaScript class ColorPaletteGenerator { constructor() { this.apiUrl = 'https://60s.api.shumengya.top/v2/color/palette'; this.init(); } init() { this.bindEvents(); this.loadDefaultPalette(); } bindEvents() { const colorInput = document.getElementById('colorInput'); const colorPicker = document.getElementById('colorPicker'); const generateBtn = document.getElementById('generateBtn'); const formatSelect = document.getElementById('formatSelect'); // 颜色输入框事件 colorInput.addEventListener('input', (e) => { const color = e.target.value; if (this.isValidColor(color)) { colorPicker.value = color; } }); // 颜色选择器事件 colorPicker.addEventListener('change', (e) => { colorInput.value = e.target.value; }); // 生成按钮事件 generateBtn.addEventListener('click', () => { this.generatePalette(); }); // 回车键生成 colorInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { this.generatePalette(); } }); // 格式选择事件 formatSelect.addEventListener('change', () => { const currentColor = colorInput.value; if (currentColor && this.isValidColor(currentColor)) { this.generatePalette(); } }); } // 验证颜色格式 isValidColor(color) { const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/; return hexRegex.test(color); } // 显示加载状态 showLoading() { const loading = document.getElementById('loading'); const colorInfo = document.getElementById('colorInfo'); const palettesContainer = document.getElementById('palettesContainer'); loading.style.display = 'block'; colorInfo.style.display = 'none'; palettesContainer.innerHTML = ''; } // 隐藏加载状态 hideLoading() { const loading = document.getElementById('loading'); loading.style.display = 'none'; } // 生成配色方案 async generatePalette() { const colorInput = document.getElementById('colorInput'); const formatSelect = document.getElementById('formatSelect'); const color = colorInput.value.trim(); const format = formatSelect.value; if (!color) { this.showError('请输入颜色值'); return; } if (!this.isValidColor(color)) { this.showError('请输入有效的十六进制颜色值(如:#33AAFF)'); return; } this.showLoading(); try { const url = new URL(this.apiUrl); url.searchParams.append('color', color); url.searchParams.append('encoding', format); const response = await fetch(url); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); if (data.code === 200) { this.displayResults(data.data); } else { throw new Error(data.message || '获取配色方案失败'); } } catch (error) { console.error('Error:', error); this.showError('获取配色方案失败,请检查网络连接或稍后重试'); } finally { this.hideLoading(); } } // 显示错误信息 showError(message) { const palettesContainer = document.getElementById('palettesContainer'); palettesContainer.innerHTML = `
`; } // 显示结果 displayResults(data) { this.displayColorInfo(data.input); this.displayPalettes(data.palettes); } // 显示颜色信息 displayColorInfo(inputData) { const colorInfo = document.getElementById('colorInfo'); const colorPreview = document.getElementById('colorPreview'); const colorDetails = document.getElementById('colorDetails'); colorPreview.style.backgroundColor = inputData.hex; colorDetails.innerHTML = `${palette.description}