[英]CSS/JS: Hover over element highlights another element
我正在创建一个可以有n rows
并分为两个视图的网格:leftChild和rightChild。 leftChild与rightChild的行数相同,但leftChild保留在原处。 与rightChild的唯一区别是它可以水平滚动。 当我将鼠标悬停在leftChild或rightChild元素上时,我想添加某种悬停效果……这很容易,但是我想要做的是在整个行中添加悬停效果。 因此,如果将鼠标悬停在leftChild的第三行上,则要突出显示rightChild的第三行。
现在,理想情况下,我希望有一个类似于this的完整CSS解决方案,但这是不可能的,因为我的行不会紧跟彼此。 我试图考虑解决此问题的另一种方法,但是使用直接CSS似乎不可能。
输入JavaScript。 我在想下一步是将JavaScript与CSS结合起来。 我可以将悬停效果添加到一行,然后使用JavaScript将悬停类添加到另一个孩子的相应行中。 使用jQuery相当简单,但是我正在寻找一种本机JavaScript方法。
我正在考虑的主要方法是在每个行类元素上添加mouseenter
和mouseleave
。 我真的不喜欢这种方法,因为那时候我在每个行元素上设置了2个事件侦听器……这似乎效率不高。 无论如何,当您输入时,您将获取要悬停的行的行号,然后将悬停类添加到所有这些行号元素中。 离开时,只需找到所有带有悬停的元素,然后相应地将其删除。 相应的代码如下:
的HTML
<body onload="loaded()">
<div id="parent">
<div id="leftChild">
<div>left child</div>
<div class="row row1">some content</div>
<div class="row row2">other content</div>
<div class="row row3">more content</div>
</div>
<div id="rightChild">
<div>right child</div>
<div class="row row1">
<span class="col1">column 1 content</span>
<span class="col2">column 2 content</span>
<span class="col3">column 3 content</span>
<span class="col4">column 4 content</span>
<span class="col5">column 5 content some really long content to trigger scrolling just for the purpose of this example</span>
</div>
<div class="row row2">
<span class="col1">column 1 content</span>
<span class="col2">column 2 content</span>
<span class="col3">column 3 content</span>
<span class="col4">column 4 content</span>
<span class="col5">column 5 content some really long content to trigger scrolling just for the purpose of this example</span>
</div>
<div class="row row3">
<span class="col1">column 1 content</span>
<span class="col2">column 2 content</span>
<span class="col3">column 3 content</span>
<span class="col4">column 4 content</span>
<span class="col5">column 5 content some really long content to trigger scrolling just for the purpose of this example</span>
</div>
</div>
</div>
</body>
JS
function loaded() {
/*var parent = document.getElementById('parent');
parent.onmouseenter = function(event) {
console.log(event.target);
};
parent.onmouseleave = function(event) {
console.log(event.target);
};*/
var rows = document.getElementsByClassName('row');
for (var i = 0; i < rows.length; i++) {
rows[i].onmouseenter = function(event) {
var splits = event.target.className.split(" ");
var elems = document.getElementsByClassName(splits[splits.length - 1]);
for (var j = 0; j < elems.length; j++) {
elems[j].className += " hover";
}
};
rows[i].onmouseleave = function(event) {
var hovers = document.getElementsByClassName('hover');
var len = hovers.length;
for (var j = 0; j < len; j++) {
hovers[0].className = hovers[0].className.replace(/\shover(\s|$)/, '');
}
};
}
}
的CSS
.row:hover, .hover {
background-color: lightblue;
}
.row {
height: 50px;
padding: 5px;
white-space: nowrap;
}
.row > span {
display: inline-block;
border: 5px solid black;
}
#leftChild, #rightChild {
float: left;
}
#rightChild {
width: 300px;
overflow: auto;
}
#rightChild .row {
display: inline-block;
}
jsFiddle : 这里
所以我想知道几件事。
我知道我在这里要问很多问题,但是我讨厌问多个问题,特别是如果我不得不重复自己的话。 我将不胜感激。 谢谢!
this
并检查className
以在新规则后附加到它 我得到这个:通过jquery,但是为了测试,我删除了类.row
并保留了编号
$("[class*='row']").hover(
function () {
$('head').append('<style class="'+this.className+'" rel="stylesheet" > .'+this.className+' {background-color:lightblue;} </style>');
$(this).mouseleave(function() { $('style.'+this.className).remove();});
});
基于这个jsPerf ,我所拥有的直接JavaScript方法是最快的,混合方法紧随其后 -我的意思是真的很接近本机JS方法-并且(几乎完全是)jQuery方法已死了最后-与其他两个相比确实很慢。
所有这些都可以在jsFiddle中看到。
JS
// Native JS approach... fastest (according to my jsPerf http://jsperf.com/removeclass-vs-native-js-remove-class/2)
function loaded() {
var rows = document.getElementsByClassName('row');
for (var i = 0; i < rows.length; i++) {
rows[i].onmouseenter = function(event) {
var row = this.className.match(/row-[\d]+/);
var elems = document.getElementsByClassName(row[0]);
for (var j = 0; j < elems.length; j++) {
elems[j].className += " hover";
}
};
rows[i].onmouseleave = function(event) {
var hovers = document.getElementsByClassName('hover');
var len = hovers.length;
for (var j = 0; j < len; j++) {
hovers[0].className = hovers[0].className.replace(/\shover(\s|$)/, '');
}
};
}
}
// jQuery approach (slowest)
/*$(document).ready(function() {
$('.row').on('mouseenter', function(event) {
var row = this.className.match(/row-[\d]+/);
$('.' + row).addClass('hover');
});
$('.row').on('mouseleave', function(event) {
$('.hover').removeClass('hover');
});
});*/
// Hybrid approach (basically as fast as native JS approach)
/*$(document).ready(function() {
var rows = document.getElementsByClassName('row');
for (var i = 0; i < rows.length; i++) {
rows[i].onmouseenter = function(event) {
var row = this.className.match(/row-[\d]+/);
$('.' + row[0]).addClass('hover');
};
rows[i].onmouseleave = function(event) {
$('.hover').removeClass('hover');
};
}
});*/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.