Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Невидимый Div, отображающийся по клику 
V
    Опции темы
Wheels
Дата 10.11.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 1.2.2007

Репутация: 1
Всего: 1



Здравствуйте.
Задача:

По клику на кнопке появляется Див поверх остального контента. Исчезать должен по клику на эту же кнопку или на этот див или в любом другом месте страницы.

вопросы:
1) Как его убрать при нажатии в любом другом месте страницы?
2) Насколько кроссброузерен и универсален данный вариант?
3) В правильном ли я двигаюсь направлении при решении данной задачи?

Код

<HTML>
<HEAD>
<style>
.hidden {position: absolute; visibility: hidden;}
.visible {position: absolute; visibility: visible; z-index: 2;}
</style>
</HEAD>
<body>
<input type=button value="Нажми" onclick="document.getElementById('s1').className=='hidden'?document.getElementById('s1').className='visible':document.getElementById('s1').className='hidden'; return false;">
<div id="s1" class="hidden" onClick="this.className='hidden'">
<table border=1 bgcolor=#0000aa>
<tr><td><a href="">dsfsdf</a></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
</table>
</div>
</body>
</HTML>


Заранее спасибо.
PM MAIL ICQ   Вверх
bars80080
Дата 10.11.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



<body onclick="document.getElementById('s1').style.visibility='hidden'">
PM MAIL WWW   Вверх
Wheels
Дата 10.11.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 1.2.2007

Репутация: 1
Всего: 1



bars80080, спасибо тебе большое. Постоянно выручаешь. 
Но я так пробовал уже, не работает. Див вообще не раскрывается при нажатии на кнопку. Кнопка же тоже в теле документа находится.
К тому же что делать если таких кнопок с дивами будет несколько и разных?

Это сообщение отредактировал(а) Wheels - 10.11.2008, 17:02
PM MAIL ICQ   Вверх
bars80080
Дата 10.11.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



может вообще идея крамольная с боди, но если всё же с ним, то <body onclick="prov();">

а в функции prov(); во-первых проверка какие дивы открыты и их закрытие (просто при открытие дива в общем массиве менять значение флага, а потом проверять в цикле)



но скорее всего выход такой: 
твой див - это слой, растягивающийся на весь экран, в середине окошко, которое тебе нужно, всё остальное - прозрачный слой, по которому можно осуществить клик. при этом можно даже задать не прозрачный слой, а фон в виде полупрозрачного png, тогда будет красивое затенение сайта
PM MAIL WWW   Вверх
Wheels
Дата 10.11.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 1.2.2007

Репутация: 1
Всего: 1



Цитата(bars80080 @  10.11.2008,  17:44 Найти цитируемый пост)
но скорее всего выход такой: 
твой див - это слой, растягивающийся на весь экран, в середине окошко, которое тебе нужно, всё остальное - прозрачный слой, по которому можно осуществить клик. при этом можно даже задать не прозрачный слой, а фон в виде полупрозрачного png, тогда будет красивое затенение сайта 

Спасибо! )

Ой...
Можно хоть как-нибудь в примере, пожалуйста?
Я же в раздел для начинающих пишу =)

Дело в том, что Див должен вылезать прямо у кнопки, ответственной за его показ. Типа виндовского селекта или любого контекстного меню.


Это сообщение отредактировал(а) Wheels - 10.11.2008, 17:49
PM MAIL ICQ   Вверх
bars80080
Дата 10.11.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



самое простое - заготовить такой слой заранее. располагаться он должен перед </body> и желательно иметь нужные характеристики. т.е. растянут по всей ширине с помощью css. только быть невидимым:

Код

<style>
#qw { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; display: none; }
</style>
<div id="qw" onclick="closeqw()"></div></body>


конечно, тут возможны подводные камни в зависимости от ситуации.

по нажатию кнопки просто берётся разметка нужного тебе окна и вставляется в qw, затем он открывается:

Код

var win = new Array();
win[0] = '<div>окошко номер 0</div>';
win[1] = '<div>окошко номер 1</div>';
//...
function openqw(x) {
    var el = document.getElementById('qw');
    el.innerHTML = win[x];
    el.style.display = 'block';
}
function closeqw() {
    var el = document.getElementById('qw');
    //el.innerHTML = '';
    el.style.display = 'none';
}
это конечно жутко упрощённо. но хотя бы идея
PM MAIL WWW   Вверх
Michael.de
Дата 11.11.2008, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 22.3.2005
Где: Deutschland

Репутация: 4
Всего: 9



Во, наваял:
Код

<html>
<head>
<script type='text/javascript'>
var info=[], clicked=[], cX, cY;
// создание массива подсказок:
function init(){
 var i, text=['Bla bla', 'Blu bla', 'Blu blu', 'Bla blu', 'Ups :)'];
 for (i=0; i<text.length; i++){
  info[i]=document.createElement('div');
  info[i].innerHTML=text[i];
  info[i].style.cssText='position:absolute;visibility:hidden;border:1px solid #00A;background-color:#EED;padding:2px;';
  clicked[i]=false;
  document.body.appendChild(info[i]);
 }
}
// актуальные координаты мыши:
function mc(e){
 e=e||window.event;
 cX=e.clientX;
 cY=e.clientY;
}
// показать/спрятать подсказку:
function show_hide(number){
 var dX=20, dY=20; // <-- это - сдвиг подсказки вниз и вправо
 if (clicked[number]) info[number].style.visibility='hidden';
 else {
  info[number].style.visibility='visible';
  info[number].style.left=cX+dX+'px';
  info[number].style.top=cY+dY+'px';
 }
 clicked[number]=!clicked[number];
}
</script>
</head>
<body onload='init();' onmousemove='mc(event);'>
<button onclick="show_hide('0')">Button 1</button>
<br><br><center>
<button onclick="show_hide('1')">Button 2</button>
</center><br><br>
<button onclick="show_hide('2')">Button 3</button>
<br><br><center>
<button onclick="show_hide('3')">Button 4</button>
</center><br><br>
<button onclick="show_hide('4')">Button 5</button>
</body>
</html>
...выглядит пример конечно отстойно, но... работает smile
PM MAIL   Вверх
Wheels
Дата 11.11.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 1.2.2007

Репутация: 1
Всего: 1



user posted image


Michael.de, спасибо огромное, но к сожалению это не совсем то, что мне нужно =((


bars80080, Во, как раз так! Вроде разобрался... мне нравится и даже в разных броузерах работает ) Только 1 нюанс остался... 
Как открываемый див к "родительской" кнопке прилепить? Пробовал по-всякому, но какая-то белеберда получается, все зависимости от местоположения и дива и кнопки в коде. Нужно координаты кнопки узнавать? Или можно приемами верстки ограничиться? У меня уже дошло до маразма ;) &nbsp; и nobr =)))
PM MAIL ICQ   Вверх
bars80080
Дата 11.11.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



нет, но если ты имеешь возможность затенить всю страницу, то див тупо должен быть в центре

насчёт определения координат элемента (кнопки), то можно посмотреть здесь http://xhtml.ru/2006/08/23/cursor-coordinates/
там есть пару функций: 
Код

function findPosX(obj) {
// X-координата слоя
  var currleft = 0;
  if (obj.offsetParent)
    while (obj.offsetParent) {
      currleft += obj.offsetLeft
      obj = obj.offsetParent;
    }
  else if (obj.x) currleft += obj.x;
  return currleft;
}

function findPosY(obj) {
// Y-координата слоя
  var currtop = 0;
  if (obj.offsetParent)
    while (obj.offsetParent) {
      currtop += obj.offsetTop
      obj = obj.offsetParent;
    }
  else if (obj.y) currtop += obj.y;
  return currtop;
}
которые можно подкорректировать под свои задачи
PM MAIL WWW   Вверх
Wheels
Дата 11.11.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 1.2.2007

Репутация: 1
Всего: 1



Цитата(bars80080 @  11.11.2008,  11:18 Найти цитируемый пост)
нет, но если ты имеешь возможность затенить всю страницу, то див тупо должен быть в центре


Как так? И координаты кнопки не придется узнавать? Меня этот вариант наверное устроил бы. Т.е. тот, что проще.  Только я тебя не очень понимаю... что значит в центре?  А если кнопок много? А если дизайн страницы "резиновый"? Я, наверное, не совсем суть самой идеи понимаю от того, что не имею в голове представления КАК это будет работать =((

В любом случае - спасибо за ссылку, буду разбираться пока что.

Это сообщение отредактировал(а) Wheels - 11.11.2008, 11:29
PM MAIL ICQ   Вверх
bars80080
Дата 11.11.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



Цитата(Wheels @  11.11.2008,  10:28 Найти цитируемый пост)
Как так?

ну смотри. когда у тебя вылетает alert(), то ничего кроме как на его конпку на странице ты нажать не можешь. если у тебя див с сообщением открывается и приэтом любое нажатие на остальную часть страницы вызывает его закрытие, то самое логичное - разместить его в центре, и при этом затенить страницу (в иделае, она должна поблекнуть - png полупрозрачный поверху)
PM MAIL WWW   Вверх
Wheels
Дата 11.11.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 1.2.2007

Репутация: 1
Всего: 1



Цитата(bars80080 @  11.11.2008,  17:13 Найти цитируемый пост)
ну смотри. когда у тебя вылетает alert(), то ничего кроме как на его конпку на странице ты нажать не можешь. если у тебя див с сообщением открывается и приэтом любое нажатие на остальную часть страницы вызывает его закрытие, то самое логичное - разместить его в центре, и при этом затенить страницу (в иделае, она должна поблекнуть - png полупрозрачный поверху)


Ясно. Т.е. в любом случае Див будет по центру.  Но он нужен прямо от кнопки, где бы она ни находилась, как на изображении. Нужно пробовать разместить его, узнав координаты верхнего левого угла кнопки, так? Или есть другие способы добиться этого?

PM MAIL ICQ   Вверх
Wheels
Дата 11.11.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 1.2.2007

Репутация: 1
Всего: 1



В результате размышлений и пары экспериментов я пришел к выводу, что нужно иметь див фиксированной высоты, так? С прокруткой... Ведь, его левый нижний угол нужно "прилепить" левому верхнему углу кнопки...   А на тот случай, если див широкий, а кнопка у самого правого борта страницы - еще и фиксированную ширину дива, что бы не уезжал за край страницы, а отъехал влево немного.

Я правильно размышляю?

Это сообщение отредактировал(а) Wheels - 11.11.2008, 21:13
PM MAIL ICQ   Вверх
bars80080
Дата 11.11.2008, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



чёрт его знает. сделай чёнибуть. а там посмотришь, нравится или нет
PM MAIL WWW   Вверх
Wheels
Дата 11.11.2008, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 1.2.2007

Репутация: 1
Всего: 1



Сделал. Не нравится =(

При появлении дивов возникает вертикальная и/или горизонтальная прокрутка на странице. Не знаю как от нее избавиться.
С чем это связано? 
В IE дивы закрываются "через раз". При клике на кнопку закрываются на сотый раз, если вообще закрываются.
В чем тут проблема?

И еще не могу понять как сделать id кнопкам такого вида: butt[0]; а в функциях    findPosX(document.getElementById(x)); вместо x писать butt[x]. Но тут просто с синтаксисом не разобрался...

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<style type="text/css">
.mshown0
{
    position: absolute;
    border: 1px solid navy;
    width: 200px;
    height: 50px;
    background: blue;
    color: white;
}
.mshown1
{
    position: absolute;
    border: 1px solid navy;
    width: 200px;
    height: 70px;
    background: red;
    color: white;
}
#qw
{
    position: absolute;
    top: 0px;
    left: 0px;
    width: 100%;
    height: 100%;
    display: none;
}
</style>
</head>

<body>
<div id="qw" onclick="closeqw()"></div>
В октябре россияне забрали из Сбербанка вкладов на 80 миллиардов рублей.<br />
Этот месяц стал самым неудачным за последние 10 лет деятельности банка.<br />
Столь высокий отток средств сотрудники Сбербанка объясняют тем,<br />
что вкладчики из-за слухов о девальвации рубля и деноминации активно забирали свои средства со счетов.<br /><br />
<input type=button value="Нажми" onclick="openqw(0, 50)" id="0">
<br><br /><br />
Юрий Лужков внес в Мосгордуму законопроект, <br />
устанавливающий правила продажи столичных исторических зданий.<input type=button value="Нажми" onclick="openqw(1, 70)" id="1">
По закону раз в три года Москомнаследие будет составлять список зданий, <br />
выставляемых на аукцион, с условием, <br />
что новый владелец будет сохранять и восстанавливать памятники истории и культуры.

<script>
function findPosX(obj) {
// X-координата слоя
  var currleft = 0;
  if (obj.offsetParent)
    while (obj.offsetParent) {
      currleft += obj.offsetLeft
      obj = obj.offsetParent;
    }
  else if (obj.x) currleft += obj.x;
  return currleft;
}
function findPosY(obj) {
// Y-координата слоя
  var currtop = 0;
  if (obj.offsetParent)
    while (obj.offsetParent) {
      currtop += obj.offsetTop
      obj = obj.offsetParent;
    }
  else if (obj.y) currtop += obj.y;
  return currtop;
}
var win = new Array();
win[0] = '<div class=mshown0><b>№ 0</b></div>';
win[1] = '<div class=mshown1>окошко номер 1</div>';
//...
function openqw(x, hei) {

    var bx = findPosX(document.getElementById(x));
    var by = findPosY(document.getElementById(x));
    var el = document.getElementById('qw');
    el.innerHTML = win[x];
    el.style.display = 'block';
    el.style.left = bx + 1;
    el.style.top = by - hei - 2;
}
function closeqw() {
    var el = document.getElementById('qw');
    //el.innerHTML = '';
    el.style.display = 'none';
}
</script>
</body>
</html>

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.