99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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
返回資訊列表
99热这里只有精品69| 亚洲五月婷天天操| 日韩丁香涩| 色色色综合色| 婷婷五月天,影院| 激情五月天色色色| 丰满少妇猛烈A片免费看观看| 亭亭五月色男人| 殴美日比视频| 青青草轻轻操| 无码色综合| 网站免费一站二站| 91九色在线| 五月丁香婷婷婷婷综合网| 狠干综合| 超碰永久在线| 综合色七七| 色五月丁香五月| 久久久区区一久久久久久| 另类亚洲视频| 成人电影在线免费试看| 26uuu丁香婷婷五月| 精品亚洲国产成AV人片传媒| www.99热国产| 超碰日韩成人| 久久国产一区二区三区| 国产小精品| 五月丁香色综合| 婷婷成人小说综合| 中文字幕色色| 亚洲色婷婷五月天| 久久婷婷内射| 超碰激情网| 五月人妻婷婷视频| 五月婷婷六月丁香玖玖玫瑰91| 天天干天天日日| 99九九精品视频| 91九色无码内射| 国产在线aaa片一区二区99| 超碰av在线| 五月丁香激情综合网| 五月情综合| 五月丁香久人妻中文| 热五月婷婷| 婷婷久久天堂网| 影音先锋AV资源男人站| 亚洲蜜乳AV| 九九成年视频| 91婷婷色| 色色影院aaaav| 99久久婷婷国产综合精品草原| 99超级碰碰| 六月丁香天堂| 丁香六月激情综合| 人妻系列久久久久久久久久久| 色婷婷影院| 99re在线视频| 婷婷综合另类小说| 婷婷五月天激情综合网| 爱婷婷都市激情| 婷婷丁香小说| 婷婷啪啪| 91re色综合视频| 国产精品A片在线| 91 久热| 久久91久久精品久久| 五月婷狠狠| 亚洲岛国电影| 99热亚洲精品| 插插插色综合网| 丁香六月色情| 色偷偷五月天| 丁香五月激情婷婷| 成人在线免费网址| 丁香五月天色综合| 亚洲最大激情无码| 99热官网| 麻豆精品| 久1色色| 97五月天婷婷| 人人播| 嫩草AV久久伊人妇女超级A| 99国产精品久久久久久久久久久| 欧美久久网| 婷婷五月天激情网| 深爱激情网五月天| 亚洲色婷婷| 国色天香成人网| 亚洲AV日韩AV永久无码网站| 人人干人人干骚美女| 99热日本| 思思热视频在线观看| 97久久久久久久久久久| 99久久婷婷国产综合| 色月视频| 天天日夜夜爽| 亚洲在线综合| 人妻久久人妻久久第一区| 婷婷五月天色| 超碰人人99| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 激情五月婷婷综合色播小说| 激情小说在线视频| 色婷婷a v| 五月激情精品视频| 久久伊人大香蕉| 91九色PORNY大屁股| 9有码中文| 亚洲男人的天堂婷婷色五月| 玖玖婷婷五月天| 欧美三级大片AA在线看| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 婷婷日在线观看| 丁香五月天的网址。| 狠狠色综合网| 91久久久久久久久| www.91操| 大香蕉啪啪| 天天五月情| 天天日天天舔| 五月天伊人av| 五月丁香影视| 99热国产这里只有| 99热精品在线播放| 亚洲小视频免费播放| 日本婷婷| 99九无网码| 天天干天天爽天天操| 久久激情网| 久久视频婷婷| 神马欧美精| 五月色情精品| 婷婷五月激情视频在线| 久热精彩视频98| 安息电影在线观看完整版| 亚洲五月丁香六月婷婷| 桃色激情五月天| 久久爱婷婷| 婷婷丁香九色| 色久五月天| 久久久久久久11111111111| 开心五月激情| 欧美成人精品A片免费一区99| 久久婷婷色情7777网站| 国产激情综合五月久久| 中文网AV| 色色色com| 岛国av网| 亚洲成人av在线观看| 五月丁综合在线观看| 少妇性按摩无码中文A片| 久久网站免费亚洲| 一本大道熟女人妻中文字幕在线| 五月开心婷婷| 2021日韩无码| 久久久WWW| 操逼视频一区| 91久热| 天天日夜夜高潮| 天天操夜夜操| 99这里是精品| 14色综合婷婷| 婷婷天堂站| 夜夜骑日日操| 97人人操com| 久久综合五月天| 狠狠综合区| 五月婷婷六月丁香在线视频免费在线观看| 9精品在线| 色五月成人| 91热99| 五月激情婷婷在线| 婷婷五月天天aV| 九九伦子片| 九九视频这里只有精品| 色婷婷影院| 99热在线观看| 99爱爱网| 天天插天天很| 人人操人人看97干| 色99色| 天天拍久久| 色综合99色| 丁香婷婷情色五月天| www.91九色| 99无码视频| site:wpjngj.com| 人妻无码视频网| 婷婷婷婷色| 丁香五月综合激情啪啪| 婷婷五月天综合亚洲| 色色日本| 色五月开心开心五月激情五月| 曰本aaaaaa丈片| www.久久久久久久| 日韩精品二三区| 国产99久久久| www.久久9| 日本三级黄色大片| 人妻久久久久久久久久久| 黄网在线观看免费| 婷婷色影音天| 亚洲久久激情| www.五月丁香| 99操逼| 欧美日韩99| 婷婷五月久久| 开心五月激情网| 天天色综合网1| 97碰碰视频在线观看免费| 国产精品VIDEOSSEX久久发布| 夜夜综合色| 色色日韩| 色色色色色热| 色婷婷AAA| 日本韩国视频在线观看社区免费的9| 综合啪啪| 99免费| 婷婷五月AA五月在线| 九九超日本| 久久精品99国产精品日本| 久热69| 欧美综合五月丁香五月天| 久久五月视频| 婷婷.com| 五月丁香 啪啪| 99日本精品视频热| 五月婷中文娱乐综合| 色色色99| 丁香色婷婷五月天| 91九色首页| 噜噜视频| 激情综合激情综合| 婷婷五月激情丁香| 婷婷在线播放| 欧美影院| 丁香五月AV| 天天插天天| 操笔无码| 五月婷婷色综图片| 天天 日综合| 欧美精品99久久久| 91婷婷| 丁香婷婷综合激情五月色| 丁香六月丁香婷婷激情| 丁香六月婷婷色XXXX| 无码99| 狠狠丁香| 婷婷婷婷色| 超碰成人电影| 久热只有精品| 国产日韩精品SUV| 日本婷婷五月天| 丁香五月婷婷超碰在线| 思思99热| 欧美韩国日本| 99re欧美精品| 五月婷婷色白丝| 日韩欧美性爱| 99热在线资源| 99er日韩| 国产一级婬片毛片| 丁香六月婷婷综合在线| 99爱在线视频| 能直接看的av网站| 一点色成人网| 久久婷婷大香蕉| 亚洲成AV人片在线观看| 99久久久久久久| 丁香五月最新网址| 久久这里精彩免费在线观看| 99热大片| 五月六月丁香激情| 久久99久久99精品免视看婷婷| 激情六月丁香| 91操操| 曰韩少妇内射免费播放| 激情五月婷婷色色| 99re在线观看| 久久这里只有国产精品视频| 99热6精品| 五月婷婷婷丁香播| 99热这里有精品| 七月丁香婷婷 色色| 91re色综合视频| 久热伊人在91| 成人羞羞啪啪 全 视频| 五月天色丁香| 操操碰| 国产99久| 精品五月丁香| www.国产色| 深夜男女福利刺激影院一区| 亚洲岛国电影| 色性综合| 怡红院视频| 热五月婷婷| 丁香五月天堂网| a性生活久久无| 亚洲啪啪网| a色色色色色| 这里只有免费的精品| 五月婷婷婷| 日韩欧美颜射| 五月丁香婷婷啪啪综合| 婷婷丁香五月噜噜噜| 丁香五月六月婷婷综合| av大片在线| 人人操人人干AV| 色青青五月| 久久激情天堂| 91seAV| 成人在线日韩| 美欧成人视频| 久久五月热| 五月丁香婷婷综合| 婷婷久久精品| 久久99久久99www| 这里只有精品免费在线视频| 五月天婷婷色| 色五月婷婷丁香凹凸| 婷婷综合网| 婷婷丁香五月高清| 亚洲av| 久久性爱视频| 99热日| 综合福利网| 97超碰人人操| 色玖玖综合网| 国产亚洲99久久| 五月色婷婷AV| 欧美丰满熟妇BBB久久久| 免费人人操| 久久婷婷五月丁香| 思思久久99热只有频精品66| 婷丁香久综合| 五月天激情小说| 四色五月视频| 久久精品性爱| 888久久久| 五月噜噜| www。五月,com| 色色丁香五月婷婷| 色135综合网| 99色综合网| 欧美精品99| 狠狠se| 六月合五月婷| 九九99在线| 2025年最新亚洲在线欧美| 色婷婷成人做爰A片免费看网站 | 六月丁香婷婷色69| 日韩欧美不卡| 婷婷婷婷色| 五月婷婷综合天天操| 五月婷婷成人网首页| 婷婷伊人綜合中文字幕小说| 五月色欧美| 欧美S码亚洲码精品M码| 六月婷婷私欲| 亚洲人成网站999综合| 丁香五月 六月婷婷首页| 91狠狠综合久久久| 亚洲狠狠操| 中文AV网站| 五月婷婷六月丁香在线视频| 香蕉乱插| 人人干人人看| www.五月天。com| 色一情一乱一伦一区二区三区| 夜夜骑日日操| 色综合9| 狠狠色噜噜色狠狠狠综合久久成人波| 99在线爽| 五月天激情四射| 五月丁香A片| 欧美精品999| 成人羞羞啪啪 全 视频| 亚洲精品另类| 色五月综合激情| 大香蕉伊人久久| 丁香五月六月| 五月婷婷丁香综合| 超碰人人艹| 五月丁香人妻| 99只有这里是精品| 97久操视频| 99久久久久| 丁香五月天激情婷婷丁香六月| 天天干天天拍| 五月丁香综合激情| 另类色视频| 思思久久99热只有频精品66| 色爱综合网| 天天爽在线视频| 免费视频在线观看的网站| 丁香五月冃欧美| 欧美天天搞| 久久性爱视频网站| 欧美α√| 色婷婷在线综合色播网| 日韩美女羞羞网站在线观看| 天天射影院| 天天激情| 日本在线视频手机播放五月婷| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 激情五月丁香五月综合| 九九99九九99九九99视频网| 伊人婷婷色激情丁香| 五月丁香综合成人社区| 97丨九色丨国产丨PORNY| 亚洲综合99| 96人人操人人操人人| 99ri6在线视频| 啪啪91| 九一99| 亚洲激情亚洲激情| 九色七七| 99视频在线看| 国产人妻777人伦精品HD| 精品99在线| 玖操97| 婷婷午夜精品久久久| 日本乱子人伦在线视频| 操99| 开心激情婷婷| 天天做天天摸| 夜夜操狠狠操天天操| 激情五月综合网最新| 天天色天天爽| 91九色小视频| 91人人妻人人操| 无码日本精品XXXXXXXXX | 女人天堂AV| 婷婷五月丁香六月天亚洲综合| 51成人| 91猫咪国产在线播放| 99热国产| 色婷婷av在线观看| 欧美99热| 91热在线| 99玖玖免费视频| 日日日日操| www.夜夜夜| 91色久| 色婷婷精品视频| 色欲色欲久久宗合网| 婷婷综合五月| 久热9| 天天色播| 六月激情婷婷| 五月天激情国产综合婷婷| 1024操逼视频| www.五月婷婷| 综合色五月| 五月天狠狠色| 色9999日韩国产| www.婷婷五月天| 天堂综合久久 | 99re思思精品在线观看| 丁香五月久久综合| 婷婷五月天激情综合深爱激情| 婷婷一本和五月丁香| 开心婷婷五月天电影院| 中文不卡一二三区| 人妻操在线看| 夜夜综合色| 这里只有精品视频在线看| 成人丁香婷婷五月天| 亚洲色欲AAAAAA| 五月婷婷插一插| 白天AV月月| 丁香五月在线视频黑人| 一级性爱视频| 久久婷婷激情| 性无码专区无码| 国产欧美日韩综合精品一区二区| 狠狠色 综合色区| 亞洲自怕| 视频一二区| ww久久| 国产伦理精品高清在线观看网站一区二区| 久久99热这里| www,99热| 丁香大香蕉| 综合色播| 97久久精品视频| 丁香五月综合久久| 五月花综合网| 99热这里只有精品最新地址获取| 中文字幕激情综合| 五月天婷婷成人网| 97人人妻人人艹| 五月丁香花激情啪啪网| 99九九热在线观看| caopeng97日韩| 五月综合六月婷婷| 九九热欧美| 开心五月婷婷激情| 久久婷婷大香蕉| 97色色色| www.sezonghe| 51XX午夜影福利| 免费无码毛片一区二区A片| 国产乱轮一区二区三区| 九九99免费理论| 6080av| 激情图片久久| 日逼影音先锋男人AV资源站| 九九九午夜视频| 九九99在线观看视频| 99热精品一| 五月综合丁香婷婷| 黄色片久久| 亚洲AV网站在线观看| 天天草婷婷五月| 天天干天天插| 久久九九激情五月天| 色婷婷综合综合网| 夜丁香五月婷婷| 日日干天天爽| 五月天婷婷色情| 激情婷婷丁香五月| 成人av在线电影| 六月婷婷色色网| 日韩色五月| 久久99久久99精品免视看婷婷| 五月激情网站| 极品五月天| 亚洲综合新99视频| 久久精品视频99| 182无码| 色五月激情问网站| 大香蕉久艹| 亚洲殴洲精品Av在线| 热久久99视频| 国内外色色色色色成人视频| 91色噜噜狠狠狠狠色综合| 四色女婷婷| 99热这里只有精品1| 94干大香蕉| 精品九九视频在线观看| 色五月首页| 伊人婷婷综合| 婷婷色五天| 亚洲无码性爱| 俺去啦综合网| 久久婷婷丁香花综合网| 五月丁香婷婷五月色| 九九热视频精品| 国产激情av| 五月丁香六月| 婷婷丁香成人五月天| 天天干天天爽天天操| 国产毛片欧美毛片久久久| 久久久五月天| 丁香五月伊人| 九九热这里有精品视频| 婷婷五月天激情网| 婷婷色五月激情| 一级黄色影片| bbwcuckold精品熟妇| 热久久99热欧美国产亚洲| 色色五月天丁香| 激情亚洲婷婷| 久热综合| 99久久9| 精品无码色| 天天色天天操天天射| 天天色综合天天| 在线综合网| 婷婷色婷婷| 欧美色五月| 亚洲sesesese| 伊人无码高清| 丁香五月av在线| 91碰免费视频| 激情综合激情综合| 色欲天天综合| 天天射影院| 欧美婷婷六月丁香综合色连续高潮抽搐| 99视频在线| 五月丁香六月婷婷,婷| 任你草| 天天综合永久| 国产1区2区| 91黄操| 大香蕉AV在线| 狠狠插.com| 这里只有精品免费| 五月天综合久久| www五月| 丁香五月婷婷欧美成人色图| 日本成人综合| 成人做爰A片免费看视频| 五月激情婷婷六月丁香| 第1影院之五月婷婷| 综合色五月| 天天做天天视天天谢| 精品一二三区久久AAA片| 天天干天天爽天天操| 激情婷| 婷婷五月天伊人网| 丁香六月婷婷综合啪啪| 伊人干综合| 免费视频WWW在线观看网站| 五月天狠狠干| 久久色婷婷| 无码少妇高潮喷水A片免费| www.久久av.com| 色综合婷婷| 婷婷在线五月综合| a在线观看| 森林影视大全,最好看的2019年视频| 国产av第一专区| 色欲丁香| 亚洲婷婷免费| 婷婷五月天在线观看av| 五月丁香色综合| 五月综合激情婷婷六月色窝| 亚洲色另类| 小视频在线亚洲| 性色综合网| 婷婷五月天久久久| 日本天堂免费99| 乱抡小BB| 91欧美| 婷婷日本色| 婷婷丁香五月综合| 在线天堂9| 久久 这里只有精品1| 玖玖爱综合网| 欧美日本99| 色婷婷激情| 日本婷久久| 亚洲小视频| 狠狠操之狠狠操| 丁香五月人妻| 免费AV在线网址| 日本女色人人| 丁香色婷婷| 色婷婷88| 久久丁香五月| 色综合久久88色综合天天| 丁香五月AV在线| 91丨九色丨丰满人妖| 婷婷综合在线网| 午夜少妇在线观看视频| 婷婷激情六月| 五月丁香天堂网| 亚洲va国产va天堂va综合va| 亚洲aV写真天天综合网久久 | 狠狠久综合| 激情丁香久久| 99九九综合久久九九| 精品无吗va视频免费观看| 婷婷丁香五月激情图片| 成人深爱丁香五月| 一起草无码视频| 久久色情| 120分钟婬片免费看| 97操碰在线视频| 超碰丁香五月| 婷婷五月丁香综合桃花色网| 色婷婷av综合网| 亚洲成人在线在线| 人妻熟女一区二区AV| 亚洲九区| 三男玩一女三A片| 天天插天天插| 成人无码精品1区2区3区免费看| 91久久久久久| 丰满少妇猛烈A片免费看观看| 五月丁香啪啪啪| 丁香五月偷拍| 精品亚洲国产成AV人片传媒| 国产精产国品一二三在观看| AAA级久久久精品| 丁香五月婷婷综合啪啪| 精品久9| WWW、99热| 婷婷色狠狠| 97干在线免费| 日本99在线| 激情五月天色网站| tingtingjiqingwuyue| 六月色婷婷欧美| 深爱丁香激情| 五月天激情小说欧美激情| 99久久这里只有精品| 欧洲亚洲午夜| 色色色色色网| 亚洲成人影视在线| 91九色无码内射| 激情AV在线| 色五月天影视| 婷婷开心激情综合五月天| 婷婷五月天激情丁香| 六月婷婷五月天| 99操逼视频| 日日干日日| 色婷婷丁香花五月天| 婷婷色色丁香| 九九久久五月天| 丁香婷婷人妻综合网| 热久视频| 99啪啪| 丁香五月大香蕉在线99| 九九九九九九毛片| 五月丁香激情综合啪| 国产日日操夜夜操的肉棒视频| 99热在线播放| 天天射影院| www.九月婷婷丁香.com | 亚洲五月激情| 情婷婷五月天在线| 夜夜骑天天操| 亚洲激情四射| www. 五月. com| 99,色| 五月天激情视频五月天| 五月丁香六月婷综合成人综合| 香蕉AV福利精品导航| 人人操婷婷| 99精品热| 夜夜操夜夜操| av亚洲国产小电影| 色婷| 婷婷六月五月| 色噜噜狠狠色综无码久久合欧美| 天天综合91入口| 五月天色婷婷av| 综合激情在线| 亚洲色区17| 91精品熟女| 91干视频| 色婷婷影音| 色五月丁香激情视频| 久艹大香蕉| 97五月婷| 99热成人精品| 99热精品在线播放| www.91在线看| 丁香婷婷激情网站| 最近中文字幕大全免费版在线 | 亚洲综人色综网| 996er热| 日本一级淫| 久久天天天| 中文字幕av在线播放| 九九精品大香蕉| 色亚洲视频| 婷婷五月天开心网| 日韩人妻无码精品| 亚洲精品永久久久久久| 久久婷婷老| 激情婷婷亚洲五月| 五月婷婷六月激情| 欧亚洲在线高清视频| 热99在线精品| 999精品久久久久久久| 婷婷之六月丁香| 成人片黄网站色大片免费毛片| 伊人婷婷五月天| 九九人人精品| 国产成人在线不卡AV| 999热这里只有精品| 96色婷婷| 97色色色色色| 色吧网综合| 天天插天天| 五月激香蕉网| 九九爱精品网站| 久久婷婷五月激情网站| 日本二级毛片二级毛片| 激情五月综亚网| 噼里啪啦在线观看免费完整版视频| 丁香五月天啪啪| 九九综合精品| 噜噜噜噜噜久| 五月激情视频| 激情婷婷综合| 办公室少妇激情呻吟A片在线观看| 久久五月天精品视频| 色色射| 美女五月天婷婷| 777精品久无码人妻蜜桃| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 五月丁香婷婷综合视频| 五月天婷婷綜合院| 91狠狠色丁香婷婷综合久久| 五月天日日操夜夜操 | 天天操天天日天天爱| 26uuu最新地址| .操區COm| 东京热五月婷婷| 九九视频这里有精品| 久久九九99.www| 成人免费在线电影| 五月色视频| www.色五月| 色色色免费视频| 激情图片99| 久久婷婷精品| 婷婷丁香久久五月综合| 五月天婷婷青青草| 久久538| 色综合激情| 五月婷婷综合激情| 丁香六月婷婷综合在线| 色婷婷久久综| 91狠狠综合久久| 色综合五月婷婷狠狠干| 六月丁香成人| 日日夜夜狠狠| 天天日天天做天天操| 538任你爽视频不一样的| 婷婷久久综合| 国产日日操夜夜操的肉棒视频| 伊人综合婷婷| 五月丁香六月激情综合| 天天干天天叉| 欧美六月| 丁香激情六月天婷婷| 正宗黄色毛片| 五月丁香| 欧美成人va| 欧美日韩大黄| 99人人干人人| 极品人妻VIDEOSSS人妻| 丁香激情五月天| 99精品视频在线免费观看| 婷婷五月丁香综合瑟瑟| 色五月激情五月开心五月| 婷婷瑟瑟五月天| 亚洲欧美成人在线| 曰韩五月丁香色婷婷无码| 婷婷99狠狠躁天天躁中| 丁香五月aV| 五月婷婷丁香啪啪| 亚洲熟妇AV乱码在线观看| 激情99| 可以直接看的AV网站| 九九九日本熟女| 超碰无码老师| 久久99久久99久久99人受| 99精品综合| 囯产精品一品二区三区| 91干| 婷婷六月综合基地| 欧美69久成人做爰视频| 超碰成人在线观看| www激情com| 丁香五月天人体| 99精品久久久久久久| 无码AV大香线蕉伊人| 色婷五月| 亚洲激情综合| 97碰碰视频| 永久AⅤ1| 天天开心AV色综合婷婷五月天| 九九AV| 久艹大香蕉| 国产色香蕉精品五夜婷| 666555。COm毛片| 久久婷婷五月综合| 色啪综合| 亚洲无线视频| 99色视频| 深爱激情五月网| 婷婷色爱| 五月婷婷久草在线视频综合| 五月婷婷网久久| 婷婷五月蜜桃成人桃色丁香| 99久久综合| 五月婷婷|欧美| 超碰在线播放免费观看| Caoub青青超碰 | 伊人丁香花综合影院| 玖玖资源站国产| 久久综合九九| 91超碰在线观看| 五月丁香啪啪综合| 97婷婷狠狠| 人妻激情综合| 日良久久| 色婷婷综合视频| 大香蕉伊人99| 亚洲五月婷| 中文字幕在线日亚洲9| 狠狠爱激情网| 婷婷久久综合久| 五月婷婷xxx| 99在线er热| 欧美va亚洲va| 丁香伊人激情| 五月婷丁香亚洲| 79色色免费| 久久久久久久久久人妻| 丁香五月激情无码视频| 婷婷五月天综合色| 久久免费婷婷视频| 丁香五月成人婷婷| www.99热在线| 亚洲色啪| 伊人五月天| 婷婷在线五月综合| Caoub青青超碰 | 九九操操| 亚洲 日韩色色| 天天cha成人综合网| 丁香婷婷六月在线资源观看| www天天色天天射| 大香蕉欧美在线| 久热九九| 午夜成人片400| 色色9 9| 久久久27操| 久草五月| 99精品久久久久久久婷婷久久 | 麻豆123区| 五月婷婷六月综合| 亚洲无码播放| 婷婷五月天网| 99久久久精品| 97人人超| 五月丁香婷婷中文网| 欧美成人色婷婷| www九九热| 极品人妻VIDEOSSS人妻| 岛国操B不卡在线| 超碰免费在线| 这里只有精品9| 午夜成人AV在线| 欧美大片| 免费成人网在线观看| 色色色色热热| 天天摸人人摸| 天天肏视频| 天天日中文| 亚洲丁香婷婷丁香五月天激情| 色色色国产| 国产,欧美,学生妹,视频| 9 1在线视频| 丁香五月AV在线| 色偷偷色婷婷| 婷婷99狠狠| 色婷婷色| 在线综合婷婷| 97干欧美| 任你爽在线视频| 色情五月丁香| 婷婷色成人| 色播播五月天| 性爱网六月丁香| 色五月aV| 婷久久| 日本波多野结衣视频| 人人爱操| www.激情五月| 淫五月停停| 丁香五月天激情网址| 99热这里只有精品66| 97精品人人A片免费看| 97极品在线| 久99热| 亚洲综合另类| 中文字幕视频在线播放| 六月丁香VA| 97色五月婷婷在线| 成人操呦av| 精品爆操| 亚洲视频在线网| 五月丁香婷婷久久| 激情五月天婷婷| www亚洲无码| 天天射综合网天天插| 亚洲热综合| 五月天丁香综合久久国产| av人人操| 男女啪啪做爰高潮无遮挡| 亚洲激情四射| 伊人玖玖婷婷| 永久热91| 逼里香不卡| 婷婷六月激情综合| 这里只有视频精品| 激情五月天丁香| 亚洲乱码在线观看| 国产va视频| 超级碰人人操人人干| 婷婷九月丁香久久| 中文字幕乱码亚洲精品一区| 婷婷欧美偷拍综合| 狠狠干婷婷| 日本在线视频播放91| 五月天婷婷久久视频| 第四色色色色色丁香五月天| 手机激情网| 久草热8精品视频在线观看| 九九精品视频免费在线| 亚洲中文字幕av| 99日在线视频| 九九aV| 综合激情五月丁香| 婷婷亚洲色| 日本九九九九| 久操大香蕉| 另类伊人婷婷| 91色色色| 久久婷婷五月综合| 玖玖热视频| 五月丁香婷婷网网网网| 九九热在线精品| 久久丁香婷婷五月天| 亚洲天堂色色| 国内婷婷丁香社区在线播放| 欧美精品XXXXBBBB| 久热这里只有精品99re,久热这里只有精品7| 八戒青柠影视剧在线观看| 丁香香五月激情免费视频| 啪啪一区| www.五月激情红色| 在线精品97| 久久人妻伦理| 啪啪夜久久| 91viP在线看| 天天舔天天插天天爱| 蜜桃人妻无码AV天堂三区| 五月天婷婷开心| 热久综合| 久热这里| 99操逼| 少妇出轨做爰高潮A片| 五月网网站| 91激情五月开心| 九九無妻| 99精品视频在线| 色停停影院五月天| www,色婷婷| 天天插天天插天天日| 婷婷五月在线影院| 66色在线日韩| 色五月婷色彩免播放器| AA片在线观看视频在线播放| 五月丁香激情婷婷综合| 中文字幕黄色电影网址| 国产免费AV网站| 九九热在视频| 天天射色五月天| 97色碰| 五月天激情综合10p| 成人在线网站| 夜夜干天天操| 精品色色色| 五月丁香激情四射| 日本欧美成人片AAAA| 九九热在线精品| 色丁香五月婷婷婷| 1024在线观看免费视频| 日韩成人网址| 久久久精品人妻录| 色色免费网站| 亚洲成人影视在线| 九九99九九99| 激情五月天网页| 色综合大香蕉| 五月天综合在线网| A片一曲| 五月天婷婷高清无码| 影音先锋色婷婷| 色婷婷香蕉在线| 婷婷丁香五月亚洲17cao| 天天日夜夜爽。| 天天日天天添| 五月丁香五月丁香五月丁香五月丁香91| 精品人妻伦一二三区久久| 天天婷婷色六月| 欧美激情 日韩无码 婷婷 五月天| 超碰永久在线| 亚洲日韩一页精品发布| 五月天丁香综合久久国产| 第六色在线| 色天堂在线| 大香蕉福利导航| 99免费在线视频| 色婷另类| 色丁香影院| 婷婷五月天视| 99九九99九九九视频精彩| 91碰免费视频| 成人综合网站| 人人爱操| 久久色亭亭五月天| av在线色五月丁香婷区久| 五月色婷婷亚洲 | 久久综合久色欧美综合狠狠 | 男人的天堂五月丁香| 黄色录像网点| 99热在线观看| 99久久9| 久热亚洲| 夜夜爱网站| 久热这里只有精品视频6| 久热久色| 影音先锋色婷婷| 99操免费视频| 丁香狠狠操| 丁香花狠狠婷婷亚洲中文字幕| 日本精品久久久久中文字幕| av中文在线| 久久婷婷五月天激情四射| 婷婷五月综合激情免费| 久久五月婷天天干| 亚洲综合色丁香五月天| 色婷婷狠狠干| 婷婷久久综合| 99久在线精品99re8热| 久久天堂网| 色色五月婷婷久久| 日韩精品一品二区三区的使用体验| 狠狠爱丁香婷| www91色网站| 综合AV网| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 久久久婷婷| 色欲久久综合| 丁香婷婷久久 | 狠狠干狠狠色| 日韩欧美一级大黄网站| 91男同| 九九碰九九爱97超碰| 亚洲区视频| 亚洲精品99| 久久永久网址| 欧美精品久久久久久视频观看| 丁香六月AV| 五月天无码视屏播放| 婷婷六月开心网| 99色热视频| 人妻操操色| 五月丁香黄色视频| 亚洲五月天激情| 久热 91| 欧美日韩99| 九九99精品| 嫩草AV久久伊人妇女超级A| 亚洲国产精品VA在线看黑人| 五婷婷综合网| 日本理论久久| 国产精典视频在线观看| 丁香五月天啪啪| 五月天婷婷自拍图片在线观看| 丁香五月深爱五月婷婷| 特级片神马电影| 色五月婷婷九月| 九九激情综合| 亚洲亚洲人成综合网络| 婷婷大香焦| 亚洲无码你懂的| 日本精品99| 涩涩涩,com| 伊人婷婷五月天av| 婷婷色婷婷| 99色在线视频| 国产XXXX搡XXXXX搡麻豆| av一区二区电影免费在线观看| 小色小蛇伊人婷婷色香五月| 久久xxxx| 五月丁六月香av| 五月天啪啪| 91综合国免费久入| 无码日本精品XXXXXXXXX| www99精品亚| 中美日韩成人在线| 色婷婷色久综| 99色在线视频| 久久久久婷婷| 成人国产网| 日韩成人AV在线| 五月丁香久久激情网| 六月天婷婷| 丁香五月激情网| 大香AV| va中文资源在线观看| 天天干天天色综合| 天天综合网在线| 婷婷热色| 五月丁香六月婷婷亚洲天堂网站| 狠狠色婷婷六月激情网| 99久在线精品| 婷婷五月丁香综合网| 五月开心啪啪| 丁香激情五月| 婷婷五月天激情偷拍| 久久机热/这里只有精品| 精品人妻伦一二三区久久| 婷婷六月偷拍| se99高清无码| www.五月天婷婷| 五月丁香六月| 激情久久久久久久久久久| 丁香五月天在线直播观看| 婷婷久久精品| 射婷婷中文字幕| 99色色爰| 色狠狠婷婷| 无码免费人妻A片AAA毛片西瓜| 色色色97| 永久AⅤ1| 婷婷丁香六月天| 在线资源av-超碰中文在线-成人AV| 99在线观看免费精品视频| 婷婷午夜综合| 国产性爱大片久久| 丁香五月婷婷五月天在线| 26uuu国产| www。五月,com| 99热成人精品| 丁香五月综合| 婷婷综合日本| 99热只有精| 八戒青柠影视剧在线观看| 日韩成人无码人妻| 五月开心激情| 热99视频精品在线| 这里只有精品日韩| 99九九在线精品热动漫| 五月天堂六月丁香亚州中文字幕久久| 思思热99er在线视频| 亚洲精品电影| 伊人9在线| 996日日爱| 7777国产盗摄农村女人| 亚洲色婷婷婷婷人人爽| 99re8在这里只有精品| 午夜爱爱网站| 五月天婷婷丁香| 91热在线观看视频| 影音先锋人妻出差| 97超碰免费超级在线观看| 综合五月天亚洲婷婷| 久久这里都是精品| 67194成I人在线观看线路1| 久久Xx| 91丨九色丨熟女丰满| 丁香婷婷六月男男| 欧亚中文A V| 亚洲亚洲永久无码777777| 99久操视频| 久久在线人妻| 久久五月天激情| 五六月丁香激情视频| 免费视频WWW在线观看网站| 九九99视频精品| 欧美在线视频99| 这里只有精品日韩精品| 婷婷色色网| 99 频99热国里只有精品| 99综合网| 五月天婷婷久色| 91妻人人爽人人看片| 五月丁香 啪啪啪| 九月丁香婷婷网| 五月丁香天堂网| 六月婷婷AV|