{"id":326,"date":"2025-09-16T23:41:27","date_gmt":"2025-09-16T15:41:27","guid":{"rendered":"https:\/\/xyz.leexian.com\/?page_id=326"},"modified":"2025-09-23T22:20:42","modified_gmt":"2025-09-23T14:20:42","slug":"contact","status":"publish","type":"page","link":"https:\/\/xyz.leexian.com\/index.php\/contact\/","title":{"rendered":"\u8054\u7cfb\u6211\u4eec"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"326\" class=\"elementor elementor-326\">\n\t\t\t\t<div class=\"elementor-element elementor-element-my3s0x0 e-flex e-con-boxed e-con e-parent\" data-id=\"my3s0x0\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-9050820 e-con-full e-flex e-con e-child\" data-id=\"9050820\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-556be50 elementor-widget__width-initial elementor-widget elementor-widget-hfe-infocard\" data-id=\"556be50\" data-element_type=\"widget\" data-widget_type=\"hfe-infocard.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n\t\t<div class=\"hfe-infocard\">\n\t\t\t\t\t\t\t\t\t<div class=\"hfe-infocard-title-wrap\">\n\t\t\t\t<h2 class=\"hfe-infocard-title elementor-inline-editing\" data-elementor-setting-key=\"infocard_title\" data-elementor-inline-editing-toolbar=\"basic\" >\u60f3\u8981\u4e86\u89e3\u66f4\u591a\uff1f<\/h2>\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"hfe-infocard-text-wrap\">\n\t\t\t\t<div class=\"hfe-infocard-text elementor-inline-editing\" data-elementor-setting-key=\"infocard_description\" data-elementor-inline-editing-toolbar=\"advanced\">\n\t\t\t\t\t\u626b\u63cf\u4e0b\u65b9\u4e8c\u7ef4\u7801\uff0c\u5173\u6ce8\u6211\u4eec\u7684\u516c\u4f17\u53f7\u3002\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-463c79d elementor-widget elementor-widget-image\" data-id=\"463c79d\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/xyz.leexian.com\/wp-content\/uploads\/2025\/09\/\u516c\u4f17\u53f7\u4e8c\u7ef4\u7801-150x150.png\" class=\"attachment-thumbnail size-thumbnail wp-image-355\" alt=\"\" srcset=\"https:\/\/xyz.leexian.com\/wp-content\/uploads\/2025\/09\/\u516c\u4f17\u53f7\u4e8c\u7ef4\u7801-150x150.png 150w, https:\/\/xyz.leexian.com\/wp-content\/uploads\/2025\/09\/\u516c\u4f17\u53f7\u4e8c\u7ef4\u7801-300x300.png 300w, https:\/\/xyz.leexian.com\/wp-content\/uploads\/2025\/09\/\u516c\u4f17\u53f7\u4e8c\u7ef4\u7801.png 400w\" sizes=\"(max-width: 150px) 100vw, 150px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f3567c2 elementor-widget__width-initial elementor-widget-mobile__width-initial elementor-widget elementor-widget-html\" data-id=\"f3567c2\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n  \/* \u786e\u4fdd\u7236\u5bb9\u5668\u6709\u8db3\u591f\u7684\u9ad8\u5ea6\uff0c\u4ee5\u663e\u793a\u753b\u5e03 *\/\r\n  .elementor-widget-container {\r\n    position: relative;\r\n    overflow: hidden;\r\n    height: 100%;\r\n    min-height: 400px;\r\n  }\r\n\r\n  \/* \u753b\u5e03\u7684\u6837\u5f0f\uff0c\u4f7f\u5176\u5c45\u4e2d\u663e\u793a *\/\r\n  #particleCanvas {\r\n    display: block;\r\n    position: absolute;\r\n    top: 50%;\r\n    left: 30%;\r\n    transform: translate(-50%, -50%);\r\n  }\r\n<\/style>\r\n\r\n<canvas id=\"particleCanvas\"><\/canvas>\r\n\r\n<script>\r\n  (function() {\r\n    const canvas = document.getElementById('particleCanvas');\r\n    const ctx = canvas.getContext('2d');\r\n    \r\n    const mouse = {\r\n      x: null,\r\n      y: null,\r\n      radius: 40\r\n    };\r\n\r\n    let particles = [];\r\n    \r\n    canvas.addEventListener('mousemove', (event) => {\r\n      const rect = canvas.getBoundingClientRect();\r\n      mouse.x = event.clientX - rect.left;\r\n      mouse.y = event.clientY - rect.top;\r\n    });\r\n\r\n    canvas.addEventListener('mouseleave', () => {\r\n      mouse.x = null;\r\n      mouse.y = null;\r\n    });\r\n\r\n    function resizeCanvas() {\r\n      const parent = canvas.parentNode;\r\n      canvas.width = parent.offsetWidth;\r\n      canvas.height = parent.offsetHeight;\r\n    }\r\n    window.addEventListener('resize', resizeCanvas);\r\n    resizeCanvas();\r\n\r\n    \/\/ -----------------------------------------------------------\r\n    \/\/ 3D \u900f\u89c6\u548c\u56fa\u5b9a\u65cb\u8f6c\u89d2\u5ea6\r\n    const fl = -170; \r\n    let vpX = canvas.width \/ 2;\r\n    let vpY = canvas.height \/ 2;\r\n    \/\/ \u56fa\u5b9a\u65cb\u8f6c\u89d2\u5ea6\uff08\u4ee5\u5f27\u5ea6\u4e3a\u5355\u4f4d\uff09\r\n    const fixedAngleX = 0.2; \r\n    const fixedAngleY = 0.3; \r\n    const cosX = Math.cos(fixedAngleX);\r\n    const sinX = Math.sin(fixedAngleX);\r\n    const cosY = Math.cos(fixedAngleY);\r\n    const sinY = Math.sin(fixedAngleY);\r\n    \/\/ -----------------------------------------------------------\r\n\r\n    class Particle {\r\n      constructor(originalX, originalY, originalZ = 0, color = '#fff') {\r\n        this.originalX = originalX;\r\n        this.originalY = originalY;\r\n        this.originalZ = originalZ;\r\n        this.x = 0;\r\n        this.y = 0;\r\n        this.scale = 1;\r\n        this.radius = 1;\r\n        this.color = color;\r\n        \r\n        this.friction = 0.9;\r\n        this.ease = 0.05;\r\n        \r\n        this.vx = 0;\r\n        this.vy = 0;\r\n\r\n        const rotatedX = this.originalX * cosY - this.originalZ * sinY;\r\n        const rotatedZ = this.originalZ * cosY + this.originalX * sinY;\r\n        this.finalX = rotatedX;\r\n        this.finalY = this.originalY * cosX - rotatedZ * sinX;\r\n        this.finalZ = rotatedZ * cosX + this.originalY * sinX;\r\n      }\r\n\r\n      update() {\r\n        const scale = fl \/ (fl + this.finalZ);\r\n        this.scale = scale;\r\n        const projectedX = vpX + this.finalX * scale;\r\n        const projectedY = vpY + this.finalY * scale;\r\n\r\n        const dxFromMouse = projectedX - mouse.x;\r\n        const dyFromMouse = projectedY - mouse.y;\r\n        const distance = Math.sqrt(dxFromMouse * dxFromMouse + dyFromMouse * dyFromMouse);\r\n\r\n        if (mouse.x !== null && mouse.y !== null && distance < mouse.radius * this.scale) {\r\n          const forceDirectionX = dxFromMouse \/ distance;\r\n          const forceDirectionY = dyFromMouse \/ distance;\r\n          const force = (mouse.radius * this.scale - distance) \/ (mouse.radius * this.scale);\r\n          const acceleration = 15;\r\n          this.vx += forceDirectionX * force * acceleration;\r\n          this.vy += forceDirectionY * force * acceleration;\r\n        }\r\n\r\n        const dxToTarget = projectedX - this.x;\r\n        const dyToTarget = projectedY - this.y;\r\n        \r\n        this.vx += dxToTarget * this.ease;\r\n        this.vy += dyToTarget * this.ease;\r\n\r\n        this.vx *= this.friction;\r\n        this.vy *= this.friction;\r\n\r\n        this.x += this.vx;\r\n        this.y += this.vy;\r\n      }\r\n\r\n      draw() {\r\n        if (this.scale > 0) {\r\n          ctx.beginPath();\r\n          ctx.arc(this.x, this.y, this.radius * this.scale, 0, Math.PI * 2);\r\n          ctx.fillStyle = this.color;\r\n          ctx.fill();\r\n        }\r\n      }\r\n    }\r\n\r\n    let isAnimating = false;\r\n    function addParticles(points, color) {\r\n      for (const point of points) {\r\n        particles.push(new Particle(point.x, point.y, point.z, color));\r\n      }\r\n      if (particles.length > 0) {\r\n        if (!isAnimating) {\r\n           animate();\r\n           isAnimating = true;\r\n        }\r\n      } else {\r\n        console.error(\"\u672a\u80fd\u4ece\u6e90\u4e2d\u63d0\u53d6\u4efb\u4f55\u50cf\u7d20\u70b9\u3002\");\r\n      }\r\n    }\r\n    \r\n    function animate() {\r\n      vpX = canvas.width \/ 2;\r\n      vpY = canvas.height \/ 2;\r\n\r\n      particles.sort((a, b) => b.finalZ - a.finalZ); \r\n\r\n      ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n      particles.forEach(p => {\r\n        p.update();\r\n        p.draw();\r\n      });\r\n      requestAnimationFrame(animate);\r\n    }\r\n    \r\n    \/\/ -------------------------------------------------------------------\r\n    \/\/ --- \u5b9a\u4e49\u4f60\u7684\u7c92\u5b50\u6e90 ---\r\n    \r\n    const textConfig = {\r\n      text: \"Learn more?\",\r\n      fontFamily: \"LLBlackMatrix\",\r\n      fontSize: 50, \r\n      color: \"#00FFFF\",\r\n      zDepth: 0 \r\n    };\r\n\r\n    const imageConfig = {\r\n      src: 'https:\/\/xyz.leexian.com\/wp-content\/uploads\/2025\/09\/log.png',\r\n      color: \"#FF00FF\",\r\n      logoWidth: 300,\r\n      zDepth: 0\r\n    };\r\n    \r\n    \/\/ --- \u8fd0\u884c\u521d\u59cb\u5316 ---\r\n    const textData = getTextPoints(textConfig.text, textConfig.fontFamily, textConfig.fontSize);\r\n    const textPoints = textData.points;\r\n    const textWidth = textData.width;\r\n    const textHeight = textData.height;\r\n\r\n    const logoImage = new Image();\r\n    logoImage.crossOrigin = \"Anonymous\";\r\n    logoImage.src = imageConfig.src;\r\n    \r\n    logoImage.onload = () => {\r\n      const imageData = getImagePoints(logoImage, imageConfig.logoWidth);\r\n      const imagePoints = imageData.points;\r\n      const imageWidth = imageData.width;\r\n      const imageHeight = imageData.height;\r\n      \r\n      const spacing = 10;\r\n      const totalCombinedWidth = textWidth + spacing + imageWidth;\r\n      const startOffsetX = -totalCombinedWidth \/ 2;\r\n      const maxCombinedHeight = Math.max(textHeight, imageHeight);\r\n\r\n      const finalTextPoints = textPoints.map(p => ({\r\n        x: p.x + startOffsetX + textWidth \/ 2,\r\n        y: p.y + (maxCombinedHeight \/ 2 - textHeight \/ 2),\r\n        z: textConfig.zDepth\r\n      }));\r\n      addParticles(finalTextPoints, textConfig.color);\r\n\r\n      const finalImagePoints = imagePoints.map(p => ({\r\n        x: p.x + startOffsetX + textWidth + spacing + imageWidth \/ 2,\r\n        y: p.y + (maxCombinedHeight \/ 2 - imageHeight \/ 2),\r\n        z: imageConfig.zDepth\r\n      }));\r\n      addParticles(finalImagePoints, imageConfig.color);\r\n    };\r\n    logoImage.onerror = () => {\r\n      console.error(\"\u56fe\u7247\u52a0\u8f7d\u5931\u8d25\u3002\");\r\n      const totalWidth = textWidth;\r\n      const startOffsetX = -totalWidth \/ 2;\r\n      const maxCombinedHeight = textHeight;\r\n      const finalTextPoints = textPoints.map(p => ({\r\n        x: p.x + startOffsetX + textWidth \/ 2,\r\n        y: p.y + (maxCombinedHeight \/ 2 - textHeight \/ 2),\r\n        z: textConfig.zDepth\r\n      }));\r\n      addParticles(finalTextPoints, textConfig.color);\r\n    };\r\n\r\n    \/\/ -------------------------------------------------------------------\r\n    \/\/ --- \u8f85\u52a9\u51fd\u6570 ---\r\n\r\n    function getTextPoints(text, font, size) {\r\n      const textCanvas = document.createElement('canvas');\r\n      const textContext = textCanvas.getContext('2d');\r\n      textContext.font = `${size}px ${font}`;\r\n      const textMetrics = textContext.measureText(text);\r\n      \r\n      textCanvas.width = textMetrics.width;\r\n      textCanvas.height = size * 1.5;\r\n      textContext.font = `${size}px ${font}`;\r\n      textContext.fillStyle = '#fff';\r\n      textContext.fillText(text, 0, size);\r\n\r\n      const data = textContext.getImageData(0, 0, textCanvas.width, textCanvas.height);\r\n      const points = [];\r\n\r\n      for (let y = 0; y < data.height; y++) {\r\n        for (let x = 0; x < data.width; x++) {\r\n          const index = (y * 4 * data.width) + (x * 4);\r\n          if (data.data[index + 3] > 0) {\r\n            points.push({ x: x - textCanvas.width \/ 2, y: y - textCanvas.height \/ 2 });\r\n          }\r\n        }\r\n      }\r\n      return { points: points, width: textCanvas.width, height: textCanvas.height };\r\n    }\r\n\r\n    function getImagePoints(image, baseWidth) {\r\n      const tempCanvas = document.createElement('canvas');\r\n      const tempCtx = tempCanvas.getContext('2d');\r\n      \r\n      const logoWidth = baseWidth;\r\n      const logoHeight = image.naturalHeight * (logoWidth \/ image.naturalWidth);\r\n      \r\n      tempCanvas.width = logoWidth;\r\n      tempCanvas.height = logoHeight;\r\n      tempCtx.drawImage(image, 0, 0, logoWidth, logoHeight);\r\n\r\n      const imageData = tempCtx.getImageData(0, 0, logoWidth, logoHeight);\r\n      const data = imageData.data;\r\n      const imagePoints = [];\r\n      const step = 2; \/\/ \u8c03\u6574\u4e3a 2\uff0c\u589e\u52a0\u7c92\u5b50\u5bc6\u5ea6\r\n      \r\n      for (let y = 0; y < logoHeight; y += step) {\r\n        for (let x = 0; x < logoWidth; x += step) {\r\n          const index = (y * logoWidth + x) * 4;\r\n          if (data[index + 3] > 128) {\r\n            imagePoints.push({ x: x - logoWidth \/ 2, y: y - logoHeight \/ 2 });\r\n          }\r\n        }\r\n      }\r\n      return { points: imagePoints, width: logoWidth, height: logoHeight };\r\n    }\r\n  })();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u60f3\u8981\u4e86\u89e3\u66f4\u591a\uff1f \u626b\u63cf\u4e0b\u65b9\u4e8c\u7ef4\u7801\uff0c\u5173\u6ce8\u6211\u4eec [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-326","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/xyz.leexian.com\/index.php\/wp-json\/wp\/v2\/pages\/326","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xyz.leexian.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/xyz.leexian.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/xyz.leexian.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/xyz.leexian.com\/index.php\/wp-json\/wp\/v2\/comments?post=326"}],"version-history":[{"count":319,"href":"https:\/\/xyz.leexian.com\/index.php\/wp-json\/wp\/v2\/pages\/326\/revisions"}],"predecessor-version":[{"id":759,"href":"https:\/\/xyz.leexian.com\/index.php\/wp-json\/wp\/v2\/pages\/326\/revisions\/759"}],"wp:attachment":[{"href":"https:\/\/xyz.leexian.com\/index.php\/wp-json\/wp\/v2\/media?parent=326"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}