Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Привязка нескольких объектов к ссылке (https://javascript.ru/forum/dom-window/64253-privyazka-neskolkikh-obektov-k-ssylke.html)

donkey 30.07.2016 00:27

Привязка нескольких объектов к ссылке
 
Здравствуйте!

Никогда такого не было и вот опять! Помогите пожалуйста средствами разметки сделать анимацию..

Есть три слоя (DIV).

z-index: -1;
z-index: -2;
z-index: -3;

Первый (-1) и третий (-3) слои связаны по одному краю, второй (-2) слой не подвижен и находится между ними. При этом третий (-3) частично спрятан за экраном..

Фактически нужно лишь "раскрыть" спрятанный слой на его ширину, но вместе с тем оставить его связанным с первым слоем, т.е. предвинуть эти оба слоя вместе..

----
Честно сказать, сам уже и так и эдак, но.. Поиск? Приводит к разнообразию произвольных решений, каждое из которых работает, но как ни стараюсь их объединить и применить, это никак не приводит к желаемому результату..

warren buffet 30.07.2016 09:07

Цитата:

Сообщение от donkey
частично спрятан за экраном..

Боится наверно вылезать оттудова.

Цитата:

Сообщение от donkey
слои связаны по одному краю,

Мастера художественной вязки на линии.

Цитата:

Сообщение от donkey
и находится между ними

Евклид нервно курит: два слоя связаны по одному краю, а третий, находится между ними. Очевидно именно по этой причине он и спрятался за монитором.

ЗЫ Вставляй сюда свой спрятанный див и оба связанных как хтмл код. Тогда будет серьезно.

donkey 30.07.2016 10:13

Спасибо за ответ.

<html><head>
<style>
#x {z-index: -1; position: absolute; background-color: blue; bottom: 15; left:15; width: 200; height: 185;}
#xx {z-index: -2; position: absolute; background-color: red; bottom: 0; left:15; width: 200; height: 35;}
#xxx {z-index: -3; position: absolute; background-color: yellow; bottom: -600; left:15; width: 200; height: 800; border: 1px solid black;}
</style>
</head>
<body>  
<div id="x">1</div>
<div id="xx">2</div>
<div id="xxx">3</div> 
</body>
</html>


Дело в том, что z-index не работает, если привязать первый и третий слои друг к другу поместив один в другой и двигать их, средний не будет находится между ними, (когда они начнут перемещение равное высоте нижнего слоя, он должен оставаться на месте)..

Все, что я нашел по скриптам, работает с отделаьными элементами, а вот с парой не связанных элементов.. Знаю, что делаю что-то не так, но вот что именно, не могу понять..

warren buffet 30.07.2016 18:37

Ты зачем этой занимаешься? Ну если есть повод отпостить что-то на говнокод.ру, то твой говнокод вполне мотивирует. )))

Во-первых боттом - это бред. Дно есть когда оно есть, а когда ничего нет, скорее всего браузер топает от топа. Во-вторых единицы измерения указывай. И последнее, бери вот этот код как базисно вменяемый и учись дальше. Я сшил твои кувадратики, дальше разберешься почему они сшились.

<html><head>
<style>
#x {z-index: 1; position: absolute; background-color: blue; 

top: 15;
left:15;
width: 200;
height: 185;

}

#xx {z-index: 2; position: absolute; background-color: red; 

top: 200; 
left:15; 
width: 200; 
height: 35;
}

#xxx {z-index: 3; position: absolute; background-color: yellow; 

top: 235; 
left:15; 
width: 200; 
height: 200; 


}
</style>
</head>
<body>



<div style="position:relative;">

	<div id="x">1</div>
	<div id="xx">2</div>
	<div id="xxx">3</div>

</div>

</body>
</html>

warren buffet 30.07.2016 18:40

Да, про самую мякотку забыл. С какого одеколона у тебя z-index негативный? z-index - всегда относительный, то есть он не глобально херачит как думают некоторые оленеводы, а опирается на предка крепко стоящего на ногах. То есть div z-index=1, задаетъ всем отпрыскам такой же, а если какой-то хочет выше, то ставит себе z-index=1 и получается типа 2.

donkey 31.07.2016 01:09

Благодарю вас, милейший, но у меня нет "дна" на странице и все элементы на ней закреплены, а прокрутка отсутствует. Засим, мне вовсе не ясно что вы подразумеваете под "сшил" мои элементы, если они мне нужны именно по отдельности и таки да, как сдвинуть два элемента, в данном случае слоя, так чтобы средний остался на месте?

UPD отметил там момент сдвига, в первом сообщении с html..

warren buffet 31.07.2016 10:59

Я ж тебе и пишу, что нет у страницы "дна", вертикаль практически бесконечна, поскольку прокрутка присутствует, в том числе в твоем калечном хтмле.

Как и большинство оленеводов, ты понимаешь фразу position:absolute абсолютно, типа от левого верхнего пиксела монитора. На самом деле в хтмле нет ничего абсолютного, там вообще все относительное, в том числе и абсолютные элементы, просто они выпадают из потока и опираются на предка в потоке, если даже этот предок - туловище (body), или космос - html, поскольку html - это такой же элемент под названием htmlElement. Дошло?

Конечно нет. Так вот, чтобы сделать все вообще абслютным, надо пофиксить хтмль намертво, то есть

html{width:100%;height:100%;position:fixed;overflow:hidden;}


Только так можно избавиться от всех прокруток несмотря на любое содержание. А потом уже корежить это содержание так, чтобы оно вообще оказалось внутри пофиксенного хтля.

warren buffet 31.07.2016 11:08

Вот смотри, позиции абсолютные, а поля туловища запросто смещают нули в топ и лефт на указанную ширину поля. Понял теперь, что нет там ничего абсолютного? Все остальное в комментах хтмля.

<html><head>
<style>

html{width:100%;height:100%;position:fixed;overflow:hidden;}
body{margin:20px;}

#x {
position: absolute; background-color: blue; 

	width: 100; /* меняй размеры */
	height: 100;

	top: 0; /* меняй координаты */
	left: 0;

	z-index: 10; /* меняй ось z */

}

/* во всех остальных квадратах и "сшивай" блеать как угодно */

#xx {
position: absolute; background-color: red; 

	width: 100; 
	height: 100;

	top: 50; 
	left:50; 

	z-index: 2; 

}

#xxx {
position: absolute; background-color: yellow; 

	width: 100; 
	height: 100; 

	top: 100; 
	left: 100; 

	z-index: 3; 


}
</style>
</head>
<body>



<div style="position:relative;">

	<div id="x">1</div>
	<div id="xx">2</div>
	<div id="xxx">3</div>

</div>

</body>
</html>

donkey 31.07.2016 11:35

Простите меня, но каким, простите еще раз, образом это поможет мне показать спрятаную часть слоя №3, сдвинув его на всю его высоту, одновременно с этим сдвинуть слой №1, оставив его привязанным к краю слоя №3, оставив не подвижным слой №2.?

warren buffet 31.07.2016 11:41

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

donkey 31.07.2016 11:59

Благодарю вас! Собственно я и попросил помочь со скриптом, а не с позиционированием..

warren buffet 31.07.2016 12:07

То есть никому не известно как оно должно шевелиться, сценарий пиши и все.

<html><head>
<style>

html{width:100%;height:100%;position:fixed;overflow:hidden;}
body{margin:20px;}

#x {
position: absolute; background-color: blue; 

	width: 100; /* меняй размеры */
	height: 100;

	top: 0; /* меняй координаты */
	left: 0;

	z-index: 10; /* меняй ось z */

}

/* во всех остальных квадратах и "сшивай" блеать как угодно */

#xx {
position: absolute; background-color: red; 

	width: 100; 
	height: 100;

	top: 50; 
	left:50; 

	z-index: 2; 

}

#xxx {
position: absolute; background-color: yellow; 

	width: 100; 
	height: 100; 

	top: 100; 
	left: 100; 

	z-index: 3; 


}
</style>
</head>
<body>



<div style="position:relative;">

	<div id="x">1</div>
	<div id="xx">2</div>
	<div id="xxx">3</div>

</div>

<script>

var obj={
	x:null,
	xx:null,
	xxx:null,
};

for(var id in obj)
	obj[id]=document.getElementById(id);
	
	
var cnt=0,inc=1,step=5,min=1,max=50,left;

t = setInterval(function(){

	cnt+=inc;
	left=cnt*step;
	if(cnt>max || cnt<min) inc=-inc;
	
	obj.x.style.left=left;
	obj.xx.style.top=left;
	
	obj.xxx.style.left=left;
	obj.xxx.style.top=left;
	
	

},100);

</script>

</body>
</html>

warren buffet 31.07.2016 12:09

Цитата:

Сообщение от donkey
позиционированием

Сначала надо сделать позиционирование, чтобы все работало ожидаемо, а потом уже остается только написать скрипт согласно сценария анимации. Бери и пиши, или пиши сценарий тут.

donkey 01.08.2016 09:57

Не очень понятно, что вы подразумеваете под словом сценарий, но я постараюсь объяснить..

У меня есть панель, назовем ее условно "меню" (x) в ней находится несколько привязанных (сшитых с ней, если вам так угодно) объектов. Этот объект, с кучей объектов внутри гипотетически находится над двумя или даже тремя слоями (xx), которые маскируют, скрывают, еще один слой, частично спрятанный за экраном (xxx)..

Мне бы хотелось при нажатии на ссылку, которая находится совсем в другом месте страницы, сдвинуть мою панель "меню", одновременно с этим сдвинуть слой который спрятан под ним и за экраном на на его длину, но так, чтобы маскирующие слои.. оставались неподвижными..

И, чесно сказать, я не в ус ногой в скрипты.. Решения, которые я находил в интернете могут работать лишь с одним слоем, нескорые из них на чистом css, нескорые на скрипте, но как я ни старался понять как это работает, увы..

Если возможно написать хоть примерно, чтобы хоть-что-нибудь двигалось, тогда мне возможно будет легче понять.. Я стараюсь понять, поверьте..

рони 01.08.2016 10:17

Цитата:

Сообщение от donkey
Решения, которые я находил в интернете могут работать лишь с одним слоем,

покажите пример, чтобы хоть понять о чём вы говорите

donkey 01.08.2016 10:44

warren buffet, нарисовал примерный сценарий:

<!doctype html public "-//W3C//DTD HTML 3.2 Final//EN"> 
<html>
<head> 
<style> 
#x {z-index: -1; position: absolute; background-color: blue; right: 15; top:15; width: 185; height: 185; text-align: center}
#xx {z-index: -2; position: absolute; background-color: red; right: 0; top:10; width: 50; height: 200;}
#xxx {z-index: -3; position: absolute; background-color: yellow; right: -300; top:15; width: 500; height: 185; border: 1px solid black; text-align: right}
</style>
</head>
<body> 

<a href="#">onClick</a>

<div style="position: fixed; top: 25%; left: 25%; width: 400; Height:300; border: 1px solid #000000;">
&nbsp;[my screen]

<div id="x">That DIV must turn left wih (xxx)</div>
<div id="xx"></div>
<div id="xxx">That DIV must turn left onClick</div>

</div>

</body></html>

рони, при помощи transition и много решений со скриптами..

рони 01.08.2016 11:24

donkey,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

Dilettante_Pro 01.08.2016 13:58

donkey,
Если я правильно понял, то (без анимации) должно получиться что-то вроде
<!doctype html public "-//W3C//DTD HTML 3.2 Final//EN"> 
<html> 
<head> 
<style> 
#x {z-index: -1; position: absolute; background-color: blue; right: 15; top:15; width: 185; height: 185; text-align: center}
#xx {z-index: -2; position: absolute; background-color: red; right: 0; top:10; width: 50; height: 200;}
#xxx {z-index: -3; position: absolute; background-color: yellow; right: -300; top:15; width: 500; height: 185; border: 1px solid black; text-align: right}
</style> 

</head> 
<body> 
<div style="position: fixed; top: 25%; left: 25%; width: 400; Height:300; border: 1px solid #000000;">
&nbsp;[my screen]
<div id="x">That DIV must turn left wih (xxx)</div>
<div id="xx"></div>
<div id="xxx">That DIV must turn left onClick</div>

</div>
<a href="#">onClick</a>
<script>
   var a = document.querySelector("a"),
        x = document.getElementById("x"),
        xxx = document.getElementById("xxx");
   a.onclick = function() {
         x.style.left = '0px';
         xxx.style.left =  getComputedStyle(x, "").getPropertyValue('width');
   }
</script>
</body> 
</html>

Dilettante_Pro 01.08.2016 14:45

<!doctype html public "-//W3C//DTD HTML 3.2 Final//EN"> 
<html> 
<head> 
<style> 
#x {z-index: -1; position: absolute; background-color: blue; right: 15; top:15; width: 185; height: 185; text-align: center}
#xx {z-index: -2; position: absolute; background-color: red; right: 0; top:10; width: 50; height: 200;}
#xxx {z-index: -3; position: absolute; background-color: yellow; right: -400; top:15; width: 500; height: 185; border: 1px solid black; text-align: center}
</style> 

</head> 
<body> 
<div style="position: fixed; top: 25%; left: 25%; width: 400; Height:300; border: 1px solid #000000;">
&nbsp;[my screen]
<div id="x">That DIV must turn left wih (xxx)</div>
<div id="xx"></div>
<div id="xxx">That DIV must turn left onClick</div>

</div>
<a href="#">onClick</a>
<script>
   var a = document.querySelector("a"),
        x = document.getElementById("x"),
        xxx = document.getElementById("xxx");
   a.onclick = function() {
      var left = parseInt(getComputedStyle(x, "").getPropertyValue('left'));
      if (left > 0) {
         t = setInterval(function() {
             --left;
             x.style.left = left + "px";
             if (left == 0)  { 
                 clearInterval(t);
                 var leftXXX = parseInt(getComputedStyle(xxx, "").getPropertyValue('left')),
                leftmin =  parseInt(getComputedStyle(x, "").getPropertyValue('width'));
                tt = setInterval(function() {
                   --leftXXX;
                   xxx.style.left = leftXXX + "px";
                   if (leftXXX == leftmin) clearInterval(tt);
                }, 10);
              }
         }, 10);
      }
   }
</script>
</body> 
</html>

donkey 01.08.2016 17:10

Dilettante_Pro, круто! Гранд мерси! Вы почти..

Понимаете, я "ваяю" хомяка, не совсем обычного конечно.. И, если с логикой у меня вроде ничего так, то с функциями и алгоритмами на данный момент полный алес, увы.

Но.. Я разгадал некоторые функции вашего скрипта и, в целом, он вполне подходит для моих целей. Еще раз большое спасибо вам!

Единственное, если возможно сделать, чтобы эти два слоя двигались одновременно? Или.. Придумаю что-нибудь..

Спасибо вам! Огромное! (:

П.С. Ссылку на ваш профиль, если вы не против конечно, вставлю в мои "титры", которые, собственно, и находятся в этом слое..

Dilettante_Pro 01.08.2016 17:50

donkey,
двигаются одновременно (по крайней мере, начинают)
<!doctype html public "-//W3C//DTD HTML 3.2 Final//EN"> 
<html> 
<head> 
<style> 
#x {z-index: -1; position: absolute; background-color: blue; right: 15; top:15; width: 185; height: 185; text-align: center}
#xx {z-index: -2; position: absolute; background-color: red; right: 0; top:10; width: 50; height: 200;}
#xxx {z-index: -3; position: absolute; background-color: yellow; right: -400; top:15; width: 500; height: 185; border: 1px solid black; text-align: center}
</style> 

</head> 
<body> 
<div style="position: fixed; top: 25%; left: 25%; width: 400; Height:300; border: 1px solid #000000;">
&nbsp;[my screen]
<div id="x">That DIV must turn left wih (xxx)</div>
<div id="xx"></div>
<div id="xxx">That DIV must turn left onClick</div>

</div>
<a href="#">onClick</a>
<script>
   var a = document.querySelector("a"),
        x = document.getElementById("x"),
        xxx = document.getElementById("xxx");
   a.onclick = function() {
      var left = parseInt(getComputedStyle(x, "").getPropertyValue('left'));
      if (left > 0) {
         t = setInterval(function() {
             --left;
             x.style.left = left + "px";
             if (left == 0)   clearInterval(t);
          }, 10);
          var leftXXX = parseInt(getComputedStyle(xxx, "").getPropertyValue('left')),
           leftmin =  parseInt(getComputedStyle(x, "").getPropertyValue('width'));
           tt = setInterval(function() {
                --leftXXX;
                xxx.style.left = leftXXX + "px";
                if (leftXXX == leftmin) clearInterval(tt);
            }, 10);
      }
   }
</script>
</body> 
</html>

Dilettante_Pro 01.08.2016 18:11

donkey,
Первый тянет за собой второго
<!doctype html public "-//W3C//DTD HTML 3.2 Final//EN"> 
<html> 
<head> 
<style> 
#x {z-index: -1; position: absolute; background-color: blue; right: 15; top:15; width: 185; height: 185; text-align: center}
#xx {z-index: -2; position: absolute; background-color: red; right: 0; top:10; width: 50; height: 200;}
#xxx {z-index: -3; position: absolute; background-color: yellow; right: -400; top:15; width: 500; height: 185; border: 1px solid black; text-align: center}
</style> 

</head> 
<body> 
<div style="position: fixed; top: 25%; left: 25%; width: 400; Height:300; border: 1px solid #000000;">
&nbsp;[my screen]
<div id="x">That DIV must turn left wih (xxx)</div>
<div id="xx"></div>
<div id="xxx">That DIV must turn left onClick</div>

</div>
<a href="#">onClick</a>
<script>
    var a = document.querySelector("a"),
        x = document.getElementById("x"),
        xxx = document.getElementById("xxx");
    a.onclick = function () {
        var left = parseInt(getComputedStyle(x, "").getPropertyValue('left')),
            widthX = parseInt(getComputedStyle(x, "").getPropertyValue('width')),
            leftXXX = parseInt(getComputedStyle(xxx, "").getPropertyValue('left'))
        if (left > 0) {
            t = setInterval(function () {
                --left;
                x.style.left = left + "px";
                
                leftmin = left + widthX;
                if (leftXXX > leftmin) {
                    xxx.style.left = leftmin + "px";
                };
                if (left == 0) clearInterval(t);
            }, 10);
        }
    }
</script>
</body> 
</html>

warren buffet 02.08.2016 04:06

donkey, сценарий - это screenplay, то есть то, что должно играть на экране. Сценарий это: техническое задание и технические условия, это чертеэ строительства дома, это технология выпечки хлеба и рецепт приготовления котлет, это алгоритм и тактировка, это что угодно, что рассказывает что надо взять, когда и сколько, куда положить, прибить поставить, пришить и что должно получиться.

У тебя свое заводское понимание устройства веб-сайтов, из которого ты вылезать не хочешь. Как ты придумал - так не делают.

warren buffet 02.08.2016 04:08

Нет никаких "слоев" на веб-странице, это дебильные кодеры 90-х так назвали arbitrary division - который div, когда им их показали вместо table. Веб - это не фотошоп и не люстра.

Твой сценарий пишется так: как сдвинуть два дива одновременно с сохранением относительного положения их друг к другу. Вот так, коротко и ясно. Третий див вообще не колебет, его двигать не надо, значит его нету в сценарии, статист.

method = div1.left = div2.left+div2.width;

donkey 02.08.2016 15:57

Dilettante_Pro, очень интересно.. По крайней мере теперь, после этих нескольких примеров, становится куда как более ясно как работает скрипт. Вы очень выручили. Спасибо вам!

warren buffet, вы прямо как генерал Кастер из фильма "Маленький Большой Человек", - совершенно точно определили мою профессию по внешнему виду! Крайне рекомендую вам пересмотреть эту шикарную киноленту.. Дабы.. Случайно не повторить весьма печальную участь.. Генерала.. Джорджа Армстронга Кастера! (:

warren buffet 02.08.2016 16:33

Иди сшивай слои умнег. Белыми нитками.

donkey 24.08.2016 14:14

Здравствуйте!

Еще раз большое спасибо, но мне снова нужна помощь с этим скриптом.

Вот с чем я столкнулся: Лиса слишком медленно открывает скрытый слой, даже несмотря на интервал времени установленный в скрипте.. Возможно, что просто скрытый слой слишком "перегружен", но в Хроме все нормально, даже слишком хорошо, только вот при повторном нажатии на ссылку в обеих браузерах снова запускается функция и оба слоя "уходят" с экрана.

Почитал по поводу запрета повторного нажатия и, по ходу, этот вопрос не решается без подключения внешних библиотек.. Возможно ли избежать этого и просто привязать эти два слоя к мыши, без ссылки, и просто "вытягивать" их оба, но не более чем на заранее заданную ширину, как штору?

Буду очень признателен за вашу помощь!

рони 24.08.2016 14:19

Цитата:

Сообщение от donkey
даже несмотря на интервал времени установленный в скрипте..

значение 10 слишком мало для любого браузера, и код использующий setInterval (или document.write :lol: ) это плохой код.

donkey 24.08.2016 16:32

рони, поверьте, менял интервал времени, но увы.. Более того, опытным путем установил, что при замене оnClick на onFocus становится ненамного легче в Хроме, но все равно слой рано или поздно "уезжает" со страницы..

Manyasha 26.08.2016 18:52

donkey,
если еще актуально, посмотрите такой вариант:
<!doctype html public "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<style>
#x {z-index: -1; position: absolute; background-color: blue; right: 15; top:15; width: 185; height: 185; text-align: center}
#xx {z-index: -2; position: absolute; background-color: red; right: 0; top:10; width: 50; height: 200;}
#xxx {z-index: -3; position: absolute; background-color: yellow; right: -400; top:15; width: 500; height: 185; border: 1px solid black; text-align: center}
</style>
 </head>
<body>
<div id="screen" style="position: fixed; top: 25%; left: 25%; width: 400; Height:300; border: 1px solid #000000;">
&nbsp;[my screen]
<div id="x">That DIV must turn left wih (xxx)</div>
<div id="xx"></div>
<div id="xxx">That DIV must turn left onClick</div>
 
</div>
<a href="#">onClick</a>
<script>
    var a = document.querySelector("a"),
        x = document.getElementById("x"),
        xxx = document.getElementById("xxx");
	var screen = document.getElementById("screen");
    a.onclick = function () {
        var leftX = parseInt(getComputedStyle(x, "").getPropertyValue('left')),
            widthX = parseInt(getComputedStyle(x, "").getPropertyValue('width')),
            leftXXX = parseInt(getComputedStyle(xxx, "").getPropertyValue('left')),
			widthXXX = parseInt(getComputedStyle(xxx, "").getPropertyValue('width'));
		if (isNaN(leftX)){
			leftX = parseInt(getComputedStyle(screen, "").getPropertyValue('width'))-
						parseInt(getComputedStyle(x, "").getPropertyValue('right'))-widthX;
		}
		if (isNaN(leftXXX)){
			leftXXX = parseInt(getComputedStyle(screen, "").getPropertyValue('width'))-
						parseInt(getComputedStyle(xxx, "").getPropertyValue('right'))-widthXXX;
		}
		$("#x").css("left", leftX).animate({left: "0px"}, 1500);
		$("#xxx").css("left", leftXXX).animate({left: widthX+"px"}, 1500);
    }
</script>
</body>
</html>

donkey 27.08.2016 11:25

Manyasha, гран мерси!

Тут, в примере, все в полном порядке, но.. У меня на странице не работает.. Проверил несколько раз все значения, не забыл про "screen" и все равно не работает.. Все равно, огромное спасибо вам!


Часовой пояс GMT +3, время: 03:31.