javascript - 将鼠标悬停在嵌套在其中的 div 上时更改正文背景
问题描述
我试图操纵这个论坛上小提琴中发生的事情,但我遇到了一些麻烦,我不确定我哪里出错了。
我在这里创建了我自己的笔,其中包含我网站上的精简版本。
基本上我想要做的是,每当您将鼠标悬停在图像或灰色框上时,主体背景颜色都会改变。(理想情况下是淡入/淡出类型的交互,但如果淡入淡出部分可以通过 CSS 完成,我可以做到)。
我尝试将 getElementById(来自示例)更改为getElementsByClassName,因为我有该类的多个实例,但这似乎不起作用。我已经在 getElementById 中添加了它,它在应用的地方(在图像上)有效,但我认为这不是最佳实践,因为我将拥有该类的多个实例。
免责声明:我对 JS 了解不多,所以如果有更好的方法可以做到这一点,我很乐意尝试一下!
我只在帖子中添加了 JS 以保持内容简洁。代码笔中的 HTML 和 CSS。
$(document).ready(function(){
window.onload = function(){
var block1 = document.getElementById('hover-color1');
var body = document.body;
block1.onmouseover = function() {
body.className = 'hover-color1';
}
block1.onmouseout = function() {
body.className = '';
}
};
});
解决方案
您正在寻找背景颜色的过渡。在你的 body CSS 中添加 background-color 的过渡,然后在你的悬停中更改 body,设置新的背景颜色,过渡将触发并使其从一种颜色动画到另一种颜色。
Javascript:
- 使用节点选择器获取类元素以创建 nodeList -> querySelectorAll 返回 nodeList
- 遍历列表以获取 event.target
- 使用 mouseover 和 mouseout 事件使用 classList.add/remove 添加/删除类
const block1 = document.querySelectorAll('.hover-color1')
block1.forEach(img => {
img.addEventListener('mouseover', e => {
document.body.classList.add('hover-color1')
})
img.addEventListener('mouseout', e => {
document.body.classList.remove('hover-color1')
})
})
CSS:为背景上的 body 添加过渡到 CSS,然后在悬停时,背景更改将从 body 中设置的背景色过渡到 body.hoverElement 背景色。
body {
font-family: 'IBM Plex Sans', sans-serif;
color: #1a1b1f;
font-size: 16px;
line-height: 28px;
font-weight: 400;
-webkit-transition: background-color 1s linear;
-moz-transition: background-color 1s linear;
-o-transition: background-color 1s linear;
-ms-transition: background-color 1s linear;
transition: background-color 1s linear;
}
body.hover-color1 {
background-color: red;
}
$(document).ready(function() {
window.onload = function() {
const block1 = document.querySelectorAll('.hover-color1')
block1.forEach(img => {
img.addEventListener('mouseover', e => {
document.body.classList.add('hover-color1')
})
img.addEventListener('mouseout', e => {
document.body.classList.remove('hover-color1')
})
})
}
})
.w-layout-grid {
display: grid;
grid-auto-columns: 1fr;
grid-template-columns: 1fr 1fr;
grid-template-rows: auto auto;
grid-row-gap: 16px;
grid-column-gap: 16px;
}
body {
font-family: 'IBM Plex Sans', sans-serif;
color: #1a1b1f;
font-size: 16px;
line-height: 28px;
font-weight: 400;
-webkit-transition: background-color .5s linear;
-moz-transition: background-color .5s linear;
-o-transition: background-color .5s linear;
-ms-transition: background-color .5s linear;
transition: background-color .5s linear;
}
body.hover-color1 {
background-color: red;
}
.section {
position: relative;
z-index: 10;
width: 100%;
height: auto;
margin-right: 0px;
margin-left: 0px;
padding-right: 30px;
padding-left: 30px;
}
img {
display: block;
max-width: 1200px;
}
.container {
width: 100%;
max-width: 1140px;
margin-right: auto;
margin-left: auto;
}
.paragraph {
margin-bottom: 20px;
border-top: 1px none #525254;
font-family: 'IBM Plex Sans', sans-serif;
color: #525254;
font-size: 16px;
line-height: 1.5em;
letter-spacing: 0.3px;
}
.relative-block {
position: relative;
}
.heading-3.display-mono {
font-family: 'IBM Plex Mono', sans-serif;
color: #1a1b1f;
font-size: 32px;
letter-spacing: 1.1px;
}
.heading-4.display-h6 {
font-family: 'IBM Plex Sans', sans-serif;
font-size: 20px;
line-height: 1.5em;
font-weight: 400;
}
.link {
display: inline-block;
font-family: 'IBM Plex Mono', sans-serif;
line-height: 1.5em;
text-decoration: none;
}
.portfolio-block-left {
position: relative;
max-width: 1440px;
margin: 50px auto;
}
.portfolio-grid-left {
position: relative;
grid-column-gap: 25px;
grid-row-gap: 25px;
-ms-grid-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
-ms-grid-rows: auto auto auto auto;
grid-template-rows: auto auto auto auto;
}
.portfolio-image.fade-in-1st {
position: relative;
z-index: 1;
}
.portfolio-title {
position: relative;
z-index: 2;
max-width: 570px;
margin-right: 0px;
margin-left: 0px;
padding: 25px;
background-color: #ccc;
}
.portfolio-block-right {
position: relative;
max-width: 1440px;
margin: 50px auto;
}
.portfolio-grid-right {
position: relative;
grid-column-gap: 25px;
grid-row-gap: 25px;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
grid-template-rows: auto auto auto auto;
}
.max-1440 {
width: 100%;
max-width: 1440px;
margin-right: auto;
margin-left: auto;
}
#w-node-link-block-825bf526 {
grid-column-end: 7;
grid-column-start: 1;
grid-row-end: 4;
grid-row-start: 1;
}
#w-node-eb6e1164-1454-9dc3-9597-76f59d0186bb-825bf526 {
grid-column-end: 8;
grid-column-start: 4;
grid-row-end: 5;
grid-row-start: 3;
align-self: end;
justify-self: end;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="padding-50px section">
<div class="portfolio-block-left">
<div class="w-layout-grid portfolio-grid-left">
<a id="w-node-link-block-825bf526" href="#" class="portfolio-image fade-in-1st w-inline-block">
<img class="hover-color1" src="https://source.unsplash.com/random/1200x400" alt=""></a>
<div id="w-node-eb6e1164-1454-9dc3-9597-76f59d0186bb-825bf526" class="portfolio-title hover-color1">
<h3 class="heading-3 display-mono">Title</h3>
<h4 class="heading-4 display-h6">Secondary Title</h4><a href="#" class="link">View Project</a>
</div>
</div>
</div>
</div>
推荐阅读
- php - 谷歌分析电子商务来源
- python - Pyspark 数据处理为矢量化格式
- jquery - 使用 jquery rails 刷新页面
- python - 返回不一致值的逻辑回归成本函数
- python - Python Flask 应用程序上的 AWS Beanstalk 错误 504 超时
- c# - 在 discord.net C# 中记录已删除的消息
- python - 如何通过两个独立的列对矩阵进行排序?
- php - 如何为添加到左侧类别的导航菜单创建复选框输入
- php - Laravel api 控制器 - 如何在发送 JSON 响应之前从数据库查询中过滤掉空(“假”)数据?
- runtime-error - 检测结构或哈希表何时被修改或损坏