javascript - 让 div 留在视图内
问题描述
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Title</title>
</head>
<body>
<div class="videoPop">
<div class="point"></div>
<iframe width="440" height="245"
src="https://www.youtube.com/embed/fj984wXo3O8?autoplay=1&controls=0&disablekb=1&modestbranding=1&rel=0&loop=1"
frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope">
</iframe>
</div>
<script>
window.onload = function () {
var bsDiv = document.querySelector(".videoPop");
var x, y;
window.addEventListener("mousemove", function (event) {
x = event.clientX;//-217
y = event.clientY - 165;//-280
if (typeof x !== "undefined") {
bsDiv.style.left = x + "px";
bsDiv.style.top = y + "px";
}
}, false);
}
</script>
<style>
.videoPop {
background-color: #3b3b3b;
border-radius: 0px;
position: fixed;
border-radius: 10px;
width: 440px;
height: 245px;
z-index: 200;
border: 5px solid #3b3b3b;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.videoPop:after {
content: '';
position: absolute;
top: 100%;
left: 55%;
margin-left: -55px;
width: 0;
height: 0;
border-top: solid 30px #3b3b3b;
border-left: solid 30px transparent;
border-right: solid 30px transparent;
}
.videoPopLoading {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 50px;
}
iframe {
border-radius: 5px;
}
</style>
</body>
</html>
播放视频时,带有 youtube 视频的 div 会跟随光标。但我不希望视频超过窗口 innerHeight 和 innerWidth。我希望它可能坚持不出去,但仍然跟随光标,直到它必须出去。
纯 JS 也没有 JQuery 或其他库
解决方案
您可以像这样计算最大/最小 x 和 y 值:
window.onload = function() {
var bsDiv = document.querySelector(".videoPop");
const divWidth = bsDiv.clientWidth;
const divHeight = bsDiv.clientHeight;
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
var x, y;
window.addEventListener("mousemove", function(event) {
x = Math.max(event.clientX, divWidth / 2); //-217
y = Math.max(event.clientY - 165, divHeight / 2); //-280
x = Math.min(x, windowWidth - divWidth / 2);
y = Math.min(y, windowHeight - divHeight / 2);
if (typeof x !== "undefined") {
bsDiv.style.left = x + "px";
bsDiv.style.top = y + "px";
}
}, false);
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Title</title>
</head>
<body>
<div class="videoPop">
<div class="point"></div>
<iframe width="440" height="245" src="https://www.youtube.com/embed/fj984wXo3O8?autoplay=1&controls=0&disablekb=1&modestbranding=1&rel=0&loop=1" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope">
</iframe>
</div>
<style>
.videoPop {
background-color: #3b3b3b;
border-radius: 0px;
position: fixed;
border-radius: 10px;
width: 440px;
height: 245px;
z-index: 200;
border: 5px solid #3b3b3b;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.videoPop:after {
content: '';
position: absolute;
top: 100%;
left: 55%;
margin-left: -55px;
width: 0;
height: 0;
border-top: solid 30px #3b3b3b;
border-left: solid 30px transparent;
border-right: solid 30px transparent;
}
.videoPopLoading {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 50px;
}
iframe {
border-radius: 5px;
}
</style>
</body>
</html>
推荐阅读
- python - return a list as a unique list using tuples
- asp.net-core - X.PagedList, manual Paging and a pre-existing webapi for data only advance 1 record at a time
- java - 如何在多行中打印 JOptionPane 中的数组
- circuit-sdk - Set Bot presence using Node-red
- php - 对象包含太多列
- javascript - 如何制作将文本添加到 div 的可点击按钮
- vespa - 按“vespa.ai”中的日期属性对结果集进行排序
- c++ - 如何实现 WTSRegisterSessionNotification 功能
- jquery - 有没有办法在浏览器中使用 require 函数而不使用 Browserify、RequireJs 或类似的包
- python - 是否可以检查列表中的项目是否存在于变量中?