在 GASO 專案的開發過程中,我們不斷地優化使用者體驗和視覺效果。今天我們將專注於三個重要的視覺改進:節點樣式的優化、箭頭顏色的調整,以及高亮效果的改進。這些改進不僅讓學習地圖更加美觀,也提升了使用者的操作體驗。
首先,我們決定移除所有節點的背景填充,讓節點完全透明:
/* 節點完全透明效果 */
#zoomInner svg g.node rect,
#zoomInner svg g.node ellipse,
#zoomInner svg g.node polygon {
fill: none !important;
stroke: none !important;
}
同時,我們將字體顏色改為在淺色背景上更清楚的深藍灰色:
#zoomInner svg g.node text {
fill: #2c3e50 !important;
font-weight: bold !important;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5) !important;
}
為了讓使用者能夠清楚識別學習的起點,我們為起點節點添加了特殊的視覺樣式:
/* 起點節點特殊樣式 */
#zoomInner svg g.node.start-node rect,
#zoomInner svg g.node.start-node ellipse,
#zoomInner svg g.node.start-node polygon {
fill: #e8f4fd !important;
stroke: #3498db !important;
stroke-width: 2 !important;
}
起點節點現在具有:
我們實現了自動識別起點節點的功能:
// 找到起點(沒有入邊的節點)
function findStartNodes() {
console.log("=== 尋找起點節點 ===");
const allNodes = new Set(Object.keys(state.adjacencyList));
const hasIncoming = new Set();
// 找出所有有入邊的節點
Object.entries(state.adjacencyList).forEach(([source, neighbors]) => {
neighbors.forEach(neighbor => {
hasIncoming.add(neighbor);
});
});
// 起點是沒有入邊的節點
const startNodes = Array.from(allNodes).filter(node => !hasIncoming.has(node));
console.log("起點節點(沒有入邊的節點):", startNodes);
return startNodes;
}
我們將箭頭的顏色從黑色改為更符合整體配色的深藍灰色:
/* 箭頭樣式優化 - 只針對箭頭,不影響節點 */
#zoomInner svg g.edge polygon[fill="#000000"],
#zoomInner svg g.edge polygon[fill="black"],
#zoomInner svg g.edge polygon[fill="#000"] {
fill: #34495e !important;
stroke: #34495e !important;
stroke-width: 1 !important;
}
// 優化箭頭樣式 - 只針對箭頭元素
const arrowElements = svg.querySelectorAll('g.edge polygon[fill="#000000"], g.edge polygon[fill="black"], g.edge polygon[fill="#000"]');
console.log('找到的黑色箭頭元素數量:', arrowElements.length);
arrowElements.forEach(arrow => {
console.log('修改箭頭元素:', arrow);
arrow.setAttribute('fill', '#34495e');
arrow.setAttribute('stroke', '#34495e');
arrow.setAttribute('stroke-width', '1');
});
我們將高亮顏色從亮綠色改為更融入整體配色的紅色:
// 對 path 元素應用高亮樣式 - 使用融入整體配色的顏色
pathElement.style.setProperty('stroke', '#e74c3c', 'important');
pathElement.style.setProperty('stroke-width', '4px', 'important');
pathElement.style.removeProperty('stroke-dasharray'); // 移除虛線,變成實線
pathElement.style.setProperty('animation', 'pathPulse 2s infinite', 'important');
// 對箭頭元素也應用高亮樣式,並讓尖端更明顯
if (polygonElement) {
polygonElement.style.setProperty('fill', '#e74c3c', 'important');
polygonElement.style.setProperty('stroke', '#e74c3c', 'important');
polygonElement.style.setProperty('stroke-width', '7px', 'important');
}
為了讓高亮時的箭頭更加明顯,我們採用了多種方法:
transform: scale()
導致箭頭消失@keyframes pathPulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.7; }
}
.path-highlighted {
stroke: #e74c3c !important;
stroke-width: 4px !important;
animation: pathPulse 2s infinite !important;
}
.path-highlighted polygon {
fill: #e74c3c !important;
stroke: #e74c3c !important;
stroke-width: 7px !important;
}
我們將預設字體大小從 14px 增加到 20px,提升可讀性:
state = {
fontSize: 20,
origFontSize: 20,
// ... 其他屬性
};
問題:findStartNodes()
函數依賴於 state.adjacencyList
,但這個數據是在 Google Apps Script 返回數據後才設置的,而渲染函數在數據加載完成之前就被調用。
解決方案:
setTimeout
延遲應用起點節點樣式applyStartNodeStyles()
函數// 為起點節點添加特殊樣式(延遲執行,等待數據加載完成)
setTimeout(() => {
if (state.adjacencyList && Object.keys(state.adjacencyList).length > 0) {
const startNodes = findStartNodes();
console.log('找到起點節點:', startNodes);
startNodes.forEach(startNodeId => {
// 應用起點節點樣式
});
}
}, 100);
問題:初始的箭頭選擇器 polygon[fill="#000000"]
太寬泛,可能影響到節點元素。
解決方案:
g.edge polygon[fill="#000000"]
/* 箭頭樣式優化 - 只針對箭頭,不影響節點 */
#zoomInner svg g.edge polygon[fill="#000000"],
#zoomInner svg g.edge polygon[fill="black"],
#zoomInner svg g.edge polygon[fill="#000"] {
fill: #34495e !important;
stroke: #34495e !important;
stroke-width: 1 !important;
}
問題:使用 transform: scale(1.5)
讓箭頭變大時,箭頭可能因為縮放而超出可見區域或消失。
解決方案:
我們將樣式分為三個層級:
// 起點節點樣式應用
function applyStartNodeStyles() {
// 應用起點節點樣式的邏輯
}
// 箭頭樣式優化
function optimizeArrowStyles(svg) {
// 優化箭頭樣式的邏輯
}
// 高亮路徑
function highlightPath(paths) {
// 高亮路徑的邏輯
}
今天的開發重點在於視覺優化和使用者體驗提升。通過以下改進:
我們成功地提升了 GASO 的視覺效果和使用者體驗。這些改進不僅讓學習地圖更加美觀,也讓使用者能夠更直觀地理解學習路徑和節點關係。
在技術層面,我們解決了時機問題、選擇器精確性問題和可見性問題,展現了在複雜前端專案中處理視覺效果的技術能力。
這些改進為 GASO 專案帶來了更專業的視覺呈現,為使用者提供了更好的學習體驗。
鐵人賽剩最後幾天就要收尾了,我差不多也要把這個網站完成所有的基本功能,並且開放給大家了。接下來最後的幾天,我打算來把最核心、最關鍵的部分——就是Prompt的部分,把它寫好。敬請期待!