久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

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

圖表設計器核心實現(xiàn):數(shù)據(jù)建模、SVG渲染與交互全解析 diagram-design這個詞前端圈子里應該不陌生——你接手過一個流程編輯器、架構(gòu)可視化工具、邏輯編排平臺或者哪怕只是臨時給業(yè)務方搭一個拖拽畫布都會發(fā)現(xiàn)一個尷尬的事實圖表設計這事表面看就是畫幾個框、連幾條線但真正做起來數(shù)據(jù)建模、渲染方案、交互細節(jié)、性能優(yōu)化每一項都能折騰掉好幾個版本。這個項目名雖然短但它背后不是一個簡單的畫布Demo而是一整套結(jié)構(gòu)化圖形的可視化編輯基礎設施。這篇文章我就拿真實項目中做的圖表設計器來聊從需求拆解、技術(shù)選型到核心模塊的代碼實現(xiàn)和問題排查把能落地的經(jīng)驗一次講透。1. 項目到底要干什么拆解diagram-design的核心需求1.1 圖表設計器不只是畫布很多第一次接觸這類項目的人會理解偏以為圖表設計器就是個可拖拽的繪圖白板。實際不是。圖表設計器解決的核心命題是讓用戶用圖形化的方式編輯一份嚴格的結(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é)點、設置屬性、連接關(guān)系、導出結(jié)構(gòu)化配置他們才意識到自己需要的不是畫板而是一個可視化的圖編輯器。這個認知對齊非常關(guān)鍵直接決定了后面所有技術(shù)方向。1.2 核心功能清單與優(yōu)先級排序不同場景下的 diagram-design 需求差異很大做流程圖編輯器和做網(wǎng)絡拓撲可視化雖然都叫圖表設計器重點完全不同。結(jié)合通用情況我把核心功能按優(yōu)先級排一下優(yōu)先級功能模塊說明P0畫布基礎節(jié)點渲染、拖拽、縮放、平移這是地基沒有它一切都免談P0節(jié)點與連線創(chuàng)建/刪除節(jié)點設置連線起點終點支持連線樣式配置P0數(shù)據(jù)導入導出至少支持 JSON 序列化/反序列化保證圖數(shù)據(jù)可保存可恢復P1對齊輔助參考線、吸附、自動對齊批量操作效率全靠這個P1撤銷重做用戶操作錯了要能回退這是編輯器區(qū)別于畫板的核心標志P2布局算法自動排版功能比如樹形布局、分層布局復雜圖必備P2小地圖圖大了以后定位用的一般放到后期做這里多說一句優(yōu)先級順序直接影響架構(gòu)設計。如果上來就做布局算法、小地圖把架構(gòu)搞得特別重反而拖慢核心鏈路的推進。我見過不少團隊一上來就往畫布里塞多選、框選、自動布局、版本歷史結(jié)果拖到最后連基礎的節(jié)點拖拽都有 bug。正確的姿勢是先打通數(shù)據(jù)—渲染—編輯—導出這條主鏈路再往上面加輔助特性。2. 技術(shù)選型自研還是用現(xiàn)成庫怎么選才對2.1 自研 or 第三方庫沒有標準答案只要做圖表設計器第一個問題就是能不能直接用現(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 的重點是設計而不是展示這個定位想清楚渲染方案自然就有答案了。2.3 數(shù)據(jù)模型一切交互的中樞圖表設計器的數(shù)據(jù)模型我建議遵循一個根節(jié)點 兩層結(jié)構(gòu)的設計思路Graph圖整個圖表設計器的根數(shù)據(jù)包含全局的版本號、縮放平移視口信息、節(jié)點列表、連線列表Node節(jié)點代表一個可編輯的元素。除了唯一 id 和 position / size 這些幾何信息還要有一個 data 字段用來存業(yè)務自定義數(shù)據(jù)Edge連線代表節(jié)點和節(jié)點之間的連接關(guān)系。關(guān)鍵是它必須記錄從哪個節(jié)點的哪個端口到哪個節(jié)點的哪個端口。數(shù)據(jù)模型設計得好不好直接決定后面回退、聯(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ù)庫表來設計每個字段職責單一后面會少掉大量重構(gòu)成本。3. 核心模塊實現(xiàn)要點從畫布到節(jié)點到連線3.1 畫布基礎坐標系與視圖變換畫布的第一個門檻是坐標系。屏幕上呈現(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;這個基礎卻極容易踩坑。我遇到過一個經(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 連線交互錨點、貝塞爾曲線與命中檢測連線的設計比節(jié)點復雜不少。一個完整的連線交互鏈路由三部分構(gòu)成錨點端口、連線路徑、命中檢測。錨點一般定義在節(jié)點邊緣或內(nèi)部的固定位置。連線不是從一個節(jié)點拉到一個節(jié)點就完事而是從一個錨點拉到另一個錨點。錨點模型允許同一個節(jié)點向外拉出多條線而且能區(qū)分這條線是從哪個方向出去的方便后面計算連線路徑。連線路徑的繪制我最常用的是貝塞爾曲線默認用三次貝塞爾曲線控制點根據(jù)錨點方向和目標位置自動計算。這么做的好處是曲線平滑美觀而且方向感強一眼能看出從哪出來、到哪進去。我給一個基于 SVG 的簡化示意// 假設 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)絡拓撲、關(guān)系圖。這個比較復雜一般要上力導向布局模擬物理彈性、斥力、引力讓節(jié)點自動散開。如果在后期必須做一個見效快的自動排版我建議從樹形布局和分層布局入手計算公式和效果可預期也好看力導向布局雖然炫但參數(shù)調(diào)起來很磨人投入產(chǎn)出比要好好掂量。4. 實操記錄搭建一個最小可用的圖表設計器4.1 項目骨架與依賴準備這一節(jié)我把當初做最小可用圖表設計器的實操過程完整走一遍。技術(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é)點拉一條線出來也是圖表設計器的標志性動作。實現(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é)在端點命中上。我當時設計了端點的熱區(qū)概念如果鼠標位置離某個節(jié)點的中心很近比如節(jié)點寬高的一半以內(nèi)就認為要連接到該節(jié)點否則是空白區(qū)域取消連線。沒有一個好的熱區(qū)規(guī)則用戶拉線的時候總是差一點接上體驗會非常挫敗。這個熱區(qū)規(guī)則的調(diào)優(yōu)沒有一個萬能參數(shù)但基本思路是一致的給用戶靠近即吸附的手感。4.5 導入導出讓圖數(shù)據(jù)能保存和恢復圖表設計器做得再好數(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)驗適用于大部分圖表設計器項目導出圖片前考慮 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 圖表一多就卡頓到底卡在哪圖表設計器最常見的性能問題是節(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 拖拽錯位坐標換算別踩坑拖拽錯位是圖表設計器里出現(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ù)據(jù)模型這個地基打扎實。我吃過的虧里十有八九是前期不重視數(shù)據(jù)模型后期返工補課。節(jié)點、邊、端口、視口這四類數(shù)據(jù)一開始分清楚職責邊界后面加功能都順。還有一個感受想分享做 diagram-design一定要多跟真實用戶一起操作幾輪。你真看用戶是怎么畫圖的會發(fā)現(xiàn)他們根本不關(guān)心技術(shù)選型只在乎拖得順不順、對齊準不準、連線好不好接、撤銷穩(wěn)不穩(wěn)。銷售說的用戶體驗就是這些看起來很不起眼的交互細節(jié)。把這些細節(jié)打磨好才是這個項目最值得投入的地方。如果你正要開始做類似的圖表設計器我的建議是先用最簡版本打通畫節(jié)點、拉連線、導出 JSON這條鏈路再回去填功能細節(jié)。別一上來就規(guī)劃宏偉藍圖先把一杯水倒?jié)M再考慮裝更大的壺。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
岛国小电影| 欧美精品另类人妖xxxx| 亚洲欧美色综合| 亚洲无码久久久久久久| 欧美综合天天| 外国91| 秋霞午夜视频一区二区| 蜜臀av在线播放一区二区三区| 久久久久97| 97资源站久久| 校园春色欧美| 国产青视频| 中文字幕av色| 欧美淫穴| 激情五月丁香五月| 强奸乱伦麻豆| 午夜操逼不卡| 不卡av免费在线网址| 亚洲人综合| 成人网欧美风情| 久久婷综合| 欧美人与性动交a美精品| 精品玖九九久| 欧美色图亚洲色,麻豆| 玖玖蜜臀资源网| 97内射偷拍| 色综合美国| 五月丁香六月婷| 丁香五月成人| 国产suv精品一区二区四| 色噜噜狠狠色综合日日| 大香蕉五月天| 婷婷在线精品| 人人爱操| 青青青国产| 日日爽夜夜爽| 麻豆天美国美国产| 色av中文字| 丁香五月婷婷啪啪| 欧美操逼一二三区| 97资源制服丝袜| 久久久精品日本一道| 婷婷在线视频| av婷婷色网| 啊嗯好大视频在线观看| 国产亚卅97| 一区| 97国产精品久久久久| 国产欧美后入| 91色花堂| 无码人妻精品一区二区中文| 夜夜操青青草| 日本3级一区二区免费| 色官网色综合| www…国产操逼| 日本欧美国内在线| 天美传媒国产原创中文字幕亚洲欧美另类 | 亚洲精品亚洲人成在线麻豆| 免费a在线播放v| 欧美黄色大香蕉一区二区| 欧美日韩操逼嗦吊| 夜夜爽妓女| 久久久久一本一区二区青青蜜月| 超碰综合色| 国产自啪精品视频网站黑丝| 欧美一区二区男人天堂| 亚洲色图日韩精品| 欧美午夜精品久久久久久3D| 亚洲涩涩| 蜜臀久久久99久久久久| 秋霞一级鲁丝片A片| 免费αV在线视频| 老熟妇一区二区三区…| 色婷婷五月天| 天天情欲宗合网| 桑老女人九区| 亚洲 小说 欧美 激情 另类| 无码免费精品高清| 日韩偷拍色图| 精品制服美女中文一区二区三区| 69视频入口| 国产一区二区三区精品观看啪| 亚洲天堂久久| 亚洲日韩XXX| 91肉丝| 国产强奸乱伦xd| 色婷婷综合网站| 国产白嫩精品久久| henhen91| 日韩av影片在线观看| A V少妇特黄三级| 欧美后入视频| 午夜毛片亚洲精品片国产久久久| 国内精品久久久久影院亚洲| 男人网站婷婷| 91欧洲国产成人久久精品网站| 国产成人精品必看| 台湾佬中文娱乐自偷自拍| 午夜AV污污污| 久久久久久精品免费看A级| 中文字幕五区| 日曰骚久久精品| 可以在线观看的黄色网址| 国产伦精品一区二区三区视频女| 色欲久久99精品久久| 国产福利视频精品视频| 超碰久久精品| 桃花色涩综合影院| 亚洲综合夜色| 日韩性爱播放| 91美女高潮| 日韩99精品视频综合区| 97天天操天天干| 极品销魂美女一区二区| 欧美成不卡网| 黄色AV免费| 欧美专区第一页| 国产精品久久久久9999小说| 韩国女主播青草福利视频| 亚洲天堂加勒比| 韩国黄色片精品久久久| 亚洲,欧美,综合网| 天天躁日日躁AAAXX| 日韩丨制服丨中文|在线| 欧美三级中文字幕hd| 欧美亚洲AN| 国产成人无码a| 精品人妻一区二区三区-国产精品| 最新亚洲黄色免费电影| 亚洲另类久操网| 青青草国产欧美非洲黑人| 久色网| 久久青娱乐| 婷婷深爱五月| 97资源亚洲| www.久久爱| 欧美色另类| 婷婷色导航| 超碰美女97| 久久精品免费| 婷婷深爱五月| 无码人妻1727| 亚洲视频一二区| 午夜AV人气不卡| 欧美丝袜美女电影一二三四区| 无码日韩人妻av一| 大香蕉草草| 夜夜操2028| 久96热在线观看视频| 亚洲欧洲精品成人| 成人免费福利网站国产| 中文久久久| 麻豆黄四叶草网站| 日本色色色视频| 97超碰精品图片| 蜜臀久久99精品久久久久久久久| 久久av无码| 国产精品白丝AV| 97资源制服丝袜| 人人爱人人乐人人操| 91日产欧美| 秋霞一级视频在线观看免费| 日本一道在线播放高清| 丝袜美女诱惑 91 视频| 亚洲人成色9999精品久久| 九九视频黄色片| 蜜臀在线网站| 久久超碰、| 91丨九色丨国产打屁股| 精品中文字幕一区二区| 久久久性| 亚洲天堂资源在线| 粉嫩久久久久| 欧美少妇性乱| 91 亚洲 欧洲| 亚洲最大的综合性av| 精品国产AV一区天美传媒| 久久鲁夜| 国产精品网站免费| 欧美成人9797| 欧美v亚洲v日韩v最新在线二区| 丁香婷婷五月| 久久伊人东京热| 美日韩一二三区| 欧美色图天堂网m| 国产日韩欧美三级片| 影音先锋少妇| 极品销魂美女一区二区| 上床啊啊啊| 亚洲 欧美 综合 91| 午夜福利在线视频1000| 久久亚洲骚逼综合| 激情五月综合网| 亚洲成a人在线观看久| 激情小说图片亚洲首页| 欧美综合网| 国产97在线播放| 操亚州| 久久欧洲| 亚洲色入欧美| 日本高清熟女久久一区| 97这里只精品| 欧亚第一综合网| 91美腿丝袜在线观看| 狠狠欧美| 麻豆天美电影一区二区| 亚洲另类久操网| 亚洲色图大香| 亚洲日本男人天堂网| 中文字幕啊啊啊在线观看视频| 九九热AV| 天天91~综合入口| 激情综合色| 色婷网| 国产激情片在线观看| 婷婷丁香五月激情啪啪| 99色在线| 在线观看十八禁| 青青草自拍视频在线播放| 亚洲欧美一区二区三区在钱蜜桃 | 97色97好| 国产风韵犹存熟妇三区| 久久久免费高清中文视频| 日韩天天综合| 9久精品| 精品久久久久久中文字幕视频免费| 丝袜综合网| 综合久久97| 精品无码久久久久久久久果冻糖心| 少妇一区二区三区| 麻豆视频国产一区二区| 91社操逼| 色色综合网站| 欧美少妇第一页| 五月天综合网| 97超色| 国产97视频| 精品人成视频在线观看| 黄片色区软件| 日本久久99| 日韩伦理视频| 天天综合91入口| 熟妇人妻丰满久久久久久久无码| 国产AV激情无码久久无码 | 丝袜综合| 九九超碰综合网| 91性网| 久久精品 六十路 熟女 欧美| 一级毛片久久久久久久女人18| 一本一道波多野毛片中文在线| 91人妻Pr| 国产污视频麻豆传媒一区二区| 97亚洲欧美日韩| 九九热精品视频六| 色翁荡息又大又硬又粗又爽| 久热无码| 97视频新免费| 亚洲精品自拍| 久久人妻视频网| 9久久美女首页| 嗯嗯不要 视频| 亚洲视频1区| 九九综合色| 国产精品久久久777| 校园春色美腿丝袜 | 国产精品白丝在线播放| 嫩草 人人网精品| 久艹免费| 国产美女mm131爽爽爽爽| 国语人妻精彩刺激| 国产97色在线 | 亚洲| 日韩免费高清大片在线| 校园春色综合| 精品人妻一区二区三区四区| 国模精品娜娜一二三区| 精品无码一区二区三区| 人人操肉肉| 看黑人AV不卡| 免费观看网黄| 九热大香蕉| 亚洲国产成人综合碰碰三级经典| 99啪啪视频| 天综合网欧美| 日本高清_区二区三区 | 性色AV蜜色av色欲av| 伊人婷婷五月天| 免费精品AB| 人妻系列无码专区中文有码| 天天内射| 日韩av乱伦| 国产99999久久精品| 九九视频黄色片| 岛国AV一区二区电影| 天天综合中文字幕 91| 综合色99| 国产精品视屏| 麻豆av一区二区三区| 欧美日韩资源| 人妻精品一区二区全免费| 天堂av2019| 正宗无毛一线天嫩逼| 欧美极品色| 色九九九九九九| a网站免费观看| 国产 v乱码一区二| 天天在线91| 高清国产av无码| 久九九九九九九九热| 日韩欧美午夜视频在线| 夜色97| 啪啪视频免费在线观看| sss视频华人在线| 黄色操人| 亚洲AV无码久久精品蜜桃小说| A级片日韩欧美国产欧美视频精选观看| 97超碰国产精品| 日韩无码视频黄色| 久久97视频| 久久手机好看网站| 亚洲天天做日日做天天谢日日| 青青草啪啪网| 人人射人人操人人摸| 91黄射| 久久男人的天堂国产| 国产成人久久久精品免费AV| 欧洲精品二区| 色女综合| 婷婷五月在线视频| 性暴力欧美猛交在线直播| 国产乱青青草久久| 五月婷婷激情综合| 青椒国产97在线熟女| 啊啊啊 在线| 人妻精品4K4K4K4K4| 在线免费观看日韩一区| 97极品无码| 久久久久9999精品九九九| 久久五月视频| 被男人吃奶很爽的毛片| 大香交| 欧洲中文字幕| 大香蕉啪啪网| 日本免费一级AAA大片器| 青草精品视频一日本久久久久网站| 亚洲日本男人天堂网| 天天视频黄网站| 九九九九九九视频免费| 欧美黑人168页欧美黑人167| 精品九九九九九九九| 色色五月天婷婷| 一本久道在线综合视频| 秋霞色色影院| 麻豆一区二区AV天美| 久婷婷一区| 色婷婷丁香五月| 蜜桃视频成a人v在线| 熟女人妻精品一区二区视频| 女人18精品一区二区三区| 精产国品一区二三产品| 欧洲无码一区二区| 人人爱操| 天天看,天天做| 偷拍亚洲熟女视频播放| 极品销魂美女一区二区| 国产91 丝袜在线播放00-百度| 久久人爽| 国产性爱在线视频一区二区| 国产91影院| 久久香蕉国产线看观看亚洲女人 | 在线观看一卡二卡| 久久99精品视频| 久久毛卡| 中文字幕亚洲永久精品| 日韩av免费一级电影| 男人天堂2017| 久久内射| 校园春色综合网| 综合第一页| 欧美日韩色| 91美女视频直播| 欧美精品,四区。五区| 96久久久精品| 国产免费一区| 一区二区三区一亚洲中文字幕、综合区灬| 亚洲s色图| 九九九久| 国产99999| 大象AV在线| 99无码狠狠久久| 日本东京热久久久电影| 狠狠中文字幕| 欧美劲爆视频一区二区| 97人人超| 久久综合18p| 日韩天堂av电影在线观看| 欧洲Au麻豆| 老熟女区| 涩涩久久精品| 日本不卡免费二区| 中文字幕在线观| 性色AV蜜色av色欲av| 免费的黄片有限公司| 亚洲色色探花| 超碰人人在线| 中文伊人大香蕉视频| 黄色大片一区二区密桃丝袜| 97国产天堂岛| 97欧美色| 亚洲成人激情小说视频| 日本激情免费大片| 狠狠综合| 91中文精品日韩欧美在线 | 久久久久人妻二区精品叶可怜| 欧美日韩另类在线| 黄片不用下载在线观看| 国产亚洲 中文欧美久久| 色爱综合网欧美| 久9综合在线| 色欧美综合| 欧美日本中字另类在线| 麻豆人妻精品一区二区| 天天插夜夜爽| 久久一区二区三区四区五区| 久久一区二区高清免费| 超碰资源亚洲97| 美女干逼2| 国产成人五月天丁香花| 国模不卡| 天天操天天射青青草| 囯产精品强| 久久大黄片| 精品国产乱码久久久久久口爆网站| www.99热| 蜜臀一二三区| 国产黄色小视频网站| 9999免费精彩视频| 东京热精品97综合网| 9丨久久九九九| 欧美大香蕉专区网| 97天天操天天干| 99热在线播放| 91超碰人人操| 一区二三区四区视频大全套| 亚洲av噜噜噜噜噜噜| 无遮挡h肉动漫在线观看| 综合久欧洲| 亚洲97| 五月香婷婷| 久久久91福利姬| 国产欧美日本亚洲精品| 中文字幕二区日韩天堂| 91丝袜人妻| 免费观看的黄色的网站| 成人热久久精品| 一区在线精品中文字幕| 婷婷五月天激情四射| 亚欧美色图| av在线不卡一区二区三区| 天天综合有色网| 九九九热| 97精品国产97久久久| 中文字幕一区二区三区四五区| 18禁精品网站在线看| 欧美视频第二页| av毛片aaaaa免费看| 欧美精品在线观看| 国产无码久久高清| 亚洲熟女乱色| 国产精品黑人一区二区三区| 91天天综合网,天天综合网| 国产在线视频午夜精华在| 又黄又爽在线观看视频| 亚洲天天操| 高凊专区人人操| 我要去看2个日本美女.com曹逼| 激情综合网激情五月天| 国产精品香蕉| 东京热av男人的天堂| 自怕偷自怕亚洲精品| 久干网| 欧美日韩性爱操大逼| 熟女一区二区三区四区| 中文字幕 码 自拍 视频 区| 欧美超碰97| 国产嫩草精品A88AV在线| 欧美一级美片在线观看免费| 精品人妻一区春色| 国产67194| 一起草高清无码| 天天弄欧美| 26uuu性物| av草草在线电影| 99视频内射三四| 91香蕉国产尤物视频| 欧美一二三区四五区| 丰满人妻无码一区二区三区| 免费男人的天堂| 爱爱动态120秒| 九九精品99| 深夜激情| 美女裸体麻豆天美蜜桃91| www.久久最新地址| 嗯嗯啊啊操我| 97超碰精品成| A V少妇特黄三级| 国产色综合亚洲色综合吹潮| 国产精品白丝AV| 青青草原狼av| 亚洲 欧美日韩 另类| 校园春色五月天| 蜜臀色乳| 亚洲91少妇| 伦伦成年午夜免费视频| 97在线免费视频观看| 蜜臀久久99精品| 色婷婷激情| 又粗又长又爽在线观看| 大香蕉伊人75| 果冻传媒A片一二三区| 偷拍欧美激情| 国产成人+综合亚洲+天堂| 91视频伊人| 青青在线视频免费| 91久久久久久久| 久jiu久神马影院| 国产 无码 一区二区| 激情婷婷综合久久| 亚洲熟妇A V黑人| 91精品又粗又猛又爽| 日韩情色视频| 99成人| 偷看洗澡一二三区美女| 国产高清26uuu| 12一15性XXXX粉嫩国产| 日韩一级二级三级| 88在线一区二区三区| 少妇人妻无码| 欧美内射少妇| 女人天堂AV五区在线| 国产农村一一级特黄毛片| 国产高清免费不卡av| 中日韩一区二区三区欧美| 凌辱美少妇久久aV| 亚洲中文字幕一区二区| 国产一区二区精品在线视频| 亚码人妻| 骚人妻少妇视频| 日本欧美色| 欧美色图片91| 99re这里只有精品3| 一区二区三区精品黑丝白丝酒店对鸡 | 老熟妇一区二区三区| 天天天天做夜夜夜夜做| 欧亚久久偷拍视频| 国产又大又粗又长视频在线| 中文字幕制服欧美久久一区| 日韩伦理视频| 国产极品久久久| 97天天操天天干| 美女91在线观看| 97天天综合网| 福利天堂| 俞拍自拍| 少妇大屁屁| 日韩欧美女求操每天更新| 2017,超碰| 九九九九精| yiqicaoav| 久久久久亚洲三级电影| 综合五月婷婷亚洲一区| 一区三区啪啪| 性吧在线视频| 桃色六月天| 91N综合在线| 中文字幕精品亚洲熟女| 中文字幕丝袜| 婷婷色色五月天福利| 国产传媒午夜理伦精品| 91操人| 999久久久精品国产| 久久色一区| 日韩午夜国产| 四虎影视国产精品| 999久久久| 国产亚洲精品美女久久久| 亚洲国产精品成人无码久久久 | 色综合20p| 夜夜久久久| 亚洲成人激情小说视频| 欧美人与性动交a美精品| 色色婷| 精品十三区| 久久久9 9 9精品| 欧洲精品一级二级精品综合视频综合| 国产精品高清2021在线| 91在线无码精品秘 软件| 18精品一区| 亚洲青青草| 亚洲情色综合| 中国一区二区亚洲人妻| 欧美老熟另类| 91色人| 国内毛片热久久思思热| 强免费黄色网址| 青青草黑寡妇男人天堂| 99re久久| 乱伦日本色图AⅤ| 嗯嗯,啊啊,国产精品| 亚洲青青草| 日本性爱视频一级| 色婷婷五月天| 夜夜免费视频| 无遮挡一级毛片视频免费的| 亚洲欧美激情另类色图| 久久久96精品| 亚洲AV无码翔田千里网站| 超碰97起碰| 国产丝袜一区二区三区| 天天看天天在线精品| 91女神在线视频| julia国产在线| 约操熟妇| 欧美综合在线91| 激情综合网激情综合| 伊人久久婷婷| 懂色av中文字幕| 岛国免费黄色网址| 情色五月天久久久| 家庭乱伦麻豆| 久久国产精品91| 亚洲欧美清纯| 99色热| 欧美色图99| 日逼国产| 另类专区加勒比| 精品九九国产无码| www.高清无码诱惑一区.com | 日韩99精品视频综合区| 日韩AV一区二区三区三州三州| 亚洲色电影在线| 久久 国产精品 一区| 丝袜视频网国产90| 久久久麻豆精品| 中文字幕一区二区三区蜜桃视频| 国产91啪| 曰韩少妇无码| 久久一级无码精品毛片6| 欧美性综合| 国产亚洲精品玖玖玖在线观看| 爱妻综合网| 日韩A优精品在线观看| 亚洲国内精品成人不卡| 中文字幕91页| 98精品国产乱码久久久久久| 国产v亚洲v日韩v欧美v片另类| 九月婷婷| 9久在线视频只有精品| 欧美超碰96| 99re国产精品视频| 久久久久幕乱码| 婷婷色在线| 97爱爱爱| 无码久| 欧美成人黄网色网站| 97中文字幕一区| 久久久A∨| 亚洲熟伦熟妇AV无码春色| 日本啊啊啊啊啊视频| 精品亚洲国产成人精品| 国产尤物在线三区| 久99久视频精选| 999精品国产高清一区二区| 制服中出中文人人精品| 丁香五月天激情| 青娱乐淫乱1314| 久久人妻无码毛片A片麻豆| 日本精品一区二区中文字幕| 国产91 丝袜在线播放00-百度| 91最新综合| 日韩欧美午夜视频在线| 日本大香蕉综合网红本杳社区| 日韩 人妻 精品| 欧美日韩性爱无码| 国产乱子伦一区二区三区在线观看| 日韩人妻网站| 无码人妻精品一区二区三区九九| 一区三区啪啪| 女性喷水高潮在线观看| 九九九九九九九| 老色69| 亚洲午夜福利在线影院| 神马久久久久久| 97超碰精品成| 色精品极品| 蜜乳性色无码专日粉嫩骚逼AV| 亚洲成人贴图| 久久久久人| 国产av青草| 曰韩无码777| 精品国产91内射久久| 少妇天堂| 亚洲女人毛茸茸91| 欧亚第一综合网| 丰满人妻一区二区三区| 国产女人操逼视频| 免费成人在线观看91| 久久久性爱| 亚洲一二三四区在线免费看视频| 欧美色图亚州激情| 婷婷六月天| 黑人精品成人一区二区三区| 在线看的av| 中文字幕国产在线天堂| 国产搭汕a级片| 男人的天堂久久狠| 97视频在线观看高清资源| 国模一区二区三区| 人妻av在线| 91三级理论片播放器| 国内精品久久人妻性色av| 美女网站91| 一区超碰一区| 欧美传媒一区| baiduhicn.com。| 动漫片子网站3黄| 天天操狠狠日夜夜干超碰撸com视频在线观看 | A级毛片在线看免费| 99久久99久久免费精品蜜臀| 特污精品女优骚货黄色视频在线免费观看| 天天天堂影视日韩亚洲91| 亚码人妻| 亚洲日韩乱码中文无码蜜桃臀网站 | 日韩三级在线观看mp4| 在线人妻熟女一区二区三区四区五区| 欧美|91色综合| 麻豆人妻精品一区二区| 五月婷婷六月激情| 热久久这里只有精品| 日韩精品人妻中文字幕不卡乱码| 国产女主播视频在线观看| 内射卯月麻衣| 呻吟 欧美 日本 中出| 97操综合| 97国产|免费| 人人操人人摸超碰| 国产精品操| 欧美亚洲情色| 性无码专区2020| 91成人高清在线观看| 欧美伊人久久综合网| 久久东京伊人一本到鬼色| 色狠狠 - 百度| 亚欧无码在线| 精品超碰国产| 久7色| 在线视频一区二区传媒| 久久亚洲熟妇在线视频| 美熟女逼导航AV操逼| 视频在线97| 91性网| 中文?日韩?免费?精品| 免费一级性爱久久| 5278欧美一区二区三区| 97电影院超碰| 欧美亚洲20p| 97免费视频在线观看视频| 后入式福利| 老熟女91| 久久国内| 欧美日韩夜夜| 男人精品天堂一区| 精品一区二区三区蜜桃| 国内毛片欧美香蕉精品| av网页一区二区三区| 婷婷色播婷婷| 国产传媒美日韩av| 亚洲色棕合| 久热一区二区| 黑人操一区二区| 九九这里只有精品| 日韩午夜国产| 超碰97国产欧美| 另类小说综合网| 麻豆国产免费影片| 97色欧州| 日本大香蕉综合网红本杳社区| 激情小说日韩无码| 日韩免费性爱视频在线观看| 91丝袜美女| 男人精品天堂一区| 唯美清纯 妖精视频| 三级色综合| 一色网男人的天堂| 欧美色图在线视频少妇| 亚洲综合第一页| 91成人在线免费视频| 超碰 另类 欧美| 日韩无码第3页| 成人性爱av| 亚洲 图片 综合91| 97超碰影音| 欧美偷拍区| 中文字幕在线播放2中文字幕在线观看2| 超碰综合色| 亚洲欧美综合| 色五月综合| 激情久久日韩精品中文字幕麻豆| 思思热在线视频免费| 天天爽天天操| 久久中文字幕女同性恋一区| 国产精品永久免费10000| 亚洲国产成人精品999| 天天看天天在线精品| 亚洲伊人久久精品狠狠在线| 澳门黄片一香蕉视频| 男人的天堂日本东京热| 手机在线视频国内精品| 9 9精品一区二区三区| 国产小黄片在线免费观看| 日本三级小说中文字幕| 91精品人妻一区二区三区蜜桃| 吉川爱美亚洲二区在线| 97视频在线看| 天天日天天爽| 国产91丝袜 在线播放| 午夜福利在线合集| 亚洲性猛交| 日韩高清黄片| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 91真人天天在线| 久久精品国产精品一区| 不卡超碰护士AV在线免费播放| 97碰碰色| 日本福利社| 97国产|免费| 日本99热| 99中文字幕| 精品少妇一区二区三区免费观看| 超碰碰97资源站| 日本 欧美 亚中文字幕| 好爽视频在线观看视频 | 日日夜夜青青草母狗| 亚洲av综合伊人久久| 色噜噜人妻丝袜AV资源| 日韩三A大片在线观看| 999 久久久| 亚洲欧美国产成人综合不卡| 后入福利| 天堂岛av| yaouchengrenav| 上床不卡网站| 人人摸人人干人人拍97| 五月天日日操夜夜操| 97碰在线视频| 黑人综合网| 亚洲色性情三级| 国产精品制服丝袜清纯唯美| 91中出在线| 丝袜六区| 亚洲一区二区三区不卡国产欧美| 国产男女无套97| 最新三级网址| 96一区二区三区| 超碰超碰95| 免费无码国产精品v片在线观看| 青草园大香蕉| 99热在线观看| 亚洲乱色熟女一区| 精品一区99999| 另类综合另类| 日韩久久.一级黄色片| 人妻激情视频| 日韩精品三区四区| 伊人五月天激情| 伊人操| 少妇内射www在线观看视频| 色色色色综合网| 桃花色综合影院| 亚洲AV永久无码精品成人调教| 久久免费中文字幕在线观看| 黄色一区二区秘书性感| 天天狂操夜夜狂日| av麻豆啪啪| 五月丁香久久| 国产区91柔拿会所技师| 清纯唯美亚洲综合| 精品久久久久久中文| 蜜臀99久久国产| 欧美色图成人网一区二区| 欧美激情综合| 啪啪AV导航| 亚洲色图欧美一区二区不卡| 粉嫩av一区二区三区四季| 欧美少妇熟女| 日本日皮视频逼| 日韩精品一区二区高清| 亚洲丝袜在线观看| 蜜桃一区二区三区| 91人妻丝袜无码| 337p大胆噜噜噜噜噜91Av| 三级AV入口| 男人的午夜天堂| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 欧洲人妻视频| 亚洲区限制级 99| 一区 欧美 日韩 麻豆| 色播五月丁香| 中文字幕性感少妇av| 精品中文字幕一区二区| 亚洲无码精品AV久久久| 欧美日韩亚洲天堂| 国产精品午夜精品| 99黄页网站| 欧美一二在线| 久久精品免费| 97超碰国产精品| 婷婷五月天成人| 欧美成人黄网色网站| 欧美日韩国产三级黄色| 欧美一级美片在线观看免费| 大香蕉一级黄色片久久| 色臀AV| 亚洲天堂另类| 丝袜视频网国产90| 九九九草| 亚州高清av| 亚洲综合情色| 免费超碰97久久| 青青草玖玖爱| 九九九精品一区二区无码| 亚洲涩涩| 日本超碰色精品| 欧美78| 岛国999| 97久久国产亚洲精品超碰热| 青青操视频在线| 中文字幕伊人| 97视频在线观看网站| 九九九九免费视频| 欧美在线第五页| 91热色| 一二三区视频在线观看| 最新制服中文第一页| 亚洲无码一区成人免费午夜| 变态综合色| 精品视频一二三中文| 日本不卡一区| 精品高清av中文字幕| 日本熟女免费視颖| 欧美日韩国产高清在线一二三区| 人人摸人人添人人操 | 91久久国产综合久久| 久久久久国产亚洲一区欧美色图日韩| 日韩女优在线| 九九九九九九成人| 99热日| 992大香蕉| 久久久亚洲熟妇熟女| 91 国产丝袜在线放观看| 91青视频| 无码久| 丰满欧美放荡少妇在线| 啊啊啊久久| 国产精品久久久久久高清无码免费看| 国产 日韩 欧美高清| 久久艹逼视频| 欧美专区第一页| 91久久久老司机| 亚洲精品国产拍免费91在线| 中文字幕丰满子伦无码专区在线视频最新| 国产精品第一区第一页| 日韩人妻 中文字幕| 国产激情综合五月久久| 日本天堂网| 亚洲AV在线资源| 九九热三级片| 人人 操人人 操人人| 99综合视频一体| 欧美色图成人网一区二区| 亚洲激情欧美色图 | 精品国产污一区二区三区| 噜噜噜久久亚洲精品色情| 色噜噜人妻av中文字幕| 久久国产在线一区二区| www成人啪啪18秘 免费| 日韩熟女精品无码专区一区二区| 五月天欧美色图| 欧美天天综合网| 中文字幕aⅴ在线视频| 你操综合| 久射吧| 国产乱伦亚洲| 日本高清电影欧美色图| 啊啊啊啊啊啊啊在线| 大肥女高潮bbwbbwhd视频| 日本精品不卡一二三区| av大香蕉网站| 免费在线视频97| 久久激情亚洲精品无码?V| 中文一区二区婷婷视频| 四虎精品亚洲| 亚洲国产尤物yw在线观看| 无码91| 人妻少妇精品久久久久久| 久久精品毛片免费不卡| 欧美有码亚洲中文字幕一区二区三区四区| 色综九九九一区| 国产精品久久久久久无码红治院| 啊啊啊啊啊啊在线看| 精品一区二区三区18| 国产97视频免费观看| 性性久久| 欧美真人抽搐一进一出gif| 激情五月天婷婷| 乱操9999| 亚洲日韩美女中文字幕乱| 99精品网站| 国产粉嫩蜜臀av一区二区三区| 激情丁香五月| 小电影欧美91| 久久久精品无码亚免费| 东京热熟女亚洲视频网站| 国产福利一区二| 青娱乐av在线| 好爽视频在线观看视频 | 大香蕉色十月| 欧美亚洲今日在线| 99视频内射三四| 久久久久久无码人妻中文字幕| 高清成年美女黄网站免费大全| 啊啊啊啊二区好大| 翔田千里Av在线| 青青草吊丝| 黄片视频观看| 黑丝91视频| 亚洲国产成人精品久久久国产成人一区二区| 五月天激情小说| 78久久| 北条麻妃99精品青青久久| 蜜臀久久99精品久久久久久-DVD原版全| 开心激情婷婷| 欧美日韩久久精品爱爱| 色色色综合网| 亚洲熟女综合一区二区| 国产av尤物| 大香蕉中文| 亚洲情色一区综合| 日韩无码操逼片| 超碰天天操你比| 日韩国产乱子伦App| 美女爽爽爽刺痛洞洞| 日韩免费性爱视频在线观看| 国产激情在线| 性综合网| 色婷婷在线视频精品导航| 国产成人拍国产亚洲精品| 91国产美女丝袜足交精品视频 | 青春草A| 夜色AV无码手机在线影院| 91在线一起| 精品少妇一区二区三区免费观看| 欧美日韩在线视频网站| 天天天天天超碰| 亚洲精品日韩国产欧美| 亚洲精品97久久| 99热aaa| 亚洲第一无码播放立川理惠| 一区二区三区麻豆| 精品久久久久黄少妇| 中文字幕中文字幕一区二区| 自拍啪啪视频| 人人操天天爽| 久久久久国产精品喷潮免费观看臀| 日韩成人小视频| 欧美日韩人人精品| 日本成人电影资源网| 国产一二三在线视频五十路| 97久久精品国产| 欧美婷婷五月天| 欧美高清18A片| 九九超碰综合网| 久久人妻四季| 最新啪啪视频| 精品免费视频国产一区| 欧美色日| 中文字幕91综合| 日本www操操操| 99无码狠狠久久| 情色五月天就去干| 2025亚洲男人天堂| 国产情侣自拍在线播放| 色综合国产在线观看| 97操97干| 97er欧美性| 台湾佬激情综合| 丰满人妻av一区二区三区| 国产精品国产亚洲区艳妇糸列| 五月天人妻综合| 台湾大香蕉99热| 亚洲高潮少妇| 操逼操网| 无遮挡一级毛片视频免费的| 九九热国产| 中文无线日韩一区| 欧洲乱码视频| 九色97| www.99在线| blacked精品一区国产| 欧美精品精品一区二区| 久久嫩草| 成人日本片久久久蜜桃| 九九热在线精品视频| 九九精品美女高溯喷水| 五月天激情四射| 99热在线观看| 黄片免费看的| 四虎午夜影院| 欧美精品宗合| 欧美亚洲特P| 久久超碰天天| 97资源站久久| 在线小视频| 青女在线| 亚洲影院小综合| 东北女人av| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 天天综合91在线| 麻豆这里只有精品| 国产精品亚洲一区二区三区四区| 国产精品一区二区校花| 豆花视频操逼网址| 日本黄大片在线观看视频| 中日韩免费看男女操逼大全| 国产精品日日摸夜夜添骚逼| 91亚洲影视| 久久黄人人爽视频| 久久内射| 欧州91高潮| 久久久久久久精| 精品91日日夜夜超清资源| 久久区| 欧美国产精品久久九九| 国产无码久久高清| 亚洲成人黄色在线观看| 国内毛片国产欧美拍| 一区操逼| 黄色激情电影在线观看| 在线观看高清AV| 精品少妇人妻av久久免费| 中文字幕亚洲热播人妻| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 久久久久久久少妇| 麻豆蜜桃视频在线观看| 六月婷激情福利天堂69| 青青草自拍视频在线播放| 欧美日韩免费专区在线| 色诱avtt| 亚洲综合射| 亚洲综合色图欧美|