изменение css с помощью js
Добрый день!
Имеется следующий кусок HTML разметки:
<div id="underheader">
<div class="main_center over">
<ul>
<li>
<div class="thumb">
<a rel="link" href="#"></a>
<div class="overlay_corner"></div>
<div class="overlay_title">Современная архитектура и красивый дизайн дома</div>
<div class="overlay_like">4</div>
<img src="content/1.jpg" alt=""/>
</div>
<div class="desc">
<p class="date">Июнь 13, 2014</p>
<p class="stats"><span class="comment">2</span><span class="like">4</span></p>
<h1><a href="#" title="">Современная архитектура и красивый дизайн дома</a></h1>
</div>
</li>
</ul>
</div>
</div>
DIVы с классами "overlay_title", "overlay_like" и A (c rel=link) выполняют роль оверлэев и накладываются с помощью относительного позиционирования на картинку, следующую после них в структуре DOM-дерева. В CSS-файле данным DIVам указан visibility со значением hidden. Задача простая до нельзя - нужно на событие наведения по гиперссылке (которая имеет атрибут rel со значение link) повесить анонимную функцию, которая бы переключала у этих двух DIVов свойство visibility на visible, при onmouseout сново на hidden. Имеем следующий сценарий:
window.onload = function () {
//UNDERHEADER
var underheader = gi("underheader"), //underheader
a = getNode(underheader, "A", "rel", "link"), //выборка области клика
title = getNode(underheader, "DIV", "class", "overlay_title"), //выборка заголовочного оверлея
like = getNode(underheader, "DIV", "class", "overlay_like"); //выборка оверлэя с кол-вом лайков
for(var i = 0; i < a.length; i++) {
a[i].onmouseover = function(){visible(title[i]); visible(like[i]);};
a[i].onmouseout = function(){invisible(title[i]); invisible(like[i]);};
}
};
//ф-я выборки узлов tag из obj по атрибуту atr и его значению val
function getNode(obj, tag, atr, val) {
var el = gt(obj, tag),
res = [];
for(var i = 0; i < el.length; i++)
if(el[i].getAttribute(atr) == val) res.push(el[i]);
if(res.length) return res;
return false;
}
//ф-я выборки по id
function gi(id) {
return document.getElementById(id);
}
//ф-я выборки по tagname
function gt(obj, tag) {
return obj.getElementsByTagName(tag);
}
function invisible(obj) {
obj.style.visibility = "hidden";
}
function visible(obj) {
obj.style.visibility = "visible";
}
При запуске консольки браузеров выдают такой error: Код:
Uncaught TypeError: Cannot read property 'style' of undefined
a[0].onmouseover = function(){visible(title[0]); visible(like[0]);};
a[0].onmouseout = function(){invisible(title[0]); invisible(like[0]);};
И вуаля всё работает, но само собой так делать бред, ибо таких блоков у меня много и они дёргаются из БД. Пробовал через addEventListener, выдаёт аналогичную ошибку: Код:
Uncaught TypeError: Cannot read property 'addEventListener' of undefined |
mixtape,
а скрипт вам зачем для этого? |
рони,
а каким образом можно ещё реализовать? через hover в css не получится, тк надо отображать не тот элемент, на который навожусь (а навожу курсор на гиперссылку), а два других див блока, у которых z-index ниже, чем у гиперссылки, посему hover на каждый из див блоков не сработает. |
mixtape,
css "overlay_title", "overlay_like" и A (c rel=link) покажите |
рони,
#underheader .thumb {
height: 140px;
width: 100%;
}
#underheader .thumb a {
display: block;
position: relative;
width: 100%;
height: 100%;
z-index: 4;
}
#underheader .thumb .overlay_corner {
position: relative;
width: 100%;
height: 100%;
top: -140px;
z-index: 3;
background-image: url(../images/overlay_corner.png);
background-repeat: no-repeat;
background-position: 22% 100%;
}
#underheader .thumb .overlay_title {
position: relative;
width: 190px;
height: 110px;
background-color: rgba(200,26,60,0.5);
top: -280px;
z-index: 1;
padding: 30px 15px 0px;
visibility: hidden;
}
#underheader .thumb .overlay_like {
position: relative;
width: 140px;
height: 50px;
padding: 90px 0 0 80px;
background-image: url(../images/overlay_like.png);
background-repeat: no-repeat;
background-position: 20% 78%;
top: -420px;
z-index: 2;
visibility: hidden;
}
#underheader .thumb img {
position: relative;
width: 220px;
height: 100%;
top: -560px;
z-index: 0;
}
|
mixtape,
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<style type="text/css">
#underheader .thumb {
height: 140px;
width: 100%;
}
#underheader .thumb a {
display: block;
position: relative;
width: 100%;
height: 100%;
z-index: 4;
}
#underheader .thumb .overlay_corner {
position: relative;
width: 100%;
height: 100%;
top: -140px;
z-index: 3;
background-image: url(../images/overlay_corner.png);
background-repeat: no-repeat;
background-position: 22% 100%;
}
#underheader .thumb .overlay_title {
position: relative;
width: 190px;
height: 110px;
background-color: rgba(200,26,60,0.5);
top: -280px;
z-index: 1;
padding: 30px 15px 0px;
visibility: hidden;
}
#underheader .thumb .overlay_like {
position: relative;
width: 140px;
height: 50px;
padding: 90px 0 0 80px;
background-image: url(../images/overlay_like.png);
background-repeat: no-repeat;
background-position: 20% 78%;
top: -420px;
z-index: 2;
visibility: hidden;
}
#underheader .thumb img {
position: relative;
width: 220px;
height: 100%;
top: -560px;
z-index: 0;
}
#underheader .thumb [rel="link"]:hover ~ .overlay_title,#underheader .thumb [rel="link"]:hover ~ .overlay_like {
visibility : visible;
}
</style>
<meta charset="utf-8">
</head>
<body>
<div id="underheader">
<div class="main_center over">
<ul>
<li>
<div class="thumb">
<a rel="link" href="#"></a>
<div class="overlay_corner"></div>
<div class="overlay_title">Современная архитектура и красивый дизайн дома</div>
<div class="overlay_like">4</div>
<img src="content/1.jpg" alt=""/>
</div>
<div class="desc">
<p class="date">Июнь 13, 2014</p>
<p class="stats"><span class="comment">2</span><span class="like">4</span></p>
<h1><a href="#" title="">Современная архитектура и красивый дизайн дома</a></h1>
</div>
</li>
</ul>
</div>
</div>
<div id="underheader">
<div class="main_center over">
<ul>
<li>
<div class="thumb">
<a rel="link" href="#"></a>
<div class="overlay_corner"></div>
<div class="overlay_title">Современная архитектура и красивый дизайн дома</div>
<div class="overlay_like">4</div>
<img src="content/1.jpg" alt=""/>
</div>
<div class="desc">
<p class="date">Июнь 13, 2014</p>
<p class="stats"><span class="comment">2</span><span class="like">4</span></p>
<h1><a href="#" title="">Современная архитектура и красивый дизайн дома</a></h1>
</div>
</li>
</ul>
</div>
</div>
</body>
</html>
|
рони,
действительно, что-то про множественный селектор я забыл. работает. но соль в том, что это был частный случай. косяк в js где-то есть. просто выше есть button (который в nav), который отрабатывает роль toggle, скрывает/показывает родительский блок ul, в котором и расположены эти элементы li.
<div id="underheader">
<div class="main_center over">
<header>
<button></button>
<nav>
<a class="current" href="#">месяц</a>
<a href="#">полгода</a>
<button></button>
</nav>
</header>
<ul>
<li>
<div class="thumb">
<a rel="link" href="#"></a>
<div class="overlay_corner"></div>
<div class="overlay_title">Современная архитектура и красивый дизайн дома</div>
<div class="overlay_like">4</div>
<img src="content/1.jpg" alt=""/>
</div>
<div class="desc">
<p class="date">Июнь 13, 2014</p>
<p class="stats"><span class="comment">2</span><span class="like">4</span></p>
<h1><a href="#" title="">Современная архитектура и красивый дизайн дома</a></h1>
</div>
</li>
<li>...</li>
<li>...</li>
<li>...</li>
</ul>
</div>
</div>
Посему для него аналогично прописываю:
window.onload = function () {
var underheader = gi("underheader"), //underheader
buttonClose = gt(underheader, "BUTTON")[1], //выборка кнопки сворачивания
ul = gt(underheader, "UL"); //блок сворачивания
buttonClose.onclick = function(){toggle(ul);};
};
function gi(id) {
return document.getElementById(id);
}
function gt(obj, tag) {
return obj.getElementsByTagName(tag);
}
function toggle(obj) {
obj.style.display = (obj.style.display == 'none') ? '' : 'none';
}
Вся та же ошибка: Uncaught TypeError: Cannot read property 'display' of undefined Посему данная проблема по-прежнему актуальна) |
mixtape,
строка 4 чего-то нехватает что есть строкой повыше |
Цитата:
<style>
#id1{ background: red;}
#id1:hover ~ #id2 { background: #238C00;}
#id2 { background: #FF00FF;}
</style>
<div class="on" id="id1">первый</div>
<div class="no_class">просто блок</div>
<div class="no_class">просто блок</div>
<div class="th" id="id2">Второй</div>
|
MallSerg,
а проверить свой код? |
| Часовой пояс GMT +3, время: 16:20. |