ComprehensiveAnalysis.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908
  1. <template>
  2. <div class="comprehensive-analysis">
  3. <LawPopup class="popup-style" />
  4. <div class="comprehensive-analysis-backbtn" @click="backEvent">
  5. <div class="left-arrow"></div>
  6. <div class="title">返回上级</div>
  7. </div>
  8. <!-- 属性弹窗 -->
  9. <AttributePopup
  10. v-drag
  11. class="comprehensive-analysis-popup"
  12. v-if="attrTableShow"
  13. :boxWidth="boxWidth"
  14. :boxHeight="boxHeight"
  15. :tableType="tableType"
  16. :tableData="tableData"
  17. @close="closeEvent"
  18. />
  19. <!-- 右上角工具栏 -->
  20. <!-- <div class="comprehensive-analysis-toolbar">
  21. <div class="searchbox">
  22. <el-input
  23. placeholder="请输入地址、地块名称等"
  24. v-model="searchInput"
  25. ></el-input>
  26. </div>
  27. </div> -->
  28. <!-- 图例 -->
  29. <Legend
  30. v-show="legendShow"
  31. class="comprehensive-analysis-legendbox"
  32. :legendData="{
  33. boxWidth: '230',
  34. boxHeight: legendHeight,
  35. menuIndex: '3',
  36. legendIcon: legendIcon,
  37. legendTitle: legendTitle,
  38. leftWidth: '30%',
  39. rightWidth: '70%',
  40. rightItemWidth: '120',
  41. }"
  42. />
  43. <!-- 开启左边面板的控制按钮 -->
  44. <div class="comprehensive-analysis-leftopenbox" v-show="leftBoxBtn">
  45. <div @click="leftPanelDisplay('show')"><div></div></div>
  46. </div>
  47. <!-- 开启右边面板的控制按钮 -->
  48. <div class="comprehensive-analysis-rightopenbox" v-show="rightBoxBtn">
  49. <div @click="rightPanelDisplay('show')"><div></div></div>
  50. </div>
  51. <!-- 左侧面板的显示与隐藏 -->
  52. <transition name="fade-left">
  53. <div class="comprehensive-analysis-left" v-show="showLeftBox">
  54. <div class="control-container">
  55. <el-input
  56. class="control-container-input"
  57. v-model="filterText"
  58. placeholder="请输入文本"
  59. ></el-input>
  60. <div
  61. class="control-container-btn"
  62. @click="leftPanelDisplay('hide')"
  63. ></div>
  64. </div>
  65. <div class="contant-container">
  66. <div class="contant-container-innerbox">
  67. <el-tree
  68. :data="modelData"
  69. :props="defaultProps"
  70. default-expand-all
  71. @check-change="handleCheckChange"
  72. node-key="id"
  73. ref="tree"
  74. :filter-node-method="filterNode"
  75. >
  76. <span class="custom-tree-node" slot-scope="{ node }">
  77. <template
  78. v-if="
  79. node.level === 3 ||
  80. node.parent.label === '所有图层' ||
  81. node.parent.label === '我的模型'
  82. "
  83. >
  84. <el-checkbox v-model="node.checked">{{
  85. node.label
  86. }}</el-checkbox>
  87. <span style="position: relative; left: 30px">
  88. <el-button
  89. v-if="node.parent.label === '我的模型'"
  90. size="small"
  91. type="text"
  92. icon="el-icon-edit"
  93. @click="handleUpdate(node)"
  94. ></el-button>
  95. <el-button
  96. v-if="node.parent.label === '我的模型'"
  97. size="small"
  98. type="text"
  99. icon="el-icon-delete"
  100. @click="handleDelete(node)"
  101. ></el-button>
  102. </span>
  103. </template>
  104. <template v-else>
  105. <div
  106. :class="{
  107. 'tree-arrow': !node.expanded,
  108. 'tree-arrow-expanded': node.expanded,
  109. }"
  110. ></div>
  111. <span>{{ node.label }}</span>
  112. </template>
  113. </span>
  114. </el-tree>
  115. </div>
  116. </div>
  117. </div>
  118. </transition>
  119. <!-- 右侧面板的显示与隐藏 -->
  120. <transition name="fade-right">
  121. <div class="comprehensive-analysis-right" v-show="showRightBox">
  122. <div class="control-container">
  123. <div @click="rightPanelDisplay('hide')"></div>
  124. </div>
  125. <div class="contant-container">
  126. <div class="contant-container-innerbox">
  127. <el-collapse v-model="activeNames">
  128. <el-collapse-item
  129. v-for="key in Object.keys(originalData)"
  130. :key="key"
  131. :title="key"
  132. :name="key"
  133. >
  134. <div
  135. class="panel-list-item"
  136. v-for="i in originalData[key]"
  137. :key="i.id"
  138. @click="listItemClick('default', i)"
  139. >
  140. {{ i.name }}
  141. </div>
  142. </el-collapse-item>
  143. <el-collapse-item title="我的标记" name="myLabel">
  144. <div
  145. class="panel-list-item"
  146. v-for="item in rightLabelData"
  147. :key="item.id"
  148. @click="listItemClick('new', item)"
  149. >
  150. {{ item.name }}
  151. </div>
  152. </el-collapse-item>
  153. </el-collapse>
  154. </div>
  155. </div>
  156. </div>
  157. </transition>
  158. </div>
  159. </template>
  160. <script>
  161. // 综合分析 this.$store.state.leftMenuTitle
  162. import MenuCard from "@/components/layout/MenuCard.vue";
  163. import Legend from "@/components/map/Legend.vue";
  164. import publicFun from "@/utils/publicFunction.js";
  165. import { treeModel, defaultLayers } from "@/config/common";
  166. import AttributePopup from "@/components/popup/AttributePopup.vue";
  167. import LawPopup from "@/components/popup/LawPopup.vue";
  168. import { get } from "@/utils/request";
  169. export default {
  170. name: "ComprehensiveAnalysis",
  171. components: {
  172. MenuCard,
  173. Legend,
  174. AttributePopup,
  175. LawPopup,
  176. },
  177. data() {
  178. return {
  179. legendShow: false,
  180. tableType: "normal",
  181. tableData: [],
  182. legendHeight: "0",
  183. boxWidth: "600",
  184. boxHeight: "600",
  185. attrTableShow: false,
  186. activeNames: ["myLabel"],
  187. rightPanelTitle: "",
  188. rightPanelDataMap: new Map(),
  189. // rightLabelDataMap: new Map(),
  190. originalData: {},
  191. rightLabelData: [
  192. {
  193. id: publicFun.buildGuid(),
  194. name: "疑点1",
  195. },
  196. {
  197. id: publicFun.buildGuid(),
  198. name: "疑点2",
  199. },
  200. {
  201. id: publicFun.buildGuid(),
  202. name: "疑点3",
  203. },
  204. {
  205. id: publicFun.buildGuid(),
  206. name: "疑点4",
  207. },
  208. {
  209. id: publicFun.buildGuid(),
  210. name: "疑点5",
  211. },
  212. {
  213. id: publicFun.buildGuid(),
  214. name: "疑点6",
  215. },
  216. {
  217. id: publicFun.buildGuid(),
  218. name: "疑点7",
  219. },
  220. ],
  221. // searchInput: "",,
  222. showLeftBox: true,
  223. showRightBox: true,
  224. leftBoxBtn: false,
  225. rightBoxBtn: false,
  226. modelData: [],
  227. defaultProps: {
  228. children: "children",
  229. label: "label",
  230. },
  231. legendIcon: [],
  232. legendTitle: [],
  233. // 我的模型相关数据
  234. myModel: null,
  235. filterText: "",
  236. myMap: new Map(),
  237. };
  238. },
  239. computed: {
  240. getCustomModel() {
  241. return this.$store.state.customModelsArr;
  242. },
  243. },
  244. watch: {
  245. legendTitle(val) {
  246. // console.log(val, "监听当前图例item数量");
  247. if (val.length === 0) {
  248. this.legendShow = false;
  249. }
  250. if (val.length > 0 && val.length <= 10) {
  251. this.legendShow = true;
  252. this.legendHeight = 50 * val.length + 50 + "";
  253. }
  254. },
  255. filterText(val) {
  256. this.$refs.tree.filter(val);
  257. },
  258. myModel(val) {
  259. // console.log(val, "监听综合分析中的我的模型");
  260. },
  261. getCustomModel: {
  262. handler(val) {
  263. console.log(val, "目前存在的自定义模型");
  264. let myModelRef = this.$refs.tree.data[2];
  265. if (myModelRef.label === "我的模型") {
  266. this.$refs.tree.data[2].children = val.map((ele) => {
  267. return {
  268. id: publicFun.buildGuid(),
  269. label: ele.name,
  270. data: ele.data,
  271. };
  272. });
  273. console.log(myModelRef.children, "最新的数据");
  274. }
  275. },
  276. deep: true,
  277. },
  278. },
  279. created() {
  280. this.modelData = [];
  281. // 分别对应1、2、3级节点
  282. this.modelData = treeModel.map((item1) => {
  283. if (item1.type === "我的模型") {
  284. this.myModel = item1;
  285. }
  286. return {
  287. id: item1.id,
  288. label: item1.type,
  289. children: item1.children.map((item2) => {
  290. return {
  291. id: item2.id,
  292. label: item2.type,
  293. children: item2.children.map((item3) => {
  294. this.rightPanelDataMap.set(item3.type, item3.children);
  295. return {
  296. id: item3.id,
  297. label: item3.type,
  298. children: [],
  299. checked: false,
  300. };
  301. }),
  302. };
  303. }),
  304. };
  305. });
  306. },
  307. mounted() {},
  308. methods: {
  309. // 回退事件
  310. backEvent() {
  311. console.log("综合分析回退事件");
  312. },
  313. // 左侧面板的显示与隐藏
  314. leftPanelDisplay(val) {
  315. if (val === "show") {
  316. this.showLeftBox = true;
  317. this.leftBoxBtn = false;
  318. }
  319. if (val === "hide") {
  320. this.showLeftBox = false;
  321. this.leftBoxBtn = true;
  322. }
  323. },
  324. // 右侧面板的显示与隐藏
  325. rightPanelDisplay(val) {
  326. if (val === "show") {
  327. this.showRightBox = true;
  328. this.rightBoxBtn = false;
  329. }
  330. if (val === "hide") {
  331. this.showRightBox = false;
  332. this.rightBoxBtn = true;
  333. }
  334. },
  335. // 节点过滤事件
  336. filterNode(value, data) {
  337. if (!value) return true;
  338. return data.label.indexOf(value) !== -1;
  339. },
  340. handleUpdate(node) {
  341. // console.log(node.data.data, "涉及的图层");
  342. // console.log(node.data.label);
  343. // console.log(node.data.id);
  344. this.$bus.$emit("updateModel", node);
  345. },
  346. handleDelete(node) {
  347. console.log(node, "删除节点");
  348. },
  349. // 节点change事件
  350. handleCheckChange(data, checked) {
  351. let guid = data.id;
  352. if (checked) {
  353. this.showRightBox = true;
  354. this.rightPanelTitle = data.label;
  355. this.originalData[data.label] = this.rightPanelDataMap.get(data.label);
  356. // 激活当前展开面板
  357. this.activeNames = ["myLabel", data.label];
  358. // 选中所有图层
  359. if (guid.indexOf("defaultLayer") > -1) {
  360. // 渲染当前模块下的面图层
  361. let cid = defaultLayers[data.label].cid;
  362. let color = defaultLayers[data.label].color;
  363. get(`./static/json/${cid}.json`).then((geoJson) => {
  364. map2DViewer.polygons[`${cid}_layer`] = [];
  365. this.originalData[data.label] = geoJson.map((v, index) => {
  366. return {
  367. id: publicFun.buildGuid("abnormal"),
  368. name: v.properties["异常"] + "_" + index,
  369. geometry: v.geometry,
  370. properties: v.properties,
  371. };
  372. });
  373. console.log(this.originalData[data.label], "label");
  374. this.activeNames = ["myLabel", data.label];
  375. // 地图定位
  376. let firstPolygon = JSON.parse(JSON.stringify(geoJson[0]));
  377. let coordinates = firstPolygon.geometry.coordinates[0][0][0];
  378. this.$store.state.mapMethodsCollection
  379. .get("RENDER")
  380. .setView(coordinates, 16);
  381. this.$store.state.mapMethodsCollection
  382. .get("RENDER")
  383. .addPolygonLayer(geoJson, cid, color);
  384. });
  385. }
  386. } else {
  387. // 设置右侧折叠面板item数量
  388. delete this.originalData[data.label];
  389. // 只激活我的标记
  390. this.activeNames = ["myLabel"];
  391. // 目前仅针对所有图层栏的默认图层
  392. if (guid.indexOf("defaultLayer") > -1) {
  393. let layer = `${defaultLayers[data.label].cid}_layer`;
  394. this.$store.state.mapMethodsCollection
  395. .get("RENDER")
  396. .deletePolygonLayer(layer);
  397. delete map2DViewer.polygons[layer];
  398. }
  399. }
  400. this.legendTitle = Object.keys(this.originalData).map((v) => {
  401. return { name: v, info: v };
  402. });
  403. this.legendIcon = this.legendTitle.map((v) => {
  404. let color = publicFun.getRandomColor();
  405. return {
  406. background: "transparent",
  407. border: `1px solid ${color}`,
  408. };
  409. });
  410. },
  411. listItemClick(type, data) {
  412. let coord = data.geometry.coordinates[0][0][0];
  413. this.$store.state.mapMethodsCollection.get("RENDER").setView(coord, 16);
  414. this.tableData = [];
  415. // data
  416. // id: "default_1669007689253APblgwSrDZlV1kSFim";
  417. // name: "疑点1";
  418. this.attrTableShow = true;
  419. if (type === "default") {
  420. this.tableType = "normal";
  421. this.boxWidth = "600";
  422. this.boxHeight = "200";
  423. console.log(data, "defaultTable");
  424. this.tableData.push({
  425. version: data.properties["版本"],
  426. nature: data.properties["性质"],
  427. area: data.properties["面积"],
  428. long: data.properties["周长"] || "--",
  429. });
  430. // this.tableData = data.map((v) => {
  431. // return {
  432. // version:v.properties['版本'],
  433. // nature:v.properties['性质'],
  434. // area:v.properties['面积'],
  435. // long:v.properties['周长'] || "--"
  436. // };
  437. // });
  438. console.log(this.tableData);
  439. }
  440. if (type === "new") {
  441. this.tableType = "personal";
  442. this.boxWidth = "300";
  443. this.boxHeight = "300";
  444. // console.log(data, "newTable");
  445. }
  446. },
  447. closeEvent() {
  448. this.attrTableShow = false;
  449. },
  450. },
  451. };
  452. </script>
  453. <style lang="less" scoped>
  454. @commonBorderColor: #00aaff;
  455. .comprehensive-analysis {
  456. .popup-style {
  457. position: absolute;
  458. top: 15%;
  459. left: 33%;
  460. // pointer-events: auto;
  461. z-index: 2;
  462. }
  463. .el-checkbox {
  464. color: #fff;
  465. /deep/.el-checkbox__input.is-checked + .el-checkbox__label {
  466. color: rgba(116, 255, 255, 1);
  467. }
  468. /deep/.el-checkbox__input.is-checked .el-checkbox__inner::after {
  469. width: 70%;
  470. height: 70%;
  471. background: #74ffff;
  472. border-radius: 0;
  473. transform: rotate(0deg) scaleY(1);
  474. position: static;
  475. }
  476. /deep/.el-checkbox__inner {
  477. border: 1px solid #dcdfe6;
  478. background: rgba(0, 170, 255, 0);
  479. display: flex;
  480. align-items: center;
  481. justify-content: center;
  482. position: static;
  483. &::after {
  484. transition: 0ms;
  485. }
  486. }
  487. /deep/.el-checkbox__label {
  488. padding-left: 0;
  489. font-size: 15px;
  490. position: absolute;
  491. top: 1px;
  492. left: 25px;
  493. }
  494. }
  495. &-backbtn {
  496. width: 120px;
  497. height: 35px;
  498. background: @commonBorderColor;
  499. color: #fff;
  500. border-radius: 3px;
  501. position: absolute;
  502. left: 30px;
  503. top: 15px;
  504. pointer-events: auto;
  505. cursor: pointer;
  506. .left-arrow {
  507. width: 7px;
  508. height: 7px;
  509. border-top: 2px solid #ffffff;
  510. border-right: 2px solid #ffffff;
  511. transform: translate(-50%, -50%) rotate(225deg);
  512. position: absolute;
  513. top: 16.5px;
  514. left: 25px;
  515. }
  516. .title {
  517. width: 80px;
  518. height: 35px;
  519. line-height: 35px;
  520. position: absolute;
  521. left: 34px;
  522. }
  523. }
  524. &-toolbar {
  525. width: 340px;
  526. height: 50px;
  527. line-height: 28px;
  528. color: #fff;
  529. border-radius: 3px;
  530. position: absolute;
  531. right: 60px;
  532. top: 8px;
  533. pointer-events: auto;
  534. .layer-display {
  535. width: 40px;
  536. height: 40px;
  537. background: url("../assets/map/display.png") no-repeat center;
  538. position: absolute;
  539. bottom: 0;
  540. left: 0;
  541. cursor: pointer;
  542. &.display-true {
  543. background: url("../assets/map/display_true.png") no-repeat center;
  544. }
  545. }
  546. .layers-control-icon {
  547. width: 44px;
  548. height: 32px;
  549. background: url("../assets/map/layer_default.png") no-repeat center;
  550. position: absolute;
  551. bottom: 4px;
  552. left: 40px;
  553. cursor: pointer;
  554. &.control-true {
  555. background: url("../assets/map/layer_selected.png") no-repeat center;
  556. }
  557. }
  558. .searchbox {
  559. width: 245px;
  560. height: 40px;
  561. position: absolute;
  562. bottom: 2px;
  563. right: 0;
  564. }
  565. .layercontrol-container {
  566. position: absolute;
  567. width: 288px;
  568. height: 190px;
  569. left: -200px;
  570. bottom: -200px;
  571. border: 1px solid @commonBorderColor;
  572. background: rgba(0, 170, 255, 0.2);
  573. .layer-control-item {
  574. width: 100%;
  575. height: 30px;
  576. display: flex;
  577. .left {
  578. width: 20%;
  579. height: 100%;
  580. display: flex;
  581. align-items: center;
  582. justify-content: center;
  583. border-right: 1px solid @commonBorderColor;
  584. border-bottom: 1px solid @commonBorderColor;
  585. &-eye {
  586. width: 80%;
  587. height: 80%;
  588. background: url("../assets/map/eye1.png") no-repeat center;
  589. cursor: pointer;
  590. .open {
  591. background: url("../assets/map/eye2.png") no-repeat center;
  592. }
  593. }
  594. }
  595. .right {
  596. width: 80%;
  597. height: 100%;
  598. display: flex;
  599. align-items: center;
  600. justify-content: flex-start;
  601. border-bottom: 1px solid @commonBorderColor;
  602. &-line {
  603. width: 3%;
  604. height: 90%;
  605. border-right: 7px solid red;
  606. }
  607. &-text {
  608. width: 50%;
  609. height: 90%;
  610. display: flex;
  611. align-items: center;
  612. justify-content: flex-start;
  613. }
  614. }
  615. }
  616. }
  617. }
  618. &-legendbox {
  619. position: absolute;
  620. right: 410px;
  621. top: 30px;
  622. z-index: 1;
  623. }
  624. /* 弹窗 */
  625. &-popup {
  626. // background: red;
  627. position: absolute;
  628. top: 10%;
  629. left: 35%;
  630. pointer-events: auto;
  631. z-index: 99;
  632. }
  633. /* 左边树状面板 */
  634. &-left {
  635. width: 400px;
  636. height: 85%;
  637. position: absolute;
  638. top: 60px;
  639. left: 0;
  640. background: url("../assets/image/tree_background.png") no-repeat center;
  641. background-size: 100% 100%;
  642. pointer-events: auto;
  643. .control-container {
  644. width: 100%;
  645. height: 8%;
  646. display: flex;
  647. justify-content: flex-end;
  648. align-items: center;
  649. position: relative;
  650. &-btn {
  651. width: 30px;
  652. height: 30px;
  653. background: url("../assets/image/close.png") no-repeat center;
  654. position: absolute;
  655. top: 3px;
  656. right: 3px;
  657. cursor: pointer;
  658. }
  659. &-input {
  660. width: 320px;
  661. position: absolute;
  662. bottom: 5px;
  663. left: 30px;
  664. /deep/.el-input__inner {
  665. font-size: 15px;
  666. height: 35px;
  667. }
  668. }
  669. }
  670. .contant-container {
  671. width: 100%;
  672. height: 92%;
  673. overflow: auto;
  674. display: flex;
  675. align-items: center;
  676. justify-content: center;
  677. &-innerbox {
  678. width: 90%;
  679. height: 98%;
  680. .tree-arrow {
  681. position: relative;
  682. top: 0;
  683. left: 0;
  684. display: inline-block;
  685. width: 0px;
  686. height: 0px;
  687. border: 7px solid transparent;
  688. border-left-color: #fff;
  689. }
  690. .tree-arrow-expanded {
  691. position: relative;
  692. top: 4px;
  693. left: -3px;
  694. display: inline-block;
  695. width: 0px;
  696. height: 0px;
  697. border: 7px solid transparent;
  698. border-top-color: #fff;
  699. }
  700. .custom-tree-node {
  701. position: relative;
  702. width: 250px;
  703. .el-checkbox {
  704. width: 50%;
  705. }
  706. }
  707. }
  708. }
  709. }
  710. &-leftopenbox {
  711. position: absolute;
  712. left: 5px;
  713. width: 50px;
  714. height: 100%;
  715. display: flex;
  716. flex-direction: column;
  717. justify-content: center;
  718. & > div {
  719. pointer-events: auto;
  720. width: 40px;
  721. height: 40px;
  722. border-radius: 50%;
  723. background: rgba(102, 203, 255, 1);
  724. position: relative;
  725. cursor: pointer;
  726. & > div {
  727. position: absolute;
  728. top: 8px;
  729. left: 16px;
  730. display: inline-block;
  731. width: 0px;
  732. height: 0px;
  733. border: 12px solid transparent;
  734. border-left-color: #fff;
  735. }
  736. }
  737. }
  738. &-rightopenbox {
  739. position: absolute;
  740. right: 0;
  741. width: 50px;
  742. height: 100%;
  743. display: flex;
  744. flex-direction: column;
  745. justify-content: center;
  746. & > div {
  747. pointer-events: auto;
  748. width: 40px;
  749. height: 40px;
  750. border-radius: 50%;
  751. cursor: pointer;
  752. position: relative;
  753. background: rgba(102, 203, 255, 1);
  754. & > div {
  755. position: absolute;
  756. top: 8px;
  757. right: 16px;
  758. display: inline-block;
  759. width: 0px;
  760. height: 0px;
  761. border: 12px solid transparent;
  762. border-right-color: #fff;
  763. }
  764. }
  765. }
  766. /* 右面板 -- 显示标记疑点 */
  767. &-right {
  768. width: 400px;
  769. height: 85%;
  770. position: absolute;
  771. top: 60px;
  772. right: 0;
  773. background: url("../assets/image/tree_background.png") no-repeat center;
  774. background-size: 100% 100%;
  775. pointer-events: auto;
  776. z-index: 2;
  777. .control-container {
  778. width: 100%;
  779. height: 5%;
  780. position: relative;
  781. & > div {
  782. width: 30px;
  783. height: 30px;
  784. background: url("../assets/image/close.png") no-repeat center;
  785. position: absolute;
  786. top: 3px;
  787. right: 3px;
  788. cursor: pointer;
  789. }
  790. }
  791. .contant-container {
  792. width: 100%;
  793. height: 95%;
  794. overflow: auto;
  795. display: flex;
  796. align-items: center;
  797. justify-content: center;
  798. &-innerbox {
  799. width: 90%;
  800. height: 98%;
  801. /deep/.el-icon-arrow-right:before {
  802. content: "";
  803. }
  804. /deep/.el-icon-arrow-right:after {
  805. content: "";
  806. }
  807. .panel-list-item {
  808. margin: 0 auto;
  809. width: 80%;
  810. height: auto;
  811. background: #00aaff;
  812. font-family: "PingFangSC SC";
  813. font-weight: 400;
  814. font-size: 18px;
  815. line-height: 40px;
  816. background: rgba(0, 47, 86, 0.3);
  817. color: #fff;
  818. padding-left: 20px;
  819. border-left: 1px solid rgba(207, 222, 255, 0.2);
  820. border-right: 1px solid rgba(207, 222, 255, 0.2);
  821. border-bottom: 1px solid rgba(207, 222, 255, 0.2);
  822. cursor: pointer;
  823. }
  824. }
  825. }
  826. }
  827. /* 侧边栏收缩动画效果 */
  828. /* 左边 */
  829. .fade-left-enter-from {
  830. opacity: 0;
  831. transform: translateX(-300px);
  832. }
  833. .fade-left-enter-to {
  834. opacity: 1;
  835. transform: translateX(0);
  836. }
  837. /* 主动输入控住过渡的持续时间和缓动曲线 */
  838. .fade-left-enter-active {
  839. transition: all 0.3s ease;
  840. }
  841. .fade-left-leave-from {
  842. opacity: 1;
  843. transform: translateX(0);
  844. }
  845. .fade-left-leave-to {
  846. opacity: 0;
  847. transform: translateX(-300px);
  848. }
  849. .fade-left-leave-active {
  850. transition: all 0.3s ease;
  851. }
  852. /* 右边 */
  853. .fade-right-enter-from {
  854. opacity: 0;
  855. transform: translateX(300px);
  856. }
  857. .fade-right-enter-to {
  858. opacity: 1;
  859. transform: translateX(0);
  860. }
  861. .fade-right-enter-active {
  862. transition: all 0.3s ease;
  863. }
  864. .fade-right-leave-from {
  865. opacity: 1;
  866. transform: translateX(0);
  867. }
  868. .fade-right-leave-to {
  869. opacity: 0;
  870. transform: translateX(300px);
  871. }
  872. .fade-right-leave-active {
  873. transition: all 0.3s ease;
  874. }
  875. }
  876. </style>