function centerPopup() { var windowWidth = window.innerWidth * 0.8; // 按照弹出窗口宽度的80%计算 var windowHeight = window.innerHeight * 0.8; // 按照弹出窗口高度的80%计算 var popupWidth = popup.offsetWidth; var popupHeight = popup.offsetHeight; var scrollTop = window.pageYOffset || document.documentElement.scrollTop; var offsetLeft = (windowWidth - popupWidth) / 2; var offsetTop = (windowHeight - popupHeight) / 2 + scrollTop; // 设置弹出窗口的位置 popup.style.left = offsetLeft + "px"; popup.style.top = offsetTop + "px"; } // 设置悬浮窗样式 function setPopupStyle() { var windowWidth = window.innerWidth * 0.8; // 按照弹出窗口宽度的80%计算 var windowHeight = window.innerHeight * 0.8; // 按照弹出窗口高度的80%计算 popup.style.position = "fixed"; popup.style.width = windowWidth + "px"; popup.style.height = windowHeight + "px"; popup.style.backgroundColor = "transparent"; popup.style.zIndex = "9999"; } // 在设置图片加载完成后调用居中弹出窗口和设置悬浮窗样式的函数 popupImg.onload = function() { // 设置图片缩放比例 var imgWidth = popupImg.width; var imgHeight = popupImg.height; var widthScale = window.innerWidth * 0.8 / imgWidth; var heightScale = window.innerHeight * 0.8 / imgHeight; scale = Math.min(widthScale, heightScale); popupImg.style.transform = scale(${scale}); // 设置弹出窗口样式和居中位置 setPopupStyle(); centerPopup(); // 显示图片和悬浮窗 popupImg.style.display = "block"; popup.style.display = "block"; } // 添加图片到悬浮窗 popup.appendChild(popupImg); document.body.appendChild(popup); // 初始化居中弹出窗口 centerPopup(); // 添加滚动和调整窗口大小事件监听器 window.addEventListener("scroll", centerPopup); window.addEventListener("resize", centerPopup); // 点击事件监听器,点击其他区域时隐藏弹出窗口 popup.onclick = function () { popup.style.display = "none"; }; // 移除滚动和调整窗口大小事件监听器 function removeListeners() { window.removeEventListener("scroll", centerPopup); window.removeEventListener("resize", centerPopup); } // 在窗口关闭时移除事件监听器 window.onbeforeunload = function () { removeListeners(); }; };根据你提供的代码,我修改后任然存在行数过多时,悬浮窗显示后靠近页面底部,无法显示完整图片在当前页面,并且我需要在点击放大图片后无法再此点击当前放大图片,等我还原取消悬浮窗后才可以再次点击图片放大,我代码存在什么问题
时间: 2024-04-14 18:27:25 浏览: 108
根据您提供的代码,我注意到有几个问题可能导致您遇到的问题:
1. 悬浮窗显示在页面底部:这可能是由于计算偏移量时没有考虑到页面滚动的原因。您可以尝试将`scrollTop`的计算方式修改为`scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;`,以确保在不同浏览器中都能正确获取滚动的偏移量。
2. 图片无法再次点击放大:这可能是由于点击事件监听器没有正确设置。目前的代码中,点击悬浮窗时会隐藏弹出窗口,但没有阻止事件冒泡到图片上。您可以尝试添加以下代码来阻止点击事件冒泡:
```javascript
popupImg.onclick = function (event) {
event.stopPropagation();
};
```
这样点击图片时就不会再隐藏弹出窗口了。
希望这些修改可以解决您遇到的问题。如果问题仍然存在,请提供更多的细节,以便我能够更准确地帮助您解决问题。
相关问题
function showPopup(imageSrc) { var popup = document.createElement("div"); var popupImg = document.createElement("img"); var scale = 1; var isDragging = false; var startX, startY, translateX, translateY; // 设置弹出窗口中的图片 popupImg.src = imageSrc; popupImg.style.transform = scale(${scale}); // 加载完成后计算图片的宽高比例 popupImg.onload = function() { var imgWidth = popupImg.width; var imgHeight = popupImg.height; // 计算图片的缩放比例 var windowWidth = window.innerWidth * 0.8; // 按照弹出窗口宽度的80%计算 var windowHeight = window.innerHeight * 0.8; // 按照弹出窗口高度的80%计算 var widthScale = windowWidth / imgWidth; var heightScale = windowHeight / imgHeight; scale = Math.min(widthScale, heightScale); // 设置弹出窗口中的图片样式 popupImg.style.transform = `scale(${scale})`; popupImg.style.display = "block"; popupImg.style.margin = "auto"; function centerPopup() { var windowWidth = window.innerWidth * 0.8; // 按照弹出窗口宽度的80%计算 var windowHeight = window.innerHeight * 0.8; // 按照弹出窗口高度的80%计算 var popupRect = popup.getBoundingClientRect(); var popupWidth = popupRect.width; var popupHeight = popupRect.height; scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop; var offsetLeft = (windowWidth - popupWidth * scale) / 2; var offsetTop = (windowHeight - popupHeight * scale) / 2 + scrollTop; // 设置弹出窗口的位置 popup.style.left = offsetLeft + "px"; popup.style.top = offsetTop + "px"; } // 设置悬浮窗样式 function setPopupStyle() { var windowWidth = window.innerWidth * 0.8; // 按照弹出窗口宽度的80%计算 var windowHeight = window.innerHeight * 0.8; // 按照弹出窗口高度的80%计算 popup.style.position = "fixed"; popup.style.width = windowWidth + "px"; popup.style.height = windowHeight + "px"; popup.style.backgroundColor = "transparent"; popup.style.zIndex = "9999"; popup.onclick = function (event) { if (event.target === popup) { popup.style.display = "none"; } }; } // 在设置图片加载完成后调用居中弹出窗口和设置悬浮窗样式的函数 popupImg.onload = function() { // 设置图片缩放比例 var imgWidth = popupImg.width; var imgHeight = popupImg.height; var widthScale = window.innerWidth * 0.8 / imgWidth; var heightScale = window.innerHeight * 0.8 / imgHeight; scale = Math.min(widthScale, heightScale); popupImg.style.transform = scale(${scale}); // 设置弹出窗口样式和居中位置 setPopupStyle(); centerPopup(); // 显示图片和悬浮窗 popupImg.style.display = "block"; popup.style.display = "block"; } // 添加图片到悬浮窗 popup.appendChild(popupImg); document.body.appendChild(popup);这段代码可以怎么优化
这段代码可以进行一些优化,主要包括以下几个方面:
1. 将重复使用的代码片段提取为函数:可以将计算弹出窗口位置的代码和设置弹出窗口样式的代码提取为独立的函数,以提高代码的可读性和可维护性。
```javascript
function centerPopup() {
// 计算弹出窗口位置的代码
}
function setPopupStyle() {
// 设置弹出窗口样式的代码
}
```
2. 使用事件委托来处理点击事件:可以使用事件委托的方式,将点击事件处理函数绑定在父元素上,避免在每次点击时都添加事件处理函数。
```javascript
popup.onclick = function(event) {
if (event.target === popup) {
popup.style.display = "none";
}
};
```
可以改为:
```javascript
document.addEventListener("click", function(event) {
if (event.target === popup) {
popup.style.display = "none";
}
});
```
3. 使用字符串模板来简化代码:可以使用字符串模板(template string)来简化字符串拼接的过程,使代码更易读。
```javascript
popupImg.style.transform = `scale(${scale})`;
```
4. 将全局变量改为局部变量:在适当的地方将全局变量改为局部变量,以避免全局作用域的污染。
```javascript
var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
```
以上是一些可以对代码进行优化的建议,具体的优化方式可以根据您的实际需求和代码结构进行调整。
// 设置弹出窗口中的图片 popupImg.src = imageSrc; popupImg.style.transform = `scale(${scale})`; // 加载完成后计算图片的宽高比例 popupImg.onload = function() { var imgWidth = popupImg.width; var imgHeight = popupImg.height; // 计算图片的缩放比例 var windowWidth = window.innerWidth * 0.8; // 按照弹出窗口宽度的80%计算 var windowHeight = window.innerHeight * 0.8; // 按照弹出窗口高度的80%计算 var widthScale = windowWidth / imgWidth; var heightScale = windowHeight / imgHeight; scale = Math.min(widthScale, heightScale); // 设置弹出窗口中的图片样式 popupImg.style.transform = `scale(${scale})`; popupImg.style.display = "block"; popupImg.style.margin = "auto"; // 居中弹出窗口 function centerPopup() { var popupWidth = popup.offsetWidth; var popupHeight = popup.offsetHeight; var scrollTop = window.pageYOffset || document.documentElement.scrollTop; var offsetLeft = (windowWidth - popupWidth) / 2; var offsetTop = (windowHeight - popupHeight) / 2 + scrollTop; // 设置弹出窗口的位置 popup.style.left = offsetLeft + "px"; popup.style.top = offsetTop + "px"; } // 设置悬浮窗样式 popup.style.position = "fixed"; popup.style.top = "10%"; popup.style.left = "10%"; popup.style.width = windowWidth + "px"; popup.style.height = windowHeight + "px"; popup.style.backgroundColor = "transparent"; popup.style.zIndex = "9999";这是我的代码,经过上面设置后,当表格行数过多时任然会存在放大图片的悬浮窗未在屏幕中心,靠近页面底部,且只显示一半图片
非常抱歉,我之前给出的解决方案可能不完全适用于你的情况。根据你提供的代码,我注意到你在设置弹出窗口样式时,将固定的 `top` 和 `left` 值应用于悬浮窗,这可能导致在表格行数过多时出现位置偏移的问题。
为了解决这个问题,你可以将固定的 `top` 和 `left` 值改为动态计算,以确保悬浮窗总是居中显示。以下是修改的代码示例:
```javascript
// 居中弹出窗口
function centerPopup() {
var windowWidth = window.innerWidth * 0.8; // 按照弹出窗口宽度的80%计算
var windowHeight = window.innerHeight * 0.8; // 按照弹出窗口高度的80%计算
var popupWidth = popup.offsetWidth;
var popupHeight = popup.offsetHeight;
var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
var offsetLeft = (windowWidth - popupWidth) / 2;
var offsetTop = (windowHeight - popupHeight) / 2 + scrollTop;
// 设置弹出窗口的位置
popup.style.left = offsetLeft + "px";
popup.style.top = offsetTop + "px";
}
// 设置悬浮窗样式
function setPopupStyle() {
var windowWidth = window.innerWidth * 0.8; // 按照弹出窗口宽度的80%计算
var windowHeight = window.innerHeight * 0.8; // 按照弹出窗口高度的80%计算
popup.style.position = "fixed";
popup.style.width = windowWidth + "px";
popup.style.height = windowHeight + "px";
popup.style.backgroundColor = "transparent";
popup.style.zIndex = "9999";
}
// 在设置图片加载完成后调用居中弹出窗口和设置悬浮窗样式的函数
popupImg.onload = function() {
// 设置图片缩放比例
var imgWidth = popupImg.width;
var imgHeight = popupImg.height;
var widthScale = window.innerWidth * 0.8 / imgWidth;
var heightScale = window.innerHeight * 0.8 / imgHeight;
scale = Math.min(widthScale, heightScale);
popupImg.style.transform = `scale(${scale})`;
// 设置弹出窗口样式和居中位置
setPopupStyle();
centerPopup();
// 显示图片和悬浮窗
popupImg.style.display = "block";
popup.style.display = "block";
}
```
通过以上修改,我们在加载图片完成后调用了 `setPopupStyle()` 和 `centerPopup()` 函数来设置弹出窗口的样式和位置。这样,在表格行数过多时,悬浮窗应该能够在屏幕中心显示,并且图片能够完整展示。请尝试更新代码并再次测试。如果问题仍然存在,请提供更多详细信息,以便我能够更好地帮助你解决问题。
阅读全文