免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

圖表設(shè)計器核心實現(xiàn):數(shù)據(jù)建模、SVG渲染與交互全解析

圖表設(shè)計器核心實現(xiàn):數(shù)據(jù)建模、SVG渲染與交互全解析 diagram-design這個詞前端圈子里應該不陌生——你接手過一個流程編輯器、架構(gòu)可視化工具、邏輯編排平臺或者哪怕只是臨時給業(yè)務方搭一個拖拽畫布都會發(fā)現(xiàn)一個尷尬的事實圖表設(shè)計這事表面看就是畫幾個框、連幾條線但真正做起來數(shù)據(jù)建模、渲染方案、交互細節(jié)、性能優(yōu)化每一項都能折騰掉好幾個版本。這個項目名雖然短但它背后不是一個簡單的畫布Demo而是一整套結(jié)構(gòu)化圖形的可視化編輯基礎(chǔ)設(shè)施。這篇文章我就拿真實項目中做的圖表設(shè)計器來聊從需求拆解、技術(shù)選型到核心模塊的代碼實現(xiàn)和問題排查把能落地的經(jīng)驗一次講透。1. 項目到底要干什么拆解diagram-design的核心需求1.1 圖表設(shè)計器不只是畫布很多第一次接觸這類項目的人會理解偏以為圖表設(shè)計器就是個可拖拽的繪圖白板。實際不是。圖表設(shè)計器解決的核心命題是讓用戶用圖形化的方式編輯一份嚴格的結(jié)構(gòu)化數(shù)據(jù)。打個比方。畫布是表象數(shù)據(jù)模型才是內(nèi)功。用戶在畫布上拖一個節(jié)點、連一根線本質(zhì)是在改一份類似 JSON 的圖結(jié)構(gòu)節(jié)點有哪些、連線的起點終點在哪、每個節(jié)點帶什么業(yè)務屬性。而一個合格的 diagram-designer 必須保證兩件事所見即所得畫布上的位置、連線、樣式能無損映射回數(shù)據(jù)模型可恢復、可流轉(zhuǎn)數(shù)據(jù)可以導出、導入換個渲染器也能還原出同樣的圖。我記得在模擬項目X里一開始需求方一直強調(diào)要好看、要流暢團隊差點就往畫圖工具的方向跑偏了。后來我硬是拉著業(yè)務方過了一遍真正的使用閉環(huán)——從創(chuàng)建節(jié)點、設(shè)置屬性、連接關(guān)系、導出結(jié)構(gòu)化配置他們才意識到自己需要的不是畫板而是一個可視化的圖編輯器。這個認知對齊非常關(guān)鍵直接決定了后面所有技術(shù)方向。1.2 核心功能清單與優(yōu)先級排序不同場景下的 diagram-design 需求差異很大做流程圖編輯器和做網(wǎng)絡(luò)拓撲可視化雖然都叫圖表設(shè)計器重點完全不同。結(jié)合通用情況我把核心功能按優(yōu)先級排一下優(yōu)先級功能模塊說明P0畫布基礎(chǔ)節(jié)點渲染、拖拽、縮放、平移這是地基沒有它一切都免談P0節(jié)點與連線創(chuàng)建/刪除節(jié)點設(shè)置連線起點終點支持連線樣式配置P0數(shù)據(jù)導入導出至少支持 JSON 序列化/反序列化保證圖數(shù)據(jù)可保存可恢復P1對齊輔助參考線、吸附、自動對齊批量操作效率全靠這個P1撤銷重做用戶操作錯了要能回退這是編輯器區(qū)別于畫板的核心標志P2布局算法自動排版功能比如樹形布局、分層布局復雜圖必備P2小地圖圖大了以后定位用的一般放到后期做這里多說一句優(yōu)先級順序直接影響架構(gòu)設(shè)計。如果上來就做布局算法、小地圖把架構(gòu)搞得特別重反而拖慢核心鏈路的推進。我見過不少團隊一上來就往畫布里塞多選、框選、自動布局、版本歷史結(jié)果拖到最后連基礎(chǔ)的節(jié)點拖拽都有 bug。正確的姿勢是先打通數(shù)據(jù)—渲染—編輯—導出這條主鏈路再往上面加輔助特性。2. 技術(shù)選型自研還是用現(xiàn)成庫怎么選才對2.1 自研 or 第三方庫沒有標準答案只要做圖表設(shè)計器第一個問題就是能不能直接用現(xiàn)成庫。市面上的方案我不一一列舉簡單分成三類完全自研、基于通用渲染庫封裝、直接基于完整圖編輯器框架。完全自研所有渲染、交互、數(shù)據(jù)都由自己實現(xiàn)。優(yōu)點是完全可控、不依賴第三方框架體積和性能都能做到極致缺點是工作量大光是一個拖拽的精細度比如縮放后坐標修正、吸附算法就夠調(diào)一陣子的?;谕ㄓ娩秩編旆庋b比如用 SVG 或用 Canvas 渲染庫做底層業(yè)務邏輯和交互自己寫。靈活性高工作量適中這是大多數(shù)項目的務實之選。直接套完整編輯器框架優(yōu)點是功能全、開箱即用缺點是定制深了會很痛苦框架的抽象一旦和業(yè)務模型不一致改起來比自己寫還難受。我在某公司的項目里就吃過直接套框架的虧。當時團隊為了省時間引入了一個完整的圖編輯器框架結(jié)果業(yè)務方要求節(jié)點必須是多層嵌套的復合形狀且內(nèi)嵌表單要實時聯(lián)動??蚣艿墓?jié)點模型根本撐不住最后硬改框架源碼維護成本爆炸。后來重做時干脆基于 SVG 自己搭了一套反而清爽得多。經(jīng)驗之談如果業(yè)務里的圖結(jié)構(gòu)是規(guī)規(guī)矩矩的流程節(jié)點、連線成熟框架能省很多事但如果你的圖有特殊的交互、復合節(jié)點、自定義業(yè)務編排自研的靈活度和可控性是框架給不了的。我接觸過的diagram-design類項目絕大多數(shù)走到后期都是自研或半自研。2.2 渲染方案SVG 還是 Canvas這是繞不過去的技術(shù)決策。兩者特點我整理成一張表維度SVGCanvas渲染方式矢量 DOM 元素位圖繪制節(jié)點數(shù)量幾百個量級還能撐再多就卡上萬個也能流暢刷新交互能力每個元素都是 DOM天然支持事件需要自己做命中檢測、事件管理樣式控制CSS 隨便寫樣式靈活樣式靠繪制代碼控制縮放清晰度矢量無限清晰按像素繪制縮放可能模糊開發(fā)效率心智簡單適合編輯器復雜度高一點適合高刷場景我的判斷是做圖編輯器默認選 SVG。原因很簡單編輯器最核心的是人和元素的交互——節(jié)點要被選中、拖動、高亮、彈菜單SVG 天然用 DOM 支持這些鼠標事件、鍵盤事件、樣式切換都是現(xiàn)成的。數(shù)據(jù)量很大時比如超過大幾百上千個節(jié)點再考慮 Canvas 或者 Canvas 虛擬化方案。當然如果你做的是實時監(jiān)控大屏這種以展示為主、節(jié)點多到爆的場景Canvas 是更合理的。但 diagram-design 的重點是設(shè)計而不是展示這個定位想清楚渲染方案自然就有答案了。2.3 數(shù)據(jù)模型一切交互的中樞圖表設(shè)計器的數(shù)據(jù)模型我建議遵循一個根節(jié)點 兩層結(jié)構(gòu)的設(shè)計思路Graph圖整個圖表設(shè)計器的根數(shù)據(jù)包含全局的版本號、縮放平移視口信息、節(jié)點列表、連線列表Node節(jié)點代表一個可編輯的元素。除了唯一 id 和 position / size 這些幾何信息還要有一個 data 字段用來存業(yè)務自定義數(shù)據(jù)Edge連線代表節(jié)點和節(jié)點之間的連接關(guān)系。關(guān)鍵是它必須記錄從哪個節(jié)點的哪個端口到哪個節(jié)點的哪個端口。數(shù)據(jù)模型設(shè)計得好不好直接決定后面回退、聯(lián)動、序列化的復雜度。我后來的做法是讓所有數(shù)據(jù)都掛在根對象上用統(tǒng)一的狀態(tài)容器管理任何一次操作都通過生成新狀態(tài)來驅(qū)動渲染。這樣一個好處是撤銷重做、多端同步、歷史記錄都變成了狀態(tài)切換的問題而不是在組件里手動改來改去。我放一個最小化的數(shù)據(jù)模型示意TypeScript 風格interface DiagramData { version: number; viewport: { x: number; y: number; zoom: number; }; nodes: NodeData[]; edges: EdgeData[]; } interface NodeData { id: string; type: string; x: number; y: number; width: number; height: number; data?: Recordstring, unknown; } interface EdgeData { id: string; source: string; // 源節(jié)點 id sourcePort?: string; // 源端口 id target: string; // 目標節(jié)點 id targetPort?: string; label?: string; }在實際項目中我看到不少團隊為了省事直接把節(jié)點坐標、樣式、業(yè)務數(shù)據(jù)混在一起也不抽象 Graph。前期看著還行一旦要做選中、框選、屬性面板聯(lián)動、序列化就發(fā)現(xiàn)到處在打補丁。建議一開始就把數(shù)據(jù)模型當數(shù)據(jù)庫表來設(shè)計每個字段職責單一后面會少掉大量重構(gòu)成本。3. 核心模塊實現(xiàn)要點從畫布到節(jié)點到連線3.1 畫布基礎(chǔ)坐標系與視圖變換畫布的第一個門檻是坐標系。屏幕上呈現(xiàn)的內(nèi)容和用戶操作時拿到的鼠標坐標通常不在一套坐標系里。我一般把坐標系分成兩層世界坐標系圖表元素真實使用的坐標系。節(jié)點存的 x/y 是世界坐標和縮放無關(guān)屏幕坐標系用戶看到的坐標系。它等于世界坐標乘以縮放倍率再加平移偏移。畫布放大縮小時節(jié)點的世界坐標不要變只更新 viewport 里的 zoom 和 x/y 偏移。鼠標事件給的是屏幕坐標要轉(zhuǎn)換到世界坐標再去做命中、拖拽計算。轉(zhuǎn)換公式很簡單const worldX (screenX - viewport.x) / viewport.zoom; const worldY (screenY - viewport.y) / viewport.zoom;這個基礎(chǔ)卻極容易踩坑。我遇到過一個經(jīng)典的 bug拖動節(jié)點時節(jié)點跑到鼠標后面越縮放偏差越大。最終定位到問題——拖拽期間混用了屏幕坐標和世界坐標特別是 zoom 不等于 1 的時候一加一減就出錯了。經(jīng)驗是所有落到數(shù)據(jù)模型里的坐標統(tǒng)一存世界坐標所有讀取鼠標位置的代碼統(tǒng)一先轉(zhuǎn)世界坐標再用。3.2 節(jié)點的拖拽、選中與對齊輔助節(jié)點拖拽的交互邏輯拆開其實就三步鼠標按下節(jié)點時記錄起始世界坐標和節(jié)點的起始位置鼠標移動時用當前世界坐標減去起始點得到偏移量更新節(jié)點位置鼠標抬起時觸發(fā)一次快照更新供撤銷重做使用。但真實的拖拽體驗遠沒有這么簡單。要做得順手還得加兩樣東西臨界判定鼠標按下到移動的距離超過某個閾值比如 3px才算拖拽否則是點擊選中。不然每次點一下節(jié)點都會誤拖。對齊吸附拖節(jié)點的時候系統(tǒng)幫它跟附近節(jié)點的邊緣、中心線對齊。實現(xiàn)思路是候選對齊線離節(jié)點邊緣小于某個閾值比如 5px時直接把節(jié)點坐標修正到對齊位置。吸附這個功能看著不起眼卻是編輯器順手不順手的分水嶺。我在項目里專門寫了個對齊線計算工具每次拖拽時找候選對齊線、計算修正量實測下來用戶的排版效率提升很明顯尤其是做流程圖和腦圖這類對齊要求高的場景。3.3 連線交互錨點、貝塞爾曲線與命中檢測連線的設(shè)計比節(jié)點復雜不少。一個完整的連線交互鏈路由三部分構(gòu)成錨點端口、連線路徑、命中檢測。錨點一般定義在節(jié)點邊緣或內(nèi)部的固定位置。連線不是從一個節(jié)點拉到一個節(jié)點就完事而是從一個錨點拉到另一個錨點。錨點模型允許同一個節(jié)點向外拉出多條線而且能區(qū)分這條線是從哪個方向出去的方便后面計算連線路徑。連線路徑的繪制我最常用的是貝塞爾曲線默認用三次貝塞爾曲線控制點根據(jù)錨點方向和目標位置自動計算。這么做的好處是曲線平滑美觀而且方向感強一眼能看出從哪出來、到哪進去。我給一個基于 SVG 的簡化示意// 假設(shè) source 方向朝右target 方向朝左 import React from react; export function BezierEdge({ sourceX, sourceY, targetX, targetY }) { const dx Math.abs(targetX - sourceX) * 0.5; const path M ${sourceX} ${sourceY} C ${sourceX dx} ${sourceY}, ${targetX - dx} ${targetY}, ${targetX} ${targetY}; return path d{path} stroke#8492A6 strokeWidth{1.5} fillnone /; }這種實現(xiàn)方式在可視化類項目里非常通用。要處理的情況還包括連線的 label文字標簽、連線樣式虛線、實線、顏色、以及箭頭 marker。命中檢測是另一個坑。用戶要能點擊連線、選中連線、拖動連線改路。SVG 下path元素默認的可點擊區(qū)域是路徑本身很窄不太容易點中。我當時的方案是畫一條透明的寬 stroke比如strokeWidth{20}stroketransparent墊在真實路徑下面讓透明路徑來響應點擊。這樣既保留了視覺上的細線又給了用戶友好的點擊熱區(qū)。3.4 布局算法放在什么階段做布局算法是個容易過把癮就死的功能。自動排版看起來炫酷但做好很困難。我的建議是如果項目不是以自動生成圖為核心布局算法別放在早期版本。原因很現(xiàn)實——自動布局很難滿足用戶的審美有時候排出來的圖是邏輯正確但怎么看怎么怪用戶最后還是要手動調(diào)。真正需要的場景一般是三種樹形結(jié)構(gòu)比如組織架構(gòu)圖、目錄樹。這類布局用經(jīng)典的樹形遞歸布局就能搞定從上到下逐層排同一層節(jié)點對齊。分層結(jié)構(gòu)比如流程圖、狀態(tài)機??梢杂梅謱硬季炙惴ò压?jié)點按層級分列擺開再調(diào)整連線交叉。自由拓撲比如網(wǎng)絡(luò)拓撲、關(guān)系圖。這個比較復雜一般要上力導向布局模擬物理彈性、斥力、引力讓節(jié)點自動散開。如果在后期必須做一個見效快的自動排版我建議從樹形布局和分層布局入手計算公式和效果可預期也好看力導向布局雖然炫但參數(shù)調(diào)起來很磨人投入產(chǎn)出比要好好掂量。4. 實操記錄搭建一個最小可用的圖表設(shè)計器4.1 項目骨架與依賴準備這一節(jié)我把當初做最小可用圖表設(shè)計器的實操過程完整走一遍。技術(shù)棧我選 Vite React TypeScript加一個輕量的狀態(tài)管理庫。為什么選這套原因有兩個一是生態(tài)成熟寫交互組件方便二是類型定義完善對數(shù)據(jù)模型的約束強特別適合圖表編輯器這種數(shù)據(jù)結(jié)構(gòu)驅(qū)動的工程。項目初始化命令按當時的推進方式大概是npm create vitelatest diagram-design-demo -- --template react-ts cd diagram-design-demo npm install npm install zustand選 Zustand 是因為它在中小型圖表編輯器里的狀態(tài)管理成本最低不需要像大型框架那樣寫一堆模板代碼同時又支持按需訂閱更新對性能友好。真實項目里我更喜歡直接用 Zustand而不是再套一層模型層因為圖表數(shù)據(jù)本身的結(jié)構(gòu)已經(jīng)足夠表達模型了沒必要再包一層。4.2 定義數(shù)據(jù)模型與狀態(tài)容器繼續(xù)往下之前先把數(shù)據(jù)模型寫進代碼。我把 Graph、Node、Edge 的類型定義和狀態(tài)初始化放一起import { create } from zustand; interface Viewport { x: number; y: number; zoom: number; } interface NodeData { id: string; type: string; x: number; y: number; width: number; height: number; data: Recordstring, unknown; } interface EdgeData { id: string; source: string; sourcePort: string; target: string; targetPort: string; } interface DiagramState { viewport: Viewport; nodes: NodeData[]; edges: EdgeData[]; selectedIds: string[]; moveNode: (id: string, dx: number, dy: number) void; } export const useDiagramStore createDiagramState((set) ({ viewport: { x: 0, y: 0, zoom: 1 }, nodes: [], edges: [], selectedIds: [], moveNode: (id, dx, dy) set((state) ({ nodes: state.nodes.map((node) node.id id ? { ...node, x: node.x dx, y: node.y dy } : node ) })) }));這里有一個關(guān)鍵點我反復提節(jié)點位置用世界坐標存儲更新時只做加減不做縮放換算。這樣實現(xiàn)撤銷快照時最簡單至少不用每次快照前先把坐標還原到統(tǒng)一基準快照之間的數(shù)據(jù)口徑始終一致。4.3 畫布組件SVG 渲染與坐標轉(zhuǎn)換有了數(shù)據(jù)層直接到渲染層。畫布組件負責渲染所有節(jié)點和邊、以及把鼠標屏幕坐標轉(zhuǎn)成世界坐標。我當時的實現(xiàn)如下import React, { useRef, useCallback } from react; import { useDiagramStore } from ./store; import { BezierEdge } from ./BezierEdge; export function Canvas() { const svgRef useRefSVGSVGElement(null); const viewport useDiagramStore((s) s.viewport); const nodes useDiagramStore((s) s.nodes); const edges useDiagramStore((s) s.edges); const toWorld useCallback((clientX: number, clientY: number) { const svg svgRef.current; const rect svg.getBoundingClientRect(); const screenX clientX - rect.left; const screenY clientY - rect.top; return { x: (screenX - viewport.x) / viewport.zoom, y: (screenY - viewport.y) / viewport.zoom }; }, [viewport]); const handleMouseMove (e: React.MouseEvent) { const world toWorld(e.clientX, e.clientY); console.log(world coords:, world); }; return ( svg ref{svgRef} width100% height600 style{{ background: #F7F8FA }} onMouseMove{handleMouseMove} g transform{translate(${viewport.x} ${viewport.y}) scale(${viewport.zoom})} {edges.map((edge) { const source nodes.find((n) n.id edge.source); const target nodes.find((n) n.id edge.target); if (!source || !target) return null; return ( BezierEdge key{edge.id} sourceX{source.x source.width} sourceY{source.y source.height / 2} targetX{target.x} targetY{target.y target.height / 2} / ); })} {nodes.map((node) ( g key{node.id} transform{translate(${node.x} ${node.y})} rect width{node.width} height{node.height} rx{6} fill#FFFFFF stroke#C0C4CC / text x{12} y{24} fontSize{14} fill#1F2D3D {String(node.data.label ?? node.id)} /text /g ))} /g /svg ); }這里有個容易忽略的細節(jié)g的transform用的是translate(...) scale(...)順序不能反。如果寫成scale(...) translate(...)縮放中心就從原點變掉了圖會到處亂跑。我當時調(diào)試縮放功能時就被這個問題坑了半小時后來把這個順序固定下來并寫進注釋避免后續(xù)維護再造坑。節(jié)點拖動事件在真實項目里通常要綁定在單個節(jié)點上對rect或整個g加onMouseDown然后配合window級的mousemove/mouseup來完成拖拽。這里不貼全量代碼了但要點就一個拖拽移動的監(jiān)聽不要掛在 SVG 上而要掛在 window 上。否則鼠標移出 SVG 邊界節(jié)點就丟了這是實戰(zhàn)中第一必踩的坑。4.4 連線交互拖線拉出一條新邊除了渲染已有的邊從節(jié)點拉一條線出來也是圖表設(shè)計器的標志性動作。實現(xiàn)思路是開始拖拽時創(chuàng)建一個臨時邊狀態(tài)終點跟著鼠標走松開時若落在合法錨點上則生成正式邊。簡化版的臨時邊狀態(tài)interface TempEdge { sourceId: string; sourceX: number; sourceY: number; currentX: number; currentY: number; }臨時邊渲染時用貝塞爾曲線把 source 端連到鼠標當前位置鼠標松開時找到命中的節(jié)點和端口然后調(diào)用addEdge寫入正式數(shù)據(jù)。這個交互的細節(jié)在端點命中上。我當時設(shè)計了端點的熱區(qū)概念如果鼠標位置離某個節(jié)點的中心很近比如節(jié)點寬高的一半以內(nèi)就認為要連接到該節(jié)點否則是空白區(qū)域取消連線。沒有一個好的熱區(qū)規(guī)則用戶拉線的時候總是差一點接上體驗會非常挫敗。這個熱區(qū)規(guī)則的調(diào)優(yōu)沒有一個萬能參數(shù)但基本思路是一致的給用戶靠近即吸附的手感。4.5 導入導出讓圖數(shù)據(jù)能保存和恢復圖表設(shè)計器做得再好數(shù)據(jù)不能導出就廢了一半。導入導出的兩條曲線第一JSON 導入導出。這個最簡單直接JSON.stringify(diagramData)保存導入時解析賦值回狀態(tài)。注意解析的時候要做數(shù)據(jù)校驗別帶一堆非法節(jié)點進來至少檢查 nodes 不是數(shù)組、id 唯一。第二圖片導出。很多用戶都想要導出 PNG。SVG 做法比 Canvas 簡單把 SVG 序列化成字符串放進Image對象然后繪制到canvas上再toDataURL下載。這里有個常見坑如果 SVG 里有外部字體導出時字體可能渲染不一致更常見的是內(nèi)部用了foreignObject嵌入 HTML導出會白屏。所以導出前最好確保內(nèi)容都是純矢量。我當時做圖片導出時就是把內(nèi)嵌的 HTML 移除改成 SVG 原生 text 來渲染文字才解決了白屏問題。這個經(jīng)驗適用于大部分圖表設(shè)計器項目導出圖片前考慮 SVG 的兼容性避免依賴外部資源。4.6 快捷操作與撤銷重做快捷鍵是編輯器體驗的放大器。至少要支持 Ctrl/Cmd Z撤銷、Ctrl/Cmd C / V復制粘貼、Delete刪除選中。實現(xiàn)上不要寫給每個組件單獨建一個全局快捷鍵監(jiān)聽模塊統(tǒng)一分發(fā)。撤銷重做我推薦兩種方案對比方案思路優(yōu)點缺點快照每次操作后保存整體數(shù)據(jù)快照實現(xiàn)簡單邏輯清晰內(nèi)存消耗大節(jié)點多時頻繁快照會卡命令模式每個操作定義 undo/redo 兩個方法內(nèi)存友好操作粒度細抽象成本高每個操作要寫兩遍邏輯我實際的項目里中等復雜度圖用了快照 節(jié)流的組合只有鼠標松開、鍵盤刪除這類操作結(jié)束時才生成快照拖拽過程中的實時移動不生成快照。這樣內(nèi)存壓力可控代碼也簡單得多。真到了圖譜特別大的場景再考慮命令模式也不遲。5. 常見問題與排查實錄把踩過的坑都攤開說5.1 圖表一多就卡頓到底卡在哪圖表設(shè)計器最常見的性能問題是節(jié)點上百個之后拖拽畫布、縮放開始掉幀交互有明顯的延遲。我排查性能問題的固定套路是三步走先確定瓶頸在渲染還是狀態(tài)。如果純 DOM 渲染卡資源面板里看 JS 執(zhí)行時間如果狀態(tài)更新頻繁導致大量組件重渲染就要看更新訂閱范圍。減少不必要的重渲染。用 Zustand 時每個組件按需訂閱它關(guān)心的字段別把整個 store 都放進去。這個點在 React 下特別有效。SVG 元素數(shù)量過大。幾百個節(jié)點在 SVG 里其實還好上千個就明顯吃力。此時可以選擇對離屏/不顯示的節(jié)點做懶渲染或按視口裁剪只渲染可視區(qū)域。我清楚的記得模擬項目X里節(jié)點一多畫布平移就卡后來定位到問題在所有節(jié)點都在 SVG 里常駐渲染平移時每個節(jié)點都要跟著重排。后來我把節(jié)點分組平移時只更新外層g的 transform內(nèi)層節(jié)點不動性能一下提了上來。這種靜態(tài)內(nèi)容打包成小組動態(tài)位移只動小組外層的思路特別適合 SVG 渲染的圖表編輯器。5.2 拖拽錯位坐標換算別踩坑拖拽錯位是圖表設(shè)計器里出現(xiàn)頻率最高、也最容易讓人迷惑的問題。癥狀是拖動節(jié)點時節(jié)點明顯偏離鼠標位置而且縮放比例越大偏得越多。我在排查這種問題時必查三處事件監(jiān)聽用的坐標是什么如果直接用e.clientX、e.clientY這是屏幕坐標如果用e.offsetX、e.offsetY那是相對于當前目標元素的坐標。兩者都要先轉(zhuǎn)世界坐標。節(jié)點位置和拖拽開始位置是否同一坐標口徑節(jié)點存的是世界坐標拖拽計算如果用屏幕坐標加一減一加就錯位了。CSS transform 有沒有影響坐標換算如果容器不是全屏svg.getBoundingClientRect()返回的 rect 會包含容器位置和縮放所以不要想當然地拿clientX做減法要先減去rect.left。這個排查思路幫我在好多次 Code Review 里一針見血地發(fā)現(xiàn)問題。遇到錯位問題別急著加偏移補償先把坐標口徑理清楚80% 的問題半小時內(nèi)就能定位。5.3 撤銷重做的幾個隱形坑撤銷重做看著簡單做起來全是細節(jié)。最典型的問題有三個撤銷后節(jié)點和連線不同步。比如節(jié)點刪了連到它的邊還在或者撤銷添加節(jié)點操作時節(jié)點沒了邊還懸空。根治辦法是操作封裝成變更集節(jié)點和受影響的邊一起進快照。撤銷時 viewport 要不要恢復用戶把一個地方放大然后撤銷編輯視圖卻跳回之前的狀態(tài)體驗很差。常規(guī)做法是視口不進撤銷快照單獨維護一個純視圖狀態(tài)。連按撤銷過快導致內(nèi)存爆炸。這個好解決限制快照數(shù)量比如只保留最近的 50 個快照超出就把最老的丟掉。還有一個細節(jié)特別容易忽略編輯器初始加載時不要生成快照否則用戶一進頁面按撤銷發(fā)現(xiàn)界面回到了一片空白。解決辦法是初始數(shù)據(jù)先應用完再初始化快照棧的起點。5.4 縮放后節(jié)點位置漂移或文字模糊如果使用 SVG 渲染矢量圖形理論上不會模糊。文字模糊常常是因為用了某些外部字體、或者 SVG 嵌入了foreignObject。解決辦法是文字統(tǒng)一用 SVG text 渲染字體用系統(tǒng)字體棧。節(jié)點位置漂移的問題多半還是出在坐標口徑或 transform 順序上。我之前調(diào)試過一個 bug縮放時節(jié)點位置看起來是飄的后來發(fā)現(xiàn)是scale寫在了translate前面縮放中心從原點變成了 0,0導致整個圖縮放時整體往一個方向跑。修正順序后一切恢復正常。記住transformtranslate(x y) scale(zoom)才是以 (x,y) 為錨點縮放的正確寫法。6. 一點自己的心思圖表設(shè)計器這類項目真正有價值的地方不是堆了多少炫酷功能而是把數(shù)據(jù)模型這個地基打扎實。我吃過的虧里十有八九是前期不重視數(shù)據(jù)模型后期返工補課。節(jié)點、邊、端口、視口這四類數(shù)據(jù)一開始分清楚職責邊界后面加功能都順。還有一個感受想分享做 diagram-design一定要多跟真實用戶一起操作幾輪。你真看用戶是怎么畫圖的會發(fā)現(xiàn)他們根本不關(guān)心技術(shù)選型只在乎拖得順不順、對齊準不準、連線好不好接、撤銷穩(wěn)不穩(wěn)。銷售說的用戶體驗就是這些看起來很不起眼的交互細節(jié)。把這些細節(jié)打磨好才是這個項目最值得投入的地方。如果你正要開始做類似的圖表設(shè)計器我的建議是先用最簡版本打通畫節(jié)點、拉連線、導出 JSON這條鏈路再回去填功能細節(jié)。別一上來就規(guī)劃宏偉藍圖先把一杯水倒?jié)M再考慮裝更大的壺。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色高清无码视频| 婷婷五月天日本无码| 国产古装妇女野外A片| 色色色色色色色综合| 九九婷婷热| 91久久综合亚洲鲁鲁五月天| 丁香六月无码| 99亚洲综合| 五月婷久久综合| 久久五月天大美女| 影音先锋91男人资源在线播放| 区美毛片子| 丁香婷婷精品视频| 丁香五月婷婷天堂大香蕉| 五月婷婷六月丁香| 色婷久九| 俺去也综合| 亚洲成色综合网站免费观看| 午夜激情综合| 狠狠色婷| 泰州成人视频| 99热九九在线| 99热久久最新地址| 五月丁香va| 亚洲色婷婷五月天| 操操熟女| 月色色综合婷婷网| 丁香花五月天社区| 色一色综合| 九色视频91| 橾逼网| 欧美日韩AAAAA| 99热啪啪| 日韩在线视频中文字幕| 91色噜噜狠狠狠狠色综合| 五月天色婷婷基地| 亚洲色综合性| 大陆肏屄视频| 思思热久久爱| 日韩操| 综合久色五月| 成人婷婷深爱综合网| 色区久久| 欧美激情五月天婷婷| 激情 婷婷| 就爱日五月天| 欧美婷婷精品激| 五月天大香蕉av| 婷婷色网| av在线免费播放观看| 久久激情网| 色婷婷五月天偷拍| 成人五月天丁香婷| 五月天桃色深爱网| 狠狠狠狠狠| 婷婷的99视频网站| 手机AVAV天堂看网| 丁香涩涩五月天| tingting五月天亚洲| 激情小说五月天社区丁香| 国产精品日日躁夜夜躁| 五月天色图| 成人 视频免费观看网站| 大香蕉伊在| 9久热在线视频| 95精品区一区二| 91打屁股免费看| 免费看欧美成人A片无码| 91男同| 91色婷婷综合久久中文字幕二区| 五月丁香婷婷成人网| 久久国产精品乱子伦_靑青草…| 六月激情婷婷| 人人人人人人人人人草| 夜夜操,天天撸| 天天影视色综合网| 激情五月网站| 日本人人超碰| 五月色丁香| 久久a热| 超碰99在线| 日本色婷婷| 9l视频自拍9l九色成人| 激情婷婷丁香| 久草a片| 久草A片| 超碰人人色| 99久久国产宗和精品1上映| 久久久婷婷| 久久久久久久久久8888| 色婷婷五月丁香色| a在线观看| 狠狠香婷婷五月| 综合在线丁香五月| 99热碰碰| 开心五月网 | 久久机热这里只有精品免费视频| WWW激情五月天| 操日本人妻视频| 五月丁香婷庭在线| 国产67194| 五月婷婷AV| 久久久五月五丁香| 五月久久综合| 久99久在线| 7777国产盗摄农村女人| 久草 天堂| 五月丁香999| 色七七色九九| 综合色、色综合| www.久久99热地址发布| 5月色婷婷| 伊人狠狠干| 六月婷婷色色色| 欧美乱码国产一级A片| 婷婷色网站| 久久视频这里都是精品| 综合网激情| 亚洲六月色| 色欧美一级| 91久久免费| 啪啪色激情五月天| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 97人人超| 婷婷伊人75| 亭亭丁香97| www.粉嫩av.com| 日本人人xxx| 色五月 五月婷婷| .青娱乐天天操B| 色色色色色日韩午夜激情 | 老司机午夜福利视频金瓶梅| 婷婷色五月婷| 色欧美一级| www.夜夜| 丁香婷婷激情网站| www.激情| 国产婷婷五月中文字幕高清| 无码日本精品XXXXXXXXX| 五月天婷婷基地综合网| 国产免费AV网站| 亚洲色色五月| 殴美日比视频| 欧美va亚洲va| 国产一级片色色| 影视av久久久噜噜噜噜噜三级| 思思热久在线观看视频| 亚洲无码99| 夜夜躁婷婷AV| 强伦轩人妻一区二区电影| 67194线路二在线观看| 性色欲情 网站| 亚洲成人网站在线播放| 狠狠爱婷婷色| 欧美色性色好| 一二区成人电影| 色婷婷www| 激情五月天小说| 超碰9799| 99热这里只有精品一区| 九一九九黄色| 国产偷人妻精品一区| 亚洲深喉aV| 开心六月丁香五月婷婷| 亚洲精品久久久无码| www.xtbsty.cn.com蜜乳AV| 99热1| 亚州色综合| 亚洲人妻五月丁香婷婷| 99久免费视频| 偷拍91九色| 大天天伊人| 激情五月天婷婷丁香 | 啪啪婷婷五月天激情| 美女91一起草| 大香蕉九操| 99精品在线观看| 色综合久久综合中文综合网| www.婷婷五月天| 久久中文人妻系列| 夜夜嗨一区二区三区直播内容 | 久久婷婷东京热大香樵| 激情九月综合| 五月丁香怕怕综合| 日韩一级一片内射视频4K| 色婷婷五月天堂资源| 夜夜嗨一区二区三区直播内容 | 久久久精品AV| 色香蕉影院| 99热这是里只有精品| www.夜夜| 伊人五月成人| 婷婷婷久久久| 99操逼| 天花AV无码| 可以看的av| 日本一级特黄大片AAAAA级| 久久婷婷五月综合激情国产 | 亭亭色色五月天| 婷婷色综合| 99久久婷婷国产综合精品草原| 色色永久| 人妻五月天激情开心网| 99久久性爱| 久久这里只有精品07| 久久性都花花世界成人免费视频| 色色色无码| 《诡秘之主》在线观看| www.9797国产| 色呦呦在线| 狠狠穞A片一區二區三區| 五月丁香综合| 99性感视频| 婷婷五月六月| 九九视频这里有精品| av激情在线| 91chinese在线| 丁香五月婷婷五月天在线| 丁香婷婷天堂| 99自拍视频在线| 情欲综合网| 色综合色综合色综合| 日韩 中文 欧美| 婷婷在线五月天观看| 2022久久婷婷| 成人做爰高潮A片免费视频| 牛牛碰免费| 色婷婷大香蕉| 精品动漫 无码av| 日韩九九| 爱婷婷都市激情| 中文字幕+乱码+中文字幕在线观看| 婷婷丁香久久网| 91色在线/日韩| 久热这里精品免费| wWwCom夜操wwW| 天堂久热| 麻豆WWWCOM内射软件| 538在线精品| 精品99久久久久成人网站免费| 婷婷丁香婷婷97| 99精品综合视频| av免费在线网站| 成功精品影院| 日本久久99| 五月深爱激情网| 99久热这里只有精品视频删减版| 99久久97久久欧美综合网| 久热无码| 激情小说五月天| 激情小说婷婷五月| 夜夜操天天爽| 婷婷五月天激情影片| 99ri国产在线| 五月婷婷综合社区| 美女爆乳18禁www久久久久久| 婷婷五月天伊人| 激情综合网五月天| 99九九热在线观看| 丁香五月综合久久| 草久私拍| 丁香五月婷婷香| www.色五月| 日本欧美国产| 另类小说五月天| 五月天婷婷激情春色小说| 这里只有精品在线视频精品| 狠狠干狠狠色| 91超级碰碰| www.99精品视频| 色色色婷婷五月天| 91视频精品99| 插插插丁香五月婷婷| 去色色五月天| 五月天色欧美| 九九热婷婷| 91主播在线| 婷婷丁香无码专区| 久久受www免费人成| 99国产精品久久久久久久久久久| 久久九九网| 日本三级日本三级99| 中文av网站| 色综合色综合色综合| 五月天性色| 99这里精品| 天天色综合天天| 色激情综合| 五月色丁香| 婷婷六月色情| 97香蕉久久超级碰碰高清版 | 五月婷婷六月少妇激情| 亚洲成人五月| 婷婷五月色情| 久久婷婷色| 久久9精品| 99欧州偷拍视频| 婷婷在线综合| 成人片在线播放| 色爱综合网| 天天干天天干天天操| 中文字幕在线免费| 伊人色综合网| 狠狠色婷| 久久最新色| 性高潮久久久久久-九九九九九九九九九九热-成人AV | 强伦轩人妻一区二区电影| 婷婷激情五月天激情| 五月激情六月综合| 26uuu精品一区二区| 久久东京热婷婷五月| 综合久久9| 激情综合婷婷| 亚洲精品字幕在线观看| 日本色超碰| 欧美日韩国产日本精品四虎网网站物| 91碰| 丁香婷婷射| 婷婷五月久久| 91色色色18| 五月婷婷综合网| 人妻久久久久久| 亚洲国产精品VA在线看黑人| AVV黄| 91se在线视频| 欧美色小说婷婷| 99热精品免费在线观看| 欧美综合五月丁香六月婷| 婷婷五月色天| 久久玖玖99| 激情啪啪五月| 2025天天爽天天摸| 亚州操操| 99超碰欧美| 伊人久久大香天蕉亚洲特级| 夜夜骑操AV| 在热视频精品| 久久久久人妻精品| 久久影视婷婷五月| 成人欧美一区二区三区在线观看| 99热精品免费| 97色婷婷| 婷婷九月激情| 夜夜干天天干| 丁香六月天| 丁香婷婷久久综合在线| 蜘蛛女免费观看完整版高清电影| 五月丁香婷婷基地| 亚洲精品久久久无码| 亚洲精品444久久久久久| 99在线免费视频| 就爱操www com| 激情噜噜噜| 狠狠狠狠狠| 婷婷六月综合基地| 色色婷婷综合网| 丁香婷婷九月| 殴美97色| 五月天婷婷爱丁香中文字幕| 天天看A片| 男人大jjc女人免费视频| 欧美在线看| 麻豆五月丁香婷婷| 国产免费一区二区在线A片视频| 婷婷激情五月天激情小说| 五月婷视频久久| 99色免费观看全部| 色噜噜丁香| 日本综合色图| 色玖玖导航| 国产成人片| 91精品综合久久婷婷九色| 秋霞午夜理论| 99久在线精品| 偷拍91九色| 六月丁香婷婷天堂| 色优久久| 99热999| 婷婷亚洲丁香五月| 五月婷婷婷| 毛片蕉地一二| 五月丁香欧美| 被强行糟蹋的女人A片| 九热久| 五月婷婷网五月在线| 婷婷五月色| 91综合在线视频| 五月天艹天天| 99re6在线视频精品免费| 亚洲一区国产传媒| 婷婷五月天电影网| 久久ri精品视频| 人人天堂操| 九九这里都是精品| www.91九色| 深爱婷婷丁香五月激情| 操91综合网| 国产精品久久在线观看技巧| 97福利视频| 久婷婷五月综合欧美| 婷婷欧美激情| 琪琪色网址| 九月婷婷综合八月丁香在线观看| 色婷婷五月综合| 九九干视频| 97丁香五月| 老美AA片| 六月丁香激情综合| 久综合4| 狠狠干2007| 少妇综合网| 色色五月天婷婷| 五月色丁香| caopeng97人人| 激情九九这里只有精品| 二区成人视频| 亚洲色网址| 九月大香蕉| 26uuu欧美宗合| 亞洲自怕| 五月综合婷婷五月| 91在线看免费 九九九九| 色五月激情网| 超碰在线中文字幕| 婷婷伊人网| 99操久久| 日韩精品AV一区二区三区| 美女五月激情| 成人中文网| 色大综合| 91人人爽人人操| 婷婷五月在线播放| 丁香六月婷| 欧美六月| 婷婷六月色丁香视频在线观看| www激情| 日韩抽插操逼| 色五月天 丁香| 亚洲激情综合免费| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 99热综合在线观看| 久久婷婷青青| 丁香五月婷婷综合精品素人| 97狠狠色| 日产精品一线二线三线芒果| 丁香六月激情综合啪啪| 婷婷伊人视婷婷婷| 婷婷五月天激情综合| 日本超碰在线| 激情AV网| 特级西西4444www无码| 99久久精彩视频| 人人干女人| 婷婷六月丁香开心深深爱| 日本色婷婷| 久久婷婷五月综合激情国产| 亚洲成人中文字幕| www,天天干| 婷婷开心青青草| 超碰99热精品在线| 国产成人av在线播放| 色综天天综合| 久久成人亚洲欧美电影| 天天干天天爽| 婷婷色五月综合丁香| 狠狠干最新地址| 成年人丁香五月| 伊人久久婷婷| 操逼视频网址| Av性爱网| 丁香五月综合网| 色色五月婷婷久久| 深爱激情九九五月天| 婷婷五月综合基地| 91久久久久久久| AV在线收看| 婷婷大香蕉| 九九九九九无码| 激情婷婷综合网| 99热这里是精品| 99aese| 五月综合激情| 综合网精品99| 九九99久久| 五月丁香网中文字幕| 蜜桃婷婷狠狠久久| WWW色五月| 一区二区乱码视频| 丁香五月综合网亚洲综合欧美狠狠| 91丁香五月| 中国操逼99| 亚洲激情综合| 婷婷色导航| 在线播放人妻| 亚洲精品网站色视频| 色色五月婷婷网| 久久五月视频| 久久性爱视频网站| 天天操天天操| 99久久久国产大片| 91chinese 在线| 亚洲精品V天堂中文字幕| 日本超碰在线| 色色色综合色| 思思热再线视频| 99热只有精品在线播放| 激情文学第四色婷婷丁香五月| 三级毛片视频| 蜜桃人妻无码AV天堂三区| 人人摸人人干| 综合久久99| 男人综合网| 天天色天天射天天日| 色色网91| 婷婷五月丁香四射| 久久综合九色综合97婷婷| 天天操比比| 五月婷婷|欧美| 天天做天天爱综合| 亚洲99激情| AV大香蕉| 超碰超碰在线| 99久在线精品99re5热视频| 不卡成人免费| 超碰人妻公开在线| 亚洲亚洲人成综合网络| 国产肥白大熟妇BBBB视频| 久久99久久99精品免视看婷| 中文AV在线观看| 这里只有精彩视频| 美女五月天| 日本成人小说婷婷六月| 色欲日日躁| 婷婷丁香水多多视频| 金桔一区二区ab地址| 五月丁香激情怕怕| 99精品久久久久久久婷婷| 黑人无码一区| 亚洲婷婷久久综合| 在线中文字幕av| 91九色无码日韩| 97超级碰碰碰| 五月丁香婷中文| w婷婷五月婷婷w| 五月天婷婷色色网| 99啪啪视频| 久久综合五月天| 久久总和99| Caop在线| 婷婷综合网站| 六月丁香婷| 亚洲综合九九| 免费99情趣网视频| 激情熟女网| 色色综合五月| 性生活视频98791| 九九婷婷综合| 婷婷丁香社区网| 久久在这里有精品| 色五月综合婷婷| 丁香五月婷婷成人网| 婷婷五月精品中文字幕| 可以看的AV| 婷婷久久色| 99精品视频偷拍| 婷色五月| 中国女人做爰A片| 色色色com| www.maotanji.com| 久久免片| www,99热在线观看| 热久69| 91色涩| 五月婷婷av| 激情宗合哪里能看| 另类国产综合| 欧美啪啪9| 激情五月天影院| 国产美女无遮挡裸体毛片A片| AV成人在线网站| 91 九色 入口| 99色色热| 天天视频亚洲| 天天成人综合| 狠狠五月激情丁香六月| 五月玖玖| 丁香五月天成人| 色婷婷文字幕| 五月婷婷激情综合在线| 97色色色色色| 另类专区在线观看| 中文字幕精品无码一区二区| 日本三级毛片| 99er免费在线观看| 亚洲精品激情| 26uuu精品国产| 日韩在线观看网址| 色9999日韩国产| 97色伦另类图片小说视频 | 狠狠色丁香婷婷综合久久97AV| 欧美肉大捧一进一出免费视频| 欧美色骚婷婷五月天| 色婷婷丁香女女| 大香蕉伊在| 99在线热视频| 色色网站观看| 欧美久久久中文字幕| 少妇达人正片在线播放_ikun_福利吧| 色丁香婷婷| 久碰视频| 五月丁香六月婷婷综合网站 | 婷婷成人综合免费视频| 丁香五月综合网亚洲综合欧美狠狠| 91碰在线| 狠狠色中色| 免费视频舔| 国产va视频| 少妇熟女视频一区二区三区| 激情婷婷在线中文字幕| 激情五月丁香六月婷婷| 99色色网| 91avse| 五月色天情| 99色性爰网络| www99久久| 这里只有精品网站| 五月天开心色情网| 99啪在线视频| 色色色色色色色色色999| 激情综合五月丁香| 玖玖综合玖玖| 婷婷丁香五月天狠狠| 在线播放成人网站| 激情开心五月天| 精品综合爱| 天天色官网| 超碰99在线观看| 91精品综合久久婷婷九色| 婷婷中文字暮| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 18久久| 色五月天成人在线| 99热久| 青青.com| 九九激情综合| 天天肏高清在线| 色综合激情| 日本三级第一页| 六月亚洲| 一本色综合色| 亚洲精品无人区| 五月天色婷婷激情| 一级A片天天操夜夜操| 亚洲五月婷婷| 停停综合色色| 激情亚洲婷婷| 久久婷婷五月综合色丁香| 超碰二区| 影音先锋91资源站| 久久婷婷五月综合网| 婷婷色在线| 色五月婷婷在线| 五月天黄色激情小说| 婷婷伊人网| 人人操婷婷| 激情综合六月| 91精品视频男人的天堂| 五月婷婷中文| 一区二区你懂的| 婷婷激情视频欧美视频自拍视频欧美剧| 婷婷干| 五月婷婷激情视频| 99色久| 人人操AV| 久久久中文| 26uuu最新地址| 啪啪啪综合网| 内射人妻视频国内| 九九热在这里只有精品| 欧美三级大片AA在线看| 丁香五月成人| 色五月综合激情| 色九月| 色婷五月丁香久亚洲| 在线中文AV| 怡红院视频| 国产精品国产| 婷婷六月色情| 丁香久久九九99| 亚洲婷婷久久综合| 丁香六月婷月91婷月| 天天日天天爽| 丁香社区婷婷五月| 99热这里有精品首页10| 激情综合网五月| 涩涩五| Av免费网站在线| www.狠狠| 色色色在线免费视频| 五月天丁香色色| AV操操操| 永久的网站AAAA | 播五月丁香三月婷婷| 中文字幕,综合,91| 色婷婷成人做爰A片免费看网站| 国产淫熟妇| 99久久婷婷综合| 狠狠操狠狠爱| 操人91| 亚州日本欧州韩美高青高潮一| 亚洲男人的天堂婷婷色五月| 大陆肏屄视频| 另类图片色五月| 丁香婷婷激情| 在线日本www| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 激情五月天社区| 五月婷婷天堂| 国产欧美精品AAAAAA片| 免费看片在线观看| 9久精品视频| 九九婷婷五月天影视| 深爱婷婷丁香五月激情| 五月婷婷,六月丁香| 激情开心五月天| 91色噜噜狠狠狠狠色综合| 国产精品人成A片一区二区| 婷婷播5月| 26uuu欧美日韩| 超碰AV成人| 激情AV| 韩国天天婷婷| 亚洲欧洲自拍图片专区五月天| 少妇婷婷五月天| 日日干夜夜干| 99热大香蕉| 五月色俺婷婷| 一区二区中文字幕| 亚洲久久日| 久久九久久| 亚洲综合激情五月久久| 五月久久婷婷成人网| 五月婷成人网| 另类图片色五月| 色原狠狠综合| 国产偷人爽久久久久久老妇APP| 丁香五月人妻| 亚洲综合草草| 综合激情九月婷婷,激情综合婷婷中文字| 婷婷综合激情| 色综合色五月| 淑女丝袜bi操逼123| 天天日,夜夜爽| 色婷婷综合网| 草一草avb| www.一起草av| 曰韩五月丁香色婷婷无码| 激情五月久久| 91婷色| 99热这里只有精品在线| www国产亚洲色婷婷com| 天天干,天天舔| 日韩精品一品二区三区的使用体验| 欧美情色一区| 99精品视频在线观看| 五月丁香天天| 妻久久久久| 色欲久久综合| 91色操| 五月婷婷久久大香蕉| 超碰人人妻| 色婷婷五月天激情在线观看| 五月丁香激情综合| 夜夜久久综合网| 婷婷五月天六月丁香| 91黄色五月天视频| 婷婷五月伦理| 操97在线观看| 99精品视频在线| www,久久久| 2020日日干| 狠狠做婷婷| 久久伊人大香蕉| 五月丁香花视频| 综合网亚洲| 99热在线只有精品| 五月婷婷在线视频观看| 五月婷婷亚洲| 激情综合色婷婷啪啪六月天| 成年人最刺激的综合网| 五月久久婷婷成人网| 丁香婷婷成人网站| 丁香婷婷激情六月五月开心| 九九99香蕉在线视频播放| 另类小说色婷婷| 五月天成人综合| 九九色大香蕉| 九九aV| 婷婷五月天伊人| 亚洲九区| 91操网| 欧美婷| 99秘 在线| 丁香五月综合在线观看| 色久五月天| 婷婷五月天天爽| 99欧州偷拍视频| 五月天com| 疯狂做受XXXX高潮A片| 97色吧| 中文超碰视在线| 五月天激情黄色网址| 丁香五月婷婷激情四射| 激情综合五月丁香| 中文无码精品一区二区三区| 五月婷综合网| 久久性爱视频网站| 久久久com| 狠狠五月天激情| 婷婷丁香人妻天天爽| 久久色五月天| 丁香九月激情| 99热综合在线观看| 九九热99精品| 91九色网| 日本成人噜噜噜噜噜| 色五月天成人| 五月天婷婷基地| 成人亚洲精品久久久久| 99ri视频在线观看| 婷婷五月天AV| 五月婷婷无码专区| 五月天色不卡| 99热婷婷| 精品AV无码超碰| 大香蕉啪啪| 婷婷色系婷色| 99色精品| 99免费在线视频| 五月色丁香婷婷综合| 成年人夜夜喷水| 日韩a热| 亚洲五月天婷婷| 99久久久99久久91熟女| 欧美A片在线视频免费观看| 骚五月婷婷| 第六色在线| 五月综合久久| 在线观看免费观看在线9久| 色五月婷婷青娱乐| 色久播播| 五月丁香色综合| www.91色| 九九热婷婷| 99久久a线观| 99爱视频| 操操操B| 99精品自拍| 凹凸操Av| 日日撸日日操| 一起草性爱不卡视频| 黄色视频网站在线播放| 婷婷丁香五月综合| 五月好婷婷| 日本一级一级一级一级| 丁香六月激情综合网| 五月青青草综合| 99精品一二三四视频| 婷婷中文字幕欧美| 五月花综合| 狠狠操狠狠插| 日韩av一区二区在线/日产精品久久久 | 午夜九九电影| 中文字幕,综合,91| 亚洲av电影网站| 99久在线精品99re8热| 思思久久青草热| 欧美日韓成人亚洲精品另类| 区区久久妻| 婷婷操超碰| 9久久精品视频| 1级欧美日韩| 五月色丁香| 五月激情婷婷在线| 在线不卡视频| 婷婷午夜精品久久久| 婷婷五月深深爱| 高清一区二区三区日本久| 99热免费精品| av九九| 激情五月久久| 欧美成综合在线观看| 五月丁香综合激情在线观看| 337p大胆噜噜噜噜噜91Av| 免费观看日韩成人av| 色狠狠图片| 亚洲AV免费在线| 久久影视婷婷五月| 久久精热| 九一娱乐在线观看视频| 六月丁香婷婷尤物| 99热在线观看| 五月在线婷色| 亚洲中文字幕AV| 91色九| 色五月亚洲| 日本 色综合| 欧美综合激情五月天| 男人先锋久久| 影音先锋91男人资源在线播放| 丁香五月天五码婷婷| 99热在线播放| 国产阿姨日皮艹逼内射视频| 夜夜干天天操| 五月婷婷开心亚洲无| 亚洲黄色影视| 久操操| 亚洲激情四射| 丁香婷婷五月六月久久| 婷婷五月丁香久久| 热99精品视频五月| 五月天激情影院| WWW99热| 九九热欧美| 欧洲一区二区| 国产激情视频在线观看| 亚洲六月婷婷| 激情五月天影院| 永久的网站AAAA | 国产精品热搜丁香五月婷婷| 影音先锋秋秋五月婷婷| www色综合| 婷婷久久欧美| 综合伊人狠狠| 中文字幕第四色.999| AV性爱在线| 91婷婷伊人牛牛| 五月丁香婷中文| 婷婷五月播| 丁香五月天啪啪| tingtingzonghewang| 久草婷婷网 | 婷婷伊人綜合中文字幕小说| 99精品综合| 色综合xx| 色五月丁香A欧美com | 国产亚洲精品AAAAAAA片| 日韩xx在线| 五月丁香色综合| 狠狠色丁香| 欧美在线| 开心激情播播五月天| www.无码com| 丁香成人五月天| 综合狠狠干| www,99热在线观看| 婷婷久久免费| 亚洲色五月| 蜜乳久AV| 无套内射极品大美女| 三级黄网站| 桃色成人网| 婷婷五月激情五月激情| 99九九玖玖| 天天综合色| 麻豆五月丁香婷婷| 婷婷五月综合网| 婷婷亚洲综合| 九九精品视频在线观看| 久草婷婷| 色色COm| 五月激情网站| 97干干干丁香| 日韩色色视频| 夜夜躁狠狠| 久久丁香网| 99re热视频这里只精品| www·五月天| 久婷久婷| 日韩无码专区| 99热这里只有精彩| 日韩天堂久久| 九九Av| 99色 | 26UUU在线观看| 91精品婷婷国产综合| 91碰碰碰| 九九精品亚洲| 婷婷丁香成人在线视频| 久久 无毛。| 精品色色| 久热黄色| 99精品在线下载| 在线不卡视频| jiujiuxiangjiaowang| av九九| 天天情色综合网| 免费国产VA国产免费| 丁香五月婷婷总啪啪| 99视频在线精品| 欧美日韩一区二区三区四区| 丁香婷婷激情五月| 五月天天综合| 99久久欧美| 亚洲无码另类| 五月欧美丁香在线观看| www 五月天 com| 日韩九区| 97艹| 亚洲中文字幕在线观看| 久久98| 真实亲子乱子伦高清在线观看| 日本天天综合| 一级性感黄色内射视频| 91综合在线观看| 色婷婷小说| 五月青青草综合| 久热一本| 热99免费在线| www.夜夜爱.com| 久色精品| 五月天激情婷婷| www.婷婷五月天| 26UUU精品一区二区| 亚洲丁香五月美女| 色色成人網| 人妻人人操| 久久婷婷国产| 九九九九中文字幕| 婷久久久| 中文字幕在线免费看线人| 色婷婷亚洲精品天天综| 九九这里都是精品| 99re在线这里只有精品视频首页| jiujiu无码五区| 日本欧美在线| www久久久久久久97| 久久伊人婷| 色婷婷aV四虎| 色六月 婷婷| 激情AV网| 97久久超碰| www.99热这里只有精品| 婷婷色中文字幕| 亚州操操| 96精品久久久久久久久| 亚洲狠狠干| 99热九九热| 99久久免费精品| 婷婷激情六月天视频| 六月丁香五月亭亭| 五月天久久www| 精品怡红九九九| 色狠狠六月| 人人妻人人澡人人爽| 超碰免费人人肏| 久婷婷久草| 久热伊人91| 9久热在线视频| www.99视频| 精品一区二区三区四区五区六区| 久99久视频| 婷婷综合五月天| 少妇人妻人伦A片| 激情小说五月天| 99re在线播放| 色婷婷成人做爰A片免费看网站 | 天天操夜夜爱| 99视频精品全部免费观看| 久久性爱网站| 蜜桃婷婷丁香| 婷婷五月六月激情| 欧美丁香婷婷五月| 六月婷婷开心| 日韩高清成人| 99精品色| 搡BBBB搡BBB搡18| 这里只有精品96| 色色五月婷婷久久| 午夜天堂啪啪| 婷婷在线精品| 成人做爰高潮A片免费视频| 九九热视频精品999| 亚洲av电影网站| 亚洲无码www| 亚洲熟女色| 色五月无码| 色天天综合成人网| 51avj视频大全| 久久婷婷五月综合激情国产| 九九热av| 亚洲日韩乱码一区二区三区四区 | 丁香五月天视频在线播放| 五月天激情久久| 色色色五月婷婷| 狠狠干,狠狠操| 久久久潮喷-久久久九九-成人AV| 开心五月婷婷综合在线精品素人| 91九色欧美| 婷婷综合五月天| 艹色18p| 色婷婷狠狠| 天天综合精品| 天天操天天日天天爽| VA婷婷| 久久曰曰| 色色五月天com| 丁香婷婷久久五月天| 九九色热| 亚洲色五月天| 人妻中文在线| 超碰99热精品| 婷婷五月丁香在线视频| 五月婷成人网| 丁香久久在线| 丁香五月天激情综合| 久久精品99久久久久久| 人妻精品一区二区三区| 五月婷色激情五月| 九九视频精品在线免费| 99国产小视频免费观看| 综合久| 五月丁香综合| 亚洲操逼网| 99视频九九热| 伊人www22综合色| 婷婷色五月天色| 91九色在线观看免费| 综合久久综合五月天婷婷| 99热这里是精品| www.五月天婷婷| 九九aV| 五月激情婷婷在线| 九九热在线观看视频| 色情五月丁香| 激情五月天在线视频| 五月激情久久综合网| 亚艹艹| 色噜噜狠狠色综合日日免费| www,婷婷五月天,com| 丁香婷婷色五月| 美女xx不卡| 99热这是里只有精品| 久久超级碰碰| 久久您您综合网| 色婷婷狠狠| 99精品在线观看视频| 成人做爰高潮A片免费视频| 色色色区| 婷婷五月天六月| 色五月激情五月开心五月| 五月天基地| 日本噜噜色网| 五月激情综合网| 色吧五月婷婷| www.开心激情| 亚洲亚洲人成综合网络| 伊人激情网| 综合久久五月| 五月丁香综合激情| 97人人做| 中文av网| 中文AⅤ大全| 久久er+| 五月天综合视频| 亚洲AV中文在线| 深爱激清网| 久久成人亚洲欧美电影| 天天日,天天射,天天插| 国产激情久久| 色色色婷婷五月天| 99精品亚洲| 人妻Av在线| 九九精品在线网| 伊人AV五月婷| 狠狠色噜噜狠| 狠狠狠激情网| 久久婷婷色| 蜜臀丁香黄色婷婷五月天| 99无码| 色在线99| 六月婷婷视频| 久久99免费视屏| 深情五月天| 日日操夜夜操中国无码| 亚洲狠狠婷婷综合久久久| 激情五月天综合网| 99亚洲综合| 欧美日韩一区二区三区四区| www.精品99| 久久久久9| 久久久久亚洲AV无码网影音先锋| 精品人妻在线| 91九色熟女| 少妇大叫太大太粗太爽了A片| 日本99在线视频| 色综合久久88色综合天天看| 男女免费视频999| 婷婷五月色天| 超碰99在线观看| 日本91在线| 久久多色| 久操大香蕉| 综合激情五月天| www.久久久.com| 怡红院视频| 超碰久热| 91狠狠色丁香婷婷综合久久| 天天草天天爱| 成人精品视频99在线观看免费| 国产精品五月丁香| AV在线不卡播放| 色色色色av777| www.夜夜爱.com| 五月久视频| 色色色色色五月| 区美毛片子| 国产激情久久| 丁香六月啪| 先锋资源 996| 中文字幕av久久爽| 色五月女| 99热这里有精品首页10| 91热99| 天天综合网、天天综合色| 五月婷婷激情| 伍月婷丁香花全集| 神马久久五月天| 欧美超级视频97| 欧美婷婷六月丁香综合色| 婷婷丁香五月综合| 婷婷激情丁五月| 1024亚洲| 久久婷婷综合网| 婷婷丁香五| 婷婷激情97| 日本久久人| 丁香六月色婷婷欧美| 综合久久五| 久re热视频| 四色综合网| 91色综合久久| 亚洲婷婷丁香| 99re99热| 99热99精品在线观看| 991精品在线视频| 国产成人精品123区免费视频| 色婷综合| 毛片新网地| 日本欧美成人片AAAA| 天天舔夜夜操www com| 亚洲天天操| 原琪琪色影院| 久9久9久9久9久9久9| www久久久久久久| 天天爱天天操| 亚洲1区| 日韩在线视频9色| 激情床戏| 婷婷五月大香蕉| 五月综合视频| www,26uuu,c0m,色情| 7月婷婷六月丁香| 变天就操逼婷婷五月| 五月婷在线| 丁香六月久久|