{"id":31,"date":"2025-06-26T11:10:19","date_gmt":"2025-06-26T03:10:19","guid":{"rendered":"https:\/\/kzqgy.cn\/?p=31"},"modified":"2025-06-26T11:31:51","modified_gmt":"2025-06-26T03:31:51","slug":"%e7%94%b5%e5%95%86%e5%9b%be%e7%89%87%e6%94%be%e5%a4%a7%e9%95%9c%e5%8a%9f%e8%83%bd","status":"publish","type":"post","link":"https:\/\/kzqgy.cn\/index.php\/2025\/06\/26\/%e7%94%b5%e5%95%86%e5%9b%be%e7%89%87%e6%94%be%e5%a4%a7%e9%95%9c%e5%8a%9f%e8%83%bd\/","title":{"rendered":"\u7535\u5546\u56fe\u7247\u653e\u5927\u955c\u529f\u80fd"},"content":{"rendered":"<div>\n<div>&lt;template&gt;<\/div>\n<div>\u00a0 &lt;div class=&#8221;magnifier-system&#8221;&gt;<\/div>\n<div>\u00a0 \u00a0 &lt;!&#8211; \u5c0f\u56fe\u533a\u57df &#8211;&gt;<\/div>\n<div>\u00a0 \u00a0 &lt;el-popover<\/div>\n<div>\u00a0 \u00a0 \u00a0 placement=&#8221;right&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 trigger=&#8221;hover&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 v-model=&#8221;isActive&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 :popper-class=&#8221;&#8216;magnifier-popover'&#8221;<\/div>\n<div>\u00a0 \u00a0 &gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 &lt;!&#8211; \u5927\u56fe\u533a\u57df\u5185\u5bb9 &#8211;&gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 &lt;div class=&#8221;enlarged-area&#8221; :style=&#8221;bigContainerStyle&#8221;&gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &lt;img :src=&#8221;bigImg&#8221; alt=&#8221;Enlarged&#8221; :style=&#8221;enlargedImgStyle&#8221; \/&gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 &lt;\/div&gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 &lt;!&#8211; \u5c0f\u56fe\u533a\u57df\u89e6\u53d1\u5668 &#8211;&gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 &lt;template v-slot:reference&gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &lt;div<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 class=&#8221;preview-area&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ref=&#8221;previewArea&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @mousemove=&#8221;handleMouseMove&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @mouseenter=&#8221;activateMagnifier&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @mouseleave=&#8221;deactivateMagnifier&#8221;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &lt;div class=&#8221;img-container&#8221; :style=&#8221;smallContainerStyle&#8221;&gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &lt;img :src=&#8221;smallImg&#8221; alt=&#8221;Preview&#8221; class=&#8221;preview-img&#8221; \/&gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &lt;\/div&gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 &lt;\/div&gt;<\/div>\n<div>\u00a0 \u00a0 \u00a0 &lt;\/template&gt;<\/div>\n<div>\u00a0 \u00a0 &lt;\/el-popover&gt;<\/div>\n<div>\u00a0 &lt;\/div&gt;<\/div>\n<div>&lt;\/template&gt;<\/div>\n<div>&lt;script&gt;<\/div>\n<div>export default {<\/div>\n<div>\u00a0 name: &#8216;ResponsiveMagnifier&#8217;,<\/div>\n<div>\u00a0 props: {<\/div>\n<div>\u00a0 \u00a0 smallImg: String,<\/div>\n<div>\u00a0 \u00a0 bigImg: String,<\/div>\n<div>\u00a0 \u00a0 zoomLevel: { type: Number, default: 2 },<\/div>\n<div>\u00a0 \u00a0 imgSmall: {<\/div>\n<div>\u00a0 \u00a0 \u00a0 type: Object,<\/div>\n<div>\u00a0 \u00a0 \u00a0 default: () =&gt; ({ W: 100, H: 100 }),<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 imgBig: {<\/div>\n<div>\u00a0 \u00a0 \u00a0 type: Object,<\/div>\n<div>\u00a0 \u00a0 \u00a0 default: () =&gt; ({ W: 300, H: 300 }),<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 imgNumber: {<\/div>\n<div>\u00a0 \u00a0 \u00a0 type: Number,<\/div>\n<div>\u00a0 \u00a0 \u00a0 default: 1,<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 imgMoveWidth: {<\/div>\n<div>\u00a0 \u00a0 \u00a0 type: String,<\/div>\n<div>\u00a0 \u00a0 \u00a0 default: &#8217;15&#8217;,<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 },<\/div>\n<div>\u00a0 data() {<\/div>\n<div>\u00a0 \u00a0 return {<\/div>\n<div>\u00a0 \u00a0 \u00a0 isActive: false,<\/div>\n<div>\u00a0 \u00a0 \u00a0 lensPosition: { x: 0, y: 0 },<\/div>\n<div>\u00a0 \u00a0 \u00a0 containerSize: { w: 0, h: 0 },<\/div>\n<div>\u00a0 \u00a0 };<\/div>\n<div>\u00a0 },<\/div>\n<div>\u00a0 computed: {<\/div>\n<div>\u00a0 \u00a0 smallContainerStyle() {<\/div>\n<div>\u00a0 \u00a0 \u00a0 return {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 width: `${this.imgSmall.W}px`,<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 height: `${this.imgSmall.H}px`,<\/div>\n<div>\u00a0 \u00a0 \u00a0 };<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 bigContainerStyle() {<\/div>\n<div>\u00a0 \u00a0 \u00a0 return {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 width: `${this.imgBig.W}px`,<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 height: `${this.imgBig.H}px`,<\/div>\n<div>\u00a0 \u00a0 \u00a0 };<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 imageOffset() {<\/div>\n<div>\u00a0 \u00a0 \u00a0 const { x, y } = this.lensPosition;<\/div>\n<div>\u00a0 \u00a0 \u00a0 const scaleX = this.imgBig.W \/ this.imgSmall.W;<\/div>\n<div>\u00a0 \u00a0 \u00a0 const scaleY = this.imgBig.H \/ this.imgSmall.H;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \/\/ \u8ba1\u7b97\u955c\u5934\u4e2d\u5fc3\u4f4d\u7f6e<\/div>\n<div>\u00a0 \u00a0 \u00a0 const lensCenterX = x + this.imgSmall.W \/ this.zoomLevel \/ 2;<\/div>\n<div>\u00a0 \u00a0 \u00a0 const lensCenterY = y + this.imgSmall.H \/ this.zoomLevel \/ 2;<\/div>\n<div>\u00a0 \u00a0 \u00a0 return {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 x: -(lensCenterX * scaleX &#8211; this.imgBig.W \/ 2),<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 y: -(lensCenterY * scaleY &#8211; this.imgBig.H \/ 2),<\/div>\n<div>\u00a0 \u00a0 \u00a0 };<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 enlargedImgStyle() {<\/div>\n<div>\u00a0 \u00a0 \u00a0 return {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 transform: `translate(${this.imageOffset.x}px, ${this.imageOffset.y}px)`,<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 width: `${this.imgBig.W}px`,<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 height: `${this.imgBig.H}px`,<\/div>\n<div>\u00a0 \u00a0 \u00a0 };<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 },<\/div>\n<div>\u00a0 watch: {<\/div>\n<div>\u00a0 \u00a0 &#8216;imgSmall.W'() {<\/div>\n<div>\u00a0 \u00a0 \u00a0 this.updateContainerSize();<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 &#8216;imgSmall.H'() {<\/div>\n<div>\u00a0 \u00a0 \u00a0 this.updateContainerSize();<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 &#8216;imgBig.W'() {<\/div>\n<div>\u00a0 \u00a0 \u00a0 this.updateContainerSize();<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 &#8216;imgBig.H'() {<\/div>\n<div>\u00a0 \u00a0 \u00a0 this.updateContainerSize();<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 },<\/div>\n<div>\u00a0 mounted() {<\/div>\n<div>\u00a0 \u00a0 this.updateContainerSize();<\/div>\n<div>\u00a0 },<\/div>\n<div>\u00a0 methods: {<\/div>\n<div>\u00a0 \u00a0 updateContainerSize() {<\/div>\n<div>\u00a0 \u00a0 \u00a0 this.$nextTick(() =&gt; {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 this.containerSize = {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 w: this.$refs.previewArea.querySelector(&#8216;.img-container&#8217;).offsetWidth,<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 h: this.$refs.previewArea.querySelector(&#8216;.img-container&#8217;).offsetHeight,<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 };<\/div>\n<div>\u00a0 \u00a0 \u00a0 });<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 activateMagnifier() {<\/div>\n<div>\u00a0 \u00a0 \u00a0 this.isActive = true;<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 deactivateMagnifier() {<\/div>\n<div>\u00a0 \u00a0 \u00a0 this.isActive = false;<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 \u00a0 handleMouseMove(e) {<\/div>\n<div>\u00a0 \u00a0 \u00a0 if (!this.isActive) return;<\/div>\n<div>\u00a0 \u00a0 \u00a0 const container = this.$refs.previewArea.querySelector(&#8216;.img-container&#8217;);<\/div>\n<div>\u00a0 \u00a0 \u00a0 const rect = container.getBoundingClientRect();<\/div>\n<div>\u00a0 \u00a0 \u00a0 let x = e.clientX &#8211; rect.left &#8211; window.pageXOffset;<\/div>\n<div>\u00a0 \u00a0 \u00a0 let y = e.clientY &#8211; rect.top &#8211; window.pageYOffset;<\/div>\n<div>\u00a0 \u00a0 \u00a0 x = Math.max(0, Math.min(x, rect.width));<\/div>\n<div>\u00a0 \u00a0 \u00a0 y = Math.max(0, Math.min(y, rect.height));<\/div>\n<div>\u00a0 \u00a0 \u00a0 const lensWidth = this.imgSmall.W \/ this.zoomLevel;<\/div>\n<div>\u00a0 \u00a0 \u00a0 const lensHeight = this.imgSmall.H \/ this.zoomLevel;<\/div>\n<div>\u00a0 \u00a0 \u00a0 this.lensPosition = {<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 x: Math.min(Math.max(x &#8211; lensWidth \/ 2, 0), rect.width &#8211; lensWidth),<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 y: Math.min(Math.max(y &#8211; lensHeight \/ 2, 0), rect.height &#8211; lensHeight),<\/div>\n<div>\u00a0 \u00a0 \u00a0 };<\/div>\n<div>\u00a0 \u00a0 },<\/div>\n<div>\u00a0 },<\/div>\n<div>};<\/div>\n<div>&lt;\/script&gt;<\/div>\n<div>&lt;style scoped&gt;<\/div>\n<div>.magnifier-system {<\/div>\n<div>\u00a0 display: flex;<\/div>\n<div>\u00a0 align-items: flex-start;<\/div>\n<div>}<\/div>\n<div>.preview-area {<\/div>\n<div>\u00a0 position: relative;<\/div>\n<div>\u00a0 border: 1px solid #e0e0e0;<\/div>\n<div>\u00a0 overflow: hidden;<\/div>\n<div>\u00a0 cursor: crosshair;<\/div>\n<div>}<\/div>\n<div>.img-container {<\/div>\n<div>\u00a0 position: relative;<\/div>\n<div>\u00a0 overflow: hidden;<\/div>\n<div>}<\/div>\n<div>.preview-img {<\/div>\n<div>\u00a0 width: 100%;<\/div>\n<div>\u00a0 height: 100%;<\/div>\n<div>\u00a0 object-fit: contain;<\/div>\n<div>}<\/div>\n<div>.magnifier-lens {<\/div>\n<div>\u00a0 position: absolute;<\/div>\n<div>\u00a0 backdrop-filter: blur(2px);<\/div>\n<div>\u00a0 pointer-events: none;<\/div>\n<div>\u00a0 transition: 0.05s linear;<\/div>\n<div>}<\/div>\n<div>.enlarged-area {<\/div>\n<div>\u00a0 border: 1px solid #e0e0e0;<\/div>\n<div>\u00a0 overflow: hidden;<\/div>\n<div>\u00a0 background: #fff;<\/div>\n<div>}<\/div>\n<div>.enlarged-img {<\/div>\n<div>\u00a0 position: absolute;<\/div>\n<div>\u00a0 width: auto;<\/div>\n<div>\u00a0 height: auto;<\/div>\n<div>\u00a0 min-width: 100%;<\/div>\n<div>\u00a0 min-height: 100%;<\/div>\n<div>\u00a0 transition: transform 0.05s linear;<\/div>\n<div>}<\/div>\n<div>&lt;\/style&gt;<\/div>\n<div>&lt;style&gt;<\/div>\n<div>\/* \u8986\u76d6el-popover\u7684\u6837\u5f0f *\/<\/div>\n<div>.magnifier-popover {<\/div>\n<div>\u00a0 padding: 0 !important;<\/div>\n<div>\u00a0 border: none !important;<\/div>\n<div>\u00a0 \/* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); *\/<\/div>\n<div>}<\/div>\n<div>.magnifier-popover .popper__arrow {<\/div>\n<div>\u00a0 display: none !important;<\/div>\n<div>}<\/div>\n<div>&lt;\/style&gt;<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>&lt;template&gt; \u00a0 &lt;div class=&#8221;&#8230; <a href=\"https:\/\/kzqgy.cn\/index.php\/2025\/06\/26\/%e7%94%b5%e5%95%86%e5%9b%be%e7%89%87%e6%94%be%e5%a4%a7%e9%95%9c%e5%8a%9f%e8%83%bd\/\" class=\"readmore\">Read more<span class=\"screen-reader-text\">\u7535\u5546\u56fe\u7247\u653e\u5927\u955c\u529f\u80fd<\/span><span class=\"fa fa-angle-double-right\" aria-hidden=\"true\"><\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-31","post","type-post","status-publish","format-standard","hentry","category-all","content-layout-excerpt-thumb"],"_links":{"self":[{"href":"https:\/\/kzqgy.cn\/index.php\/wp-json\/wp\/v2\/posts\/31","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kzqgy.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kzqgy.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kzqgy.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kzqgy.cn\/index.php\/wp-json\/wp\/v2\/comments?post=31"}],"version-history":[{"count":3,"href":"https:\/\/kzqgy.cn\/index.php\/wp-json\/wp\/v2\/posts\/31\/revisions"}],"predecessor-version":[{"id":34,"href":"https:\/\/kzqgy.cn\/index.php\/wp-json\/wp\/v2\/posts\/31\/revisions\/34"}],"wp:attachment":[{"href":"https:\/\/kzqgy.cn\/index.php\/wp-json\/wp\/v2\/media?parent=31"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kzqgy.cn\/index.php\/wp-json\/wp\/v2\/categories?post=31"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kzqgy.cn\/index.php\/wp-json\/wp\/v2\/tags?post=31"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}