123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <template>
- <div class="spec-preview">
- <!-- 此处懒加载无法显示图片 -->
- <el-image
- :src="imgUrl"
- alt=""
- fit="cover"
- style="width: 100%; height: 100%"
- ></el-image>
- <div
- class="event"
- @mousemove="handler"
- @mouseleave="leave"
- @click="$emit('handleViwer')"
- ></div>
- <!-- <div class="big">
- <img :src="imgUrl" alt="" ref="big" />
- </div> -->
- <!-- 遮罩层 -->
- <div class="mask" ref="mask"></div>
-
- </div>
- </template>
-
- <script>
- export default {
- name: "Zoom",
- props: {
- imgUrl: String,
- },
- data() {
- return {
- };
- },
- methods: {
- handler(event) {
- let mask = this.$refs.mask;
- // let bigImg = this.$refs.big;
- // 遮罩层可移动的范围:鼠标的当前坐标到该元素的距离(左侧、顶部)减去 遮罩层宽、高的一半(遮罩层始终是一个以鼠标为中心的正方形)
- let left = event.offsetX - mask.offsetWidth / 2;
- let top = event.offsetY - mask.offsetHeight / 2;
- // 约束遮罩层可移动的范围
- if (left <= 0) left = 0;
- if (left >= mask.offsetWidth) left = mask.offsetWidth;
- if (top <= 0) top = 0;
- if (top >= mask.offsetHeight) top = mask.offsetHeight;
- // 修改元素的left|top属性值
- mask.style.left = left + "px";
- mask.style.top = top + "px";
- // bigImg.style.left = -2 * left + "px";
- // bigImg.style.top = -2 * top + "px";
- let obj = {};
- obj.left = left;
- obj.top = top;
- obj.bigShow = true;
- this.$emit("sendStyle", obj);
- },
- leave() {
- let obj = {};
- obj.left = 0;
- obj.top = 0;
- obj.bigShow = false;
- this.$emit("sendStyle", obj);
- },
- },
- };
- </script>
-
- <style lang="scss" scoped>
- .spec-preview {
- position: relative;
- width: 100%;
- height: 100%;
- img {
- width: 100%;
- height: 100%;
- }
- .event {
- width: 100%;
- height: 100%;
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1;
- }
- .mask {
- width: 50%;
- height: 50%;
- background-color: rgba(100, 149, 237, 0.3);
- position: absolute;
- left: 0;
- top: 0;
- display: none;
- }
- .big {
- width: 100%;
- height: 100%;
- position: absolute;
- top: -1px;
- left: 100%;
- border: 1px solid #aaa;
- overflow: hidden;
- z-index: 1;
- display: none;
- background: white;
- img {
- width: 200%;
- max-width: 200%;
- height: 200%;
- position: absolute;
- left: 0;
- top: 0;
- }
- }
- .event:hover ~ .mask,
- .event:hover ~ .big {
- display: block;
- }
-
- }
- </style>
-
|