成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端圖形學實戰: 從零實現編輯器的圖層管理面板和實時縮略圖(vue3 + vite版)

開發 前端
今天繼續和大家分享一下幾何畫板的圖層管理和實時縮略圖的實現。

前言

今天繼續和大家分享一下幾何畫板的圖層管理和實時縮略圖的實現。

demo演示

按照筆者的寫作習慣, 這里先和大家演示一下實現的效果:

圖片

可以看到通過操作圖層面板我們可以輕松的切換到某一個元素并對元素進行編輯, 同時在每次操作之后右下角的縮略圖會實時展示畫布最新的變動。

源碼地址: https://gitee.com/lowcode-china/euryd

接下來就讓我們接著之前的內容, 來實現我們的圖層管理面板和實時縮略圖。

技術實現

接下來我還是用大家最最熟悉的 vue3 + ts 來實現, 其他框架實現原理類似, 感興趣的朋友也可以舉一反三, 自行實現。

圖層管理面板的實現

圖層管理面板主要是為了更方便管理和操作畫布中的元素, 比如 PhotoShop 里的圖層管理:

圖片

或者 H5-Dooring 頁面制作平臺的圖層面板:

我們可以從這些編輯器中總結出圖層管理的幾個主要功能:

  • 定位或切換元素
  • 顯示隱藏元素
  • 編輯元素(如刪除)
  • 批量操作(如多選批量刪除元素等)
  • 調整元素位置(順序)

所以說我們在設計圖層面板的時候也可以考慮以上幾個點, 接下來我就來構建一下圖層面板, 并實現切換元素,刪除指定元素 的功能。

1. 構建圖層面板

由于圖層面板的元素和畫布實際的元素數據是一一對應的, 所以我們可以直接用 canvasBox 來渲染圖層列表, 這里回顧一下 canvasBox 的數據結構:

type shapeType = "rect" | "circle" | "line";

interface IBaseShapeProp {
type: shapeType;
key: string;
style: any;
}

const canvasBox = ref<{ [key in shapeType]: IBaseShapeProp[] }>({
rect: [],
circle: [],
line: [],
});

其中每個元素都包含如下三個關鍵屬性:

  • key 元素的唯一id
  • type 元素的類型(矩形, 圓形, 線等)
  • style 元素的樣式

這樣我們就可以利用 key 來輕松的定位元素, 如果畫布中元素很多(比如復雜的設計稿), 我們還可以給圖層面板添加搜索和分類功能, 方便我們更高效的定位元素。

一個簡單實現的案例如下:

<div v-show="layerVisible" class="layerWrap">
<h3>圖層管理</h3>
<div v-for="item in canvasBox.rect" :key="item.key" class="layerItem">
<span @click.stop="handleSelected(item.key)">{{ item.key }}</span>
<span @click="handleDelItem(item.key)"> 刪除 </span>
</div>
</div>

css樣式如下:

.layerWrap {
position: absolute;
left: 60px;
margin-top: -20px;
padding-top: 10px;
padding-bottom: 10px;
width: 160px;
background: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
color: #888;
.layerItem {
&:hover {
background-color: rgba(110, 38, 236, 0.1);
}
span:last-child {
margin-left: 20px;
}
}
}

這里分享一下具體實現效果:

圖片

由于我們應用是用vue3的組合式函數寫的, 上圖中涉及到的切換元素和刪除元素的方法也很簡單, 具體如下:

import { ref } from "vue";
const curSelect = ref("");
const canvasBox = ref<{ [key in shapeType]: IBaseShapeProp[] }>({
rect: [],
circle: [],
line: [],
});
// 選擇元素
const handleSelected = (key: string) => {
curSelect.value = key;
};

// 刪除元素
const handleDelItem = (key: string) => {
canvasBox.value.rect = canvasBox.value.rect.filter((v) => v.key !== key);
};

所以說圖層管理的本質是基于已有的圖元進行數據結構層面的操作。

當然大家也可以擴展我們的畫板應用, 讓它支持多選, 搜索, 排列順序等功能。

實時縮略圖的實現

我們之前也許看過一些網站在瀏覽頁面的時候會出現小的縮略圖, 可以實時展示當前頁面的情況, 比如:

這里就簡單和大家分享一下實現方案。

因為我們在畫布中的每一次操作都會被記錄在 recordManager (記錄管理器, 也就是上篇文章介紹的撤銷重做的歷史快照集合)中, 我們只需要在每次操作后基于當前 dom 生成一張圖片即可(畫布如果是canvas實現的, miniMap實現起來會更簡單)。

所以說我們現在的問題就變成了如何基于 dom 生成圖片快照的問題了, 當然這里也有解決方案, 核心思路就是將 dom 轉換成 xml 結構,然后放在標簽內,借助 svg 的處理能力將 dom 結構轉換成 svg 標簽,然后將svg標簽作為圖片的 base64 地址,最后用 a 標簽實現下載。不過需要注意以下兩個細節:

  • img標簽的地址必須是base64字符串, 所以我們需要用canvas轉換成base64
  • canvas標簽直接轉成xml是無法顯示的, 所以我們需要將canvas轉換成base64,再放入圖片的src內

通過以上方式我們就可以原生實現將 dom 轉換為圖片。當然市面上也有比較成熟的方案, 比如:

  • html2canvas
  • dom2image

那這里我就用 dom2image 帶大家一起實現一下 miniMap。

首先我們在vite 工程中安裝該庫:

yarn add dom-to-image

具體實現:

const pushRecordFn = (
state: { [key in shapeType]: IBaseShapeProp[] },
prevState: { [key in shapeType]: IBaseShapeProp[] }
) => {
// 生成mini縮略圖片
domtoimage
.toPng(boardDom?.value?.boardDom)
.then(function (dataUrl: string) {
miniImg.value = dataUrl;
})
.catch(function (error: Error) {
console.error("腳本錯誤!", error);
});

const { snapshots, maxLimit, curIndex } = recordManager.value;
// 如果兩個狀態相同, 則不推入歷史記錄
if (!diff(state, snapshots[curIndex])) {
return;
}
// 如果在撤銷的過程中重新執行了新的操作, 則覆蓋上一個狀態
if (snapshots.length - 1 !== curIndex) {
snapshots.splice(curIndex + 1, snapshots.length);
}
// 超過了最大限制記錄
if (snapshots.length >= maxLimit) {
snapshots.shift();
}

recordManager.value.snapshots.push(cloneDeep(state));
recordManager.value.curIndex = recordManager.value.snapshots.length - 1;
};

好了, 以上就實現了我們的miniMap 縮略圖功能, 演示如下:


圖片

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2022-10-30 17:33:58

前端圖形學vue3

2012-07-18 20:59:40

jQuery

2009-08-28 15:19:17

C#實現縮略圖

2023-02-06 16:59:57

Canvas編輯器

2013-08-12 15:26:49

測試

2023-10-19 10:12:34

圖形編輯器開發縮放圖形

2013-12-02 15:07:57

jQuery插件

2012-01-10 14:59:42

jQuery

2022-01-12 09:01:52

前端技術編程

2010-01-20 10:29:37

Chrome縮略圖標簽管理

2023-04-07 08:02:30

圖形編輯器對齊功能

2023-02-01 09:21:59

圖形編輯器標尺

2009-12-07 11:21:59

PHP生成縮略圖

2009-10-26 17:38:22

VB.NET實現縮略圖

2019-02-15 14:00:57

Linux命令縮略圖

2023-09-26 07:39:21

2023-04-10 08:45:44

圖形編輯器排列移動功能

2023-10-08 08:11:40

圖形編輯器快捷鍵操作

2009-08-28 10:22:13

Windows 7系統故障應對縮略圖無法顯示

2009-08-12 16:33:37

.NET生成縮略圖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美一区二区三区在线 | 天堂久久天堂综合色 | 免费黄色成人 | 国产精品中文字幕在线播放 | 午夜电影福利 | 可以在线看的黄色网址 | 精品欧美激情在线观看 | 男女国产视频 | 中文字幕在线不卡播放 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 在线亚洲欧美 | 久久91| 一级特黄a大片 | 亚洲一区中文字幕 | 日韩视频在线观看中文字幕 | 国产精品毛片久久久久久久 | 人人叉 | 亚洲精品中文字幕在线 | 国产成人精品久久二区二区 | 成人av一区 | 97久久精品午夜一区二区 | 天堂视频一区 | 欧洲一区二区三区 | 午夜小视频免费观看 | 色视频欧美 | 日本中出视频 | 另类 综合 日韩 欧美 亚洲 | 日韩不卡一区二区 | 国产探花在线精品一区二区 | 亚洲国产精品精华素 | 欧美视频1区 | av中文字幕在线 | 网址黄 | 精品在线一区二区三区 | av电影一区 | 久久99精品久久 | 自拍偷拍精品 | 亚洲协和影视 | 国产一级毛片精品完整视频版 | 欧美福利专区 | 在线91|