123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729 |
- <template>
- <div class="pop-up-main">
- <div class="paln-box">
- <div
- class="movableItem"
- :style="{ width: width, height: height }"
- @mousewheel="rollImg($event)"
- @mousedown="drag($event, 1)"
- ref="bigImage"
- >
- <!-- 图片不可选中 或不可拖拽到新标签打开-->
- <slot
- name="svg"
- oncontextmenu="return false;"
- onselectstart="return false;"
- draggable="false"
- ></slot>
- <template v-if="isEdit && iconWidth">
- <img
- ref="signImage"
- :src="iconImgUrl"
- @mousedown="dragSign($event, key)"
- v-for="(item, key) in equipment"
- :key="key"
- :style="{
- top: equipment[key].top + '%',
- left: equipment[key].left + '%',
- width: iconWidth,
- height: iconHeight,
- }"
- class="equipment"
- />
- </template>
- <el-popover
- width="200"
- placement="bottom-start"
- trigger="hover"
- :close-delay="100"
- content="暂无描述"
- v-else-if="!isEdit && iconWidth && arrIcon.length == equipment.length"
- v-for="(item, key) in equipment"
- :key="key"
- popper-class="preview-popover"
- >
- <!-- &&arrIcon.length==equipment.length -->
- <template>
- <div v-if="equipment[key].describe" class="describe">
- <p class="describe-top">
- {{ equipment[key].describe.deviceName }}
- </p>
- <p class="describe-center">
- {{ equipment[key].describe.remark }}
- </p>
- <p class="describe-bottom">
- {{ equipment[key].describe.location }}
- </p>
- </div>
- </template>
- <!-- <img oncontextmenu="return false;" onselectstart="return false;" draggable="false" slot="reference"
- ref="signImage" :src="$baseUrl + equipment[key].iconImgUrl"
- :style="{top:equipment[key].top+'%',left:equipment[key].left+'%',width:arrIcon[key].iconWidth,height:arrIcon[key].iconHeight}"
- class="equipment" /> -->
- </el-popover>
- </div>
- </div>
- </div>
- </template>
- <script>
- export default {
- props: {
- equipment: {
- type: Array,
- default: () => {
- return [
- {
- iconImgUrl: "",
- top: 0,
- left: 0,
- },
- ];
- },
- },
- isEdit: {
- default: false,
- },
- imgUrl: {},
- },
- data() {
- return {
- // 定时器
- timer: "",
- // 图片加载失败
- imgOnerror: false,
- imgIndex: 0,
- isChange: true,
- // 图片显示默认大小
- width: "1600px",
- height: "800px",
- // 可缩小倍数,为空则可无限缩小
- minification: 3,
- // 可放大倍数 为空则可无限放大
- magnification: "",
- bigMaxWidth: 1600,
- bigMaxHeight: 800,
- // 小图标信息
- iconImgUrl: "",
- iconWidth: "",
- // 存储每个小图标处理好的宽高
- iconHeight: "",
- arrIcon: [],
- iconMaxWidth: 32,
- iconMaxHeight: 32,
- tog: 1,
- };
- },
- methods: {
- // 获取图片大小
- getImgInfo(
- imgUrl,
- MaxWidth,
- MaxHeight,
- StrWidth,
- StrHeight,
- Array = false,
- arr,
- num = 0
- ) {
- var img = new Image();
- // img.src = imgUrl;
- img = document.getElementsByClassName("svg");
- let _this = this;
- img.onerror = () => {
- // console.log("加载失败!!", _this.arrIcon.length);
- // console.log(imgUrl, MaxWidth, MaxHeight, StrWidth, StrHeight);
- _this.imgOnerror = true;
- _this.imgIndex =
- _this.arrIcon.length - 1 < 0 ? 0 : _this.arrIcon.length - 1;
- this.timer = setTimeout(() => {
- if (num <= 5) {
- _this.getImgInfo(
- imgUrl,
- MaxWidth,
- MaxHeight,
- StrWidth,
- StrHeight,
- Array,
- arr,
- num + 1
- );
- }
- clearInterval(this.timer);
- }, 2000);
- };
- img.onload = function (e) {
- // 显示时 初始 最大宽度
- let maxWidth = MaxWidth;
- // 显示时 初始 最大高度
- let maxHeight = MaxHeight;
- if (
- e.path[0].naturalWidth <= maxWidth &&
- e.path[0].naturalHeight <= maxHeight
- ) {
- _this[StrWidth] = e.path[0].naturalWidth + "px";
- _this[StrHeight] = e.path[0].naturalHeight + "px";
- } else {
- _this[StrWidth] = e.path[0].naturalWidth + "px";
- _this[StrHeight] = e.path[0].naturalHeight + "px";
- if (
- e.path[0].naturalWidth > maxWidth &&
- e.path[0].naturalHeight <= maxHeight
- ) {
- let ratio = e.path[0].naturalWidth / e.path[0].naturalHeight;
- _this[StrWidth] = "1600px";
- _this[StrHeight] = maxWidth / ratio + "px";
- } else if (
- e.path[0].naturalWidth <= maxWidth &&
- e.path[0].naturalHeight > maxHeight
- ) {
- let ratio = e.path[0].naturalWidth / e.path[0].naturalHeight;
- _this[StrWidth] = maxHeight * ratio + "px";
- _this[StrHeight] = "800px";
- } else if (
- e.path[0].naturalWidth > maxWidth &&
- e.path[0].naturalHeight > maxHeight
- ) {
- let ratio = e.path[0].naturalWidth / e.path[0].naturalHeight;
- let w = maxWidth;
- let h = w / ratio;
- if (h > maxHeight) {
- let ratio2 = w / h;
- h = maxHeight;
- w = h * ratio2;
- }
- _this[StrWidth] = w + "px";
- _this[StrHeight] = h + "px";
- }
- }
- if (Array) {
- _this[arr].push({
- iconWidth: _this[StrWidth],
- iconHeight: _this[StrHeight],
- });
- // console.log(
- // "tow#################################arrIcon",
- // _this[arr].length
- // );
- }
- // _this[StrWidth] = `${e.path[0].naturalWidth}px`;
- // _this[StrHeight] = `${e.path[0].naturalHeight}px`;
- // vm.$set(vm.imgInfo, "width", img.width);
- // vm.$set(vm.imgInfo, "height", img.height);
- // console.log("打印图片信息", imgUrl, _this[StrWidth], _this[StrHeight]); // 打印图片信息
- // console.log("打印图片信息", e.path[0].naturalHeight); // 打印图片信息
- // console.log("打印图片信息", e); // 打印图片信息
- // console.log("打印图片信息this.width", _this[StrWidth]); // 打印图片信息
- // console.log("打印图片信息this.height", _this[StrHeight]); // 打印图片信息
- };
- },
- // 缩放
- rollImg() {
- var that = this;
- // var oImg = document.getElementsByClassName("movableItem")[0];
- var oImg = this.$refs.bigImage;
- // console.log(
- // "length",
- // document.getElementsByClassName("movableItem").length
- // );
- // console.log("oImg", oImg);
- var _this = this;
- function fnWheel(obj, fncc) {
- obj.onmousewheel = fn;
- if (obj.addEventListener) {
- obj.addEventListener("DOMMouseScroll", fn, false);
- }
- function fn(ev) {
- var oEvent = ev || window.event;
- var down = true;
- if (oEvent.detail) {
- down = oEvent.detail > 0;
- } else {
- down = oEvent.wheelDelta < 0;
- }
- if (fncc) {
- fncc.call(this, down, oEvent);
- }
- if (oEvent.preventDefault) {
- oEvent.preventDefault();
- }
- return false;
- }
- }
- fnWheel(oImg, function (down, oEvent) {
- var oldWidth = this.offsetWidth;
- var oldHeight = this.offsetHeight;
- var oldLeft = this.offsetLeft;
- var oldTop = this.offsetTop;
- var parent = oEvent.path[2];
- // 获取父元素距离页面可视区域的位置
- var parentLeft = parent.getBoundingClientRect().left;
- var parentTop = parent.getBoundingClientRect().top;
- // 比例 = (点击位置距离可视窗口位置 - 父元素距离可视窗口位置 - 相对定位的left)/ 本身宽度
- var scaleX = (oEvent.clientX - parentLeft - oldLeft) / oldWidth; //比例
- var scaleY = (oEvent.clientY - parentTop - oldTop) / oldHeight;
- let nowWidth = this.style.width.split("p")[0];
- let initWidth = _this.width.split("p")[0];
- let initHeight = _this.height.split("p")[0];
- let miniFlag = true;
- let magniFlag = true;
- if (_this.minification) {
- // 限制缩小范围
- if (nowWidth <= parseInt(initWidth / _this.minification)) {
- miniFlag = false;
- // console.log("限制缩小范围");
- // console.log(
- // "限制缩小范围",
- // nowWidth,
- // parseInt(initWidth / _this.minification)
- // );
- this.style.width = parseInt(initWidth / _this.minification) + "px";
- this.style.height =
- parseInt(initHeight / _this.minification) + "px";
- }
- if (_this.magnification) {
- // 限制放大范围
- if (nowWidth >= parseInt(initWidth * _this.magnification)) {
- magniFlag = false;
- // console.log("限制放大范围");
- this.style.width =
- parseInt(initWidth * _this.magnification) + "px";
- this.style.height =
- parseInt(initHeight * _this.magnification) + "px";
- }
- }
- }
- if (down && miniFlag) {
- this.style.width = parseInt(this.offsetWidth * 0.9) + "px";
- this.style.height = parseInt(this.offsetHeight * 0.9) + "px";
- that.width = parseInt(this.offsetWidth * 0.9) + "px";
- that.height = parseInt(this.offsetHeight * 0.9) + "px";
- } else if (!down && magniFlag) {
- // console.log("放大");
- this.style.width = parseInt(this.offsetWidth * 1.1) + "px";
- this.style.height = parseInt(this.offsetHeight * 1.1) + "px";
- that.width = parseInt(this.offsetWidth * 1.1) + "px";
- that.height = parseInt(this.offsetHeight * 1.1) + "px";
- }
- var newWidth = this.offsetWidth;
- var newHeight = this.offsetHeight;
- // 新的相对位置left = 原先的相对位置left - 比例 *(本身新的宽度-旧的宽度)
- this.style.left =
- Math.round(this.offsetLeft - scaleX * (newWidth - oldWidth)) + "px";
- this.style.top =
- Math.round(this.offsetTop - scaleY * (newHeight - oldHeight)) + "px";
- });
- // console.log(that.width)
- },
- // },
- //拖拽
- drag(ev) {
- // var ie = document.all;
- var nn6 = document.getElementById && !document.all;
- var isdrag = false;
- var y, x;
- var nTY, nTX;
- var oDragObj;
- function moveMouse(e) {
- if (isdrag) {
- oDragObj.style.top =
- (nn6 ? nTY + e.clientY - y : nTY + event.clientY - y) + "px";
- oDragObj.style.left =
- (nn6 ? nTX + e.clientX - x : nTX + event.clientX - x) + "px";
- return false;
- }
- }
- function initDrag(e) {
- // console.log("点击图片initDrag");
- var oDragHandle = nn6 ? e.target : event.srcElement;
- var topElement = "HTML";
- while (
- oDragHandle.tagName != topElement &&
- oDragHandle.className != "movableItem"
- ) {
- oDragHandle = nn6
- ? oDragHandle.parentNode
- : oDragHandle.parentElement;
- }
- if (oDragHandle.className == "movableItem") {
- isdrag = true;
- oDragObj = oDragHandle;
- // 父元素宽高
- let width = e.path[2].offsetWidth;
- let height = e.path[2].offsetHeight;
- // 这里判断第一次获取不到style 样式 默认为 居中50%
- if (oDragObj.style.top == "") {
- nTY = 0;
- nTX = parseInt((50 * width) / 100 + 0);
- } else {
- nTY = parseInt(oDragObj.style.top + 0);
- nTX = parseInt(oDragObj.style.left + 0);
- }
- y = nn6 ? e.clientY : event.clientY;
- x = nn6 ? e.clientX : event.clientX;
- oDragObj.style.cursor = "move";
- document.onmousemove = moveMouse;
- return false;
- }
- }
- document.onmousemove = initDrag;
- // document.onmouseup = new Function("isdrag=false");
- document.onmouseup = function (e) {
- isdrag = false;
- document.onmousemove = null;
- document.onmouseup = null;
- var oDragHandle = nn6 ? e.target : event.srcElement;
- var topElement = "HTML";
- while (
- oDragHandle.tagName != topElement &&
- oDragHandle.className != "movableItem"
- ) {
- oDragHandle = nn6
- ? oDragHandle.parentNode
- : oDragHandle.parentElement;
- }
- if (oDragHandle.className == "movableItem") {
- oDragObj = oDragHandle;
- oDragObj.style.cursor = "Default";
- }
- };
- ev = event || window.event;
- // 取消事件冒泡行为
- // window.event ? (window.event.cancelBubble = true) : ev.stopPropagation();
- },
- // 拖拽标记
- // eslint-disable-next-line no-unused-vars
- dragSign(ev, key) {
- var nn6 = document.getElementById && !document.all;
- var isdrag = false;
- var y, x;
- var nTY, nTX;
- var oDragObj;
- let _this = this;
- function moveMouse(e) {
- if (isdrag) {
- this.equipmentKey = key;
- // console.log("thisequipmentKey", this.equipmentKey);
- let widthItem = e.path[1].style.width.split("p");
- let heightItem = e.path[1].style.height.split("p");
- let width = widthItem[0];
- // eslint-disable-next-line no-unused-vars
- let height = heightItem[0];
- let top =
- ((nn6
- ? (nTY / 100) * height + e.clientY - y
- : (nTY / 100) * height + event.clientY - y) /
- height) *
- 100;
- let left =
- ((nn6
- ? (nTX / 100) * width + e.clientX - x
- : (nTX / 100) * width + event.clientX - x) /
- width) *
- 100;
- if (top >= 0 && top <= 100) {
- _this.equipment[key].top = top;
- }
- if (left >= 0 && left <= 100) {
- _this.equipment[key].left = left;
- }
- return false;
- }
- }
- // eslint-disable-next-line no-unused-vars
- function initDrag(e) {
- // console.log("_this", _this);
- var oDragHandle = nn6 ? e.target : event.srcElement;
- var topElement = "HTML";
- while (
- oDragHandle.tagName != topElement &&
- oDragHandle.className.indexOf("equipment") == -1
- ) {
- oDragHandle = nn6
- ? oDragHandle.parentNode
- : oDragHandle.parentElement;
- }
- if (oDragHandle.className.indexOf("equipment") != -1) {
- isdrag = true;
- oDragObj = oDragHandle;
- // 父元素宽高
- let width = e.path[1].offsetWidth;
- // let height = e.path[1].offsetHeight;
- // console.log(width, height);
- // console.log("oDragObj.style", oDragObj.style);
- // 这里判断第一次获取不到style 样式 默认为 居中50%
- if (oDragObj.style.top == "") {
- // nTY = parseInt((50 * height) / 100 + 0);
- nTY = 0;
- nTX = parseInt((50 * width) / 100 + 0);
- } else if (oDragObj.style.top.indexOf("%") != -1) {
- nTY = oDragObj.style.top.split("%")[0];
- nTX = oDragObj.style.left.split("%")[0];
- } else {
- nTY = parseInt(oDragObj.style.top + 0);
- nTX = parseInt(oDragObj.style.left + 0);
- }
- y = nn6 ? e.clientY : event.clientY;
- x = nn6 ? e.clientX : event.clientX;
- oDragObj.style.cursor = "move";
- document.onmousemove = moveMouse;
- return false;
- }
- }
- // document.onmousedown = initDrag;
- document.onmousemove = initDrag;
- document.onmouseup = function (e) {
- isdrag = false;
- document.onmousemove = null;
- document.onmouseup = null;
- var oDragHandle = nn6 ? e.target : event.srcElement;
- var topElement = "HTML";
- while (
- oDragHandle.tagName != topElement &&
- oDragHandle.className != "equipment"
- ) {
- oDragHandle = nn6
- ? oDragHandle.parentNode
- : oDragHandle.parentElement;
- }
- if (oDragHandle.className == "equipment") {
- oDragObj = oDragHandle;
- oDragObj.style.cursor = "Default";
- }
- };
- // _this.equipmentKey = key;
- // _this.equipment[_this.equipmentKey].left = l;
- // _this.equipment[_this.equipmentKey].top = t;
- ev = event || window.event;
- // 取消事件冒泡行为
- window.event ? (window.event.cancelBubble = true) : ev.stopPropagation();
- },
- },
- watch: {
- equipment() {
- if (this.equipment.length != 0) {
- this.arrIcon = [];
- let finish = true;
- this.equipment.filter((item) => {
- if (!item.iconImgUrl) {
- finish = false;
- }
- return true;
- });
- // console.log("finish", finish);
- if (finish) {
- this.equipment.filter((item, index) => {
- if (index >= this.imgIndex) {
- console.log("iconImgUrl", this.equipment[index].iconImgUrl);
- this.getImgInfo(
- this.$baseUrl + item.iconImgUrl,
- this.iconMaxWidth,
- this.iconMaxHeight,
- "iconWidth",
- "iconHeight",
- true,
- "arrIcon"
- );
- }
- console.log("22filter", index);
- return true;
- });
- }
- }
- },
- },
- created() {
- this.getImgInfo(
- this.imgUrl,
- this.bigMaxWidth,
- this.bigMaxHeight,
- "width",
- "height"
- );
- if (this.equipment.length != 0) {
- this.arrIcon = [];
- let finish = true;
- this.equipment.filter((item) => {
- if (!item.iconImgUrl) {
- finish = false;
- }
- return true;
- });
- // console.log("finish", finish);
- if (finish) {
- this.equipment.filter((item, index) => {
- if (index >= this.imgIndex) {
- // console.log("iconImgUrl", this.equipment[index].iconImgUrl);
- this.getImgInfo(
- this.$baseUrl + item.iconImgUrl,
- this.iconMaxWidth,
- this.iconMaxHeight,
- "iconWidth",
- "iconHeight",
- true,
- "arrIcon"
- );
- }
- // console.log("22filter", index);
- return true;
- });
- }
- }
- this.iconImgUrl = JSON.parse(
- JSON.stringify(this.$baseUrl + this.equipment[0].iconImgUrl)
- );
- // console.log("imgUrl", this.imgUrl);
- // console.log("equipment", this.equipment);
- // //禁止鼠标右键
- // document.oncontextmenu = function() {
- // return false;
- // };
- },
- };
- </script>
- <style lang="less">
- .preview-popover {
- background-color: #d3edf7dd;
- padding: 12px;
- .popper__arrow::after {
- border-bottom-color: #d3edf7dd !important;
- }
- .describe {
- p {
- padding-bottom: 5px;
- &:last-child {
- padding-bottom: 0px;
- }
- }
- .describe-top {
- // color: sandybrown;
- // color: red;
- color: rgb(21, 110, 110);
- }
- .describe-center {
- color: rgb(79, 21, 206);
- }
- .describe-bottom {
- color: rgb(30, 31, 29);
- }
- }
- }
- </style>
- <style lang="less" scoped>
- .pop-up-main {
- width: 100%;
- height: calc(100vh - 12vh);
- overflow-y: hidden;
- .paln-box {
- width: 100%;
- height: 100%;
- position: relative;
- .movableItem {
- position: absolute;
- // top: 75%;
- left: 50%;
- transform: translate(-50%, 0%);
- img,
- .svg {
- z-index: 1;
- width: 100%;
- height: 100%;
- }
- .equipment {
- position: absolute;
- top: 0;
- left: 0;
- transform: translate(-50%, -50%);
- z-index: 2;
- font-size: 40px;
- // color: red;
- // background: blue;
- zoom: 1;
- }
- }
- .shuaxin {
- position: absolute;
- z-index: 2;
- font-size: 40px;
- top: 20px;
- left: 20px;
- cursor: pointer;
- &:hover {
- color: yellowgreen;
- }
- }
- .equipment {
- color: white;
- }
- &/deep/.el-button {
- z-index: 2;
- position: absolute;
- bottom: 60px;
- right: 20px;
- width: 60px;
- height: 35px;
- span {
- display: inline-block;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- }
- i {
- display: inline-block;
- position: absolute;
- top: 50%;
- left: 25%;
- transform: translate(-50%, -50%);
- }
- }
- }
- }
- // body {
- // height: 100%;
- // overflow: hidden;
- // margin: 0;
- // padding: 0;
- // }
- </style>
|