Jump to content
  • 0

Разброс тегов по шапке


Shugich
 Share

Question

Есть вот такая шапка.

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

Как такое можно реализовать? о_О

Edited by Shugich
Link to comment
Share on other sites

  • Answers 76
  • Created
  • Last Reply

Top Posters For This Question

Top Posters For This Question

Recommended Posts

  • 0

А давайте хотябы просто решим эту задачу. Сами придумаем условия, ну вот например скорее всего есть контейнер, можно отталкиватся от этого рисунка http://shugich.ru/head.png, далее мы знаем, что ширина 100%, а высота 171пк, и то, что ссылки не должны заходить за границы и касаться границ логотипа и не должны пересекаться сами по себе.

Link to comment
Share on other sites

  • 0

Ок, возьмем абстрактный сайт. Первым делом нам надо получить массив ссылок с которыми мы потом будем работать. Если нет возможности указывать id для каждой конкретной ссылки (да и бред это), то нам нужно всего-лишь получить контейнер в котором все ссылки лежат. Находим его так:

var cont = document.getElementById('container');

затем находим все ссылки внутри этого контейнера:

var links = cont.getElementsByTagName('a');

все, у нас сформирован массив ссылок, с которым мы будем работать.

Link to comment
Share on other sites

  • 0
Ок, возьмем абстрактный сайт. Первым делом нам надо получить массив ссылок с которыми мы потом будем работать. Если нет возможности указывать id для каждой конкретной ссылки (да и бред это), то нам нужно всего-лишь получить контейнер в котором все ссылки лежат. Находим его так:

var cont = document.getElementById('container');

затем находим все ссылки внутри этого контейнера:

var links = cont.getElementsByTagName('a');

все, у нас сформирован массив ссылок, с которым мы будем работать.

Так, начало отличное, а далее... :lol:

Link to comment
Share on other sites

  • 0

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

cont.parentNode.removeChild(cont);

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

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

Link to comment
Share on other sites

  • 0
А далее я предлагаю после того как мы получили все ноды-ссылки и записали их в массив убить контейнер, т.к. он являлся всего-лишь хранилищем для ссылок. Т.е. надо сделать так:

cont.parentNode.removeChild(cont);

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

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

Погоди, т.е. выходит ты сначала его создал, а потом убил?

А нахрена, ведь мы должны в будущем циклом проходится по его ссылкам?

Link to comment
Share on other sites

  • 0

Я его не создавал, предполагается, что этот контейнер со ссылками нам выдает сервер в лице CMS.

А убил я его потому что на странице видеть этот контейнер нам (да и юзеру) совершенно не обязательно. А ссылки все у нас теперь хранятся в массиве links.

Link to comment
Share on other sites

  • 0
Я его не создавал, предполагается, что этот контейнер со ссылками нам выдает сервер в лице CMS.

А убил я его потому что на странице видеть этот контейнер нам (да и юзеру) совершенно не обязательно. А ссылки все у нас теперь хранятся в массиве links.

Ааа, то есть изначально мы присвоили переменной links коллекцию ссылок нашего контейнера и теперь даже при удалении его, мы всё равно будем иметь переменную links, в которой будет коллекция не взирая ни на что?

Link to comment
Share on other sites

  • 0

Да, все ноды теперь сохранены в массиве, причем сохранены со всеми своими параметрами (классы, урлы, содержимое и т.п.).

Т.е. links - это у нас массив объектов. А объекты эти являются в данном случае ссылками. По этому контейнер с ссылками нам больше не нужен и его можно спокойно удалять.

Link to comment
Share on other sites

  • 0
Да, все ноды теперь сохранены в массиве, причем сохранены со всеми своими параметрами (классы, урлы, содержимое и т.п.).

Т.е. links - это у нас массив объектов. А объекты эти являются в данном случае ссылками. По этому контейнер с ссылками нам больше не нужен и его можно спокойно удалять.

Понял, прикольно, тогда продолжай дружище... :lol:

Link to comment
Share on other sites

  • 0

Продолжаю. Теперь надо написать функцию которая нам будет возвращать габариты объекта.

Я тут написал более-менее универсальную (она конечно требует доработок, но пока и такая сойдет):

function getBounds(obj) {
var x = 0;
var y = 0;
var prnt = obj;

while (prnt && prnt.nodeName.toLowerCase() != 'body') {
x += prnt.offsetLeft;
y += prnt.offsetTop;
prnt = prnt.offsetParent;
}

var x1 = x + obj.offsetWidth;
var y1 = y + obj.offsetHeight;

return {'x0': x, 'y0': y, 'x1': x1, 'y1': y1, 'w': obj.offsetWidth, 'h': obj.offsetHeight}
}

// использовать так
alert('x0=' + getBounds(links[0]).x0 + '\ny0=' + getBounds(links[0]).y0); // выдаст координаты верхнего левого угла элемента

links[0] для примера взял, выдаст нули, т.к. нода удалена и на странице ее нет пока.

Link to comment
Share on other sites

  • 0
1) while (prnt && prnt.nodeName.toLowerCase() != 'body') - вот это чё значит всё?

Перевожу с компьютерного на русский: пока есть парент и парент не равен <body>.

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

Link to comment
Share on other sites

  • 0
Ага! Кто там в гугль всех отправляет? :lol:

https://developer.mozilla.org/en/DOM/element.offsetParent

Грубо говоря, это тоже самое, что parentNode только с учетом офсета.

Хаа,да не вопрос, но я не могу всё таки понять

.offsetParent вот эта тема ссылается на родителя, но не содержит же в себе никакиех координат, ни размеров? Почему бы просто не написать так .parentNode.offsetHeight ,вот также ведь мы вычисляем высоту родителя?

Link to comment
Share on other sites

  • 0

Нас интересует не высота родителя, а офсет. Т.е. offsetParent дает нам смещение потомка относительно родителя. Попробуй заменить в моем коде offsetParent, на parentNode и ты увидишь, что координата элемента будет находится неверно.

Link to comment
Share on other sites

  • 0

Погоди, а вот отдельный вопрос

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>1</title>
<style type="text/css">
*{ margin: 0; padding:0}
body { padding: 50px; border: 1px solid #000;}
#wrap { width: 300px; height: 300px; padding: 50px; border: 1px solid #000;}
#span { display: block; height: 100%; border: 1px solid #000;}

</style>

</head>

<body>
<div id="wrap">
<span id="span">Span</span>
</div>
<script>

var div = document.getElementById('wrap')
var span = document.getElementById('span')

var span = span.offsetLeft

alert(span)

</script>
</body>
</html>

Почему результат алерта 101пк, ведь мы же по-идее должны отсчитывать левый отступ от родителя, а это Див, и он 50пк, а получается что отступ расчитывается от БОДИ, почему так?

Link to comment
Share on other sites

  • 0

Ребят, а на мой вопрос ответьте пожалуйста.

Почему результат алерта 101пк, ведь мы же по-идее должны отсчитывать левый отступ от родителя, а это Див, и он 50пк, а получается что отступ расчитывается от БОДИ, почему так?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>1</title>
<style type="text/css">
*{ margin: 0; padding:0}
body { padding: 50px; border: 1px solid #000;}
#wrap { width: 300px; height: 300px; padding: 50px; border: 1px solid #000;}
#span { display: block; height: 100%; border: 1px solid #000;}

</style>

</head>

<body>
<div id="wrap">
<span id="span">Span</span>
</div>
<script>

var div = document.getElementById('wrap')
var span = document.getElementById('span')

var y = span.offsetLeft

alert(y)

</script>
</body>
</html>

Link to comment
Share on other sites

  • 0
Ребят, а на мой вопрос ответьте пожалуйста.

Почему результат алерта 101пк, ведь мы же по-идее должны отсчитывать левый отступ от родителя, а это Див, и он 50пк, а получается что отступ расчитывается от БОДИ, почему так?

Потому что офсет высчитывается не от родителя, а от того элемента, который формирует локальную точку отсчета координат

#wrap добавь position: relative, и увидишь разницу

Link to comment
Share on other sites

  • 0
offsetParent returns a reference to the object which is the closest (nearest in the containment hierarchy) positioned containing element. If the element is non-positioned, the root element (html in standards compliant mode; body in quirks rendering mode) is the offsetParent. offsetParent returns null when the element has style.display set to "none".

Если элемент не позиционирован, возвращается ссылка на корневой элемент - html или body.

Попробуй позиционировать wrap.

UPD. Писал одновременно с s0rr0w, честное слово )

Edited by shvv
Link to comment
Share on other sites

  • 0

Т.е. выходит, что если родителю не заданы position: relative; или position: absolute; или position: fixed;, то точка отсчёта идёт от БОДИ?

А если заданы position: relative; или position: absolute; или position: fixed;, то точка отсчёта идёт от родителей?

Link to comment
Share on other sites

  • 0

Да. По этому и нужен цикл, чтобы эту ситуацию предусмотреть.

2s0rr0w:

У меня тут проблемка возникла, не понимаю почему так происходит. Есть вот такой код:


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
<title>Фильтр</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<style type="text/css">
* {
margin: 0;
padding: 0;
font: 11px "Trebuchet MS", Verdana, Tahoma, sans-serif;
}

body {
margin: 10px;
}

#header {
position: relative;
height: 98px;
border: 1px solid;
}
</style>

<script type="text/javascript">
function test() {
var cont = document.getElementById('links');
var head = document.getElementById('header');
var lnk = cont.getElementsByTagName('a');

cont.parentNode.removeChild(cont);

for (var i = 0; i < lnk.length; i++) {
head.appendChild(lnk[i]);
}
}

function getBounds(obj) {
var x = 0;
var y = 0;
var prnt = obj;

while (prnt) {
x += prnt.offsetLeft;
y += prnt.offsetTop;
prnt = prnt.offsetParent;
}

var x1 = x + obj.offsetWidth;
var y1 = y + obj.offsetHeight;

return {'x0': x, 'y0': y, 'x1': x1, 'y1': y1, 'w': obj.offsetWidth, 'h': obj.offsetHeight}
}

window.onload = function() {
test();
}
</script>

</head>

<body>

<div id="links">
<a href="#">link 1</a>
<a href="#">link 2</a>
<a href="#">link 3</a>
<a href="#">link 4</a>
<a href="#">link 5</a>
<a href="#">link 6</a>
<a href="#">link 7</a>
<a href="#">link 8</a>
<a href="#">link 9</a>
<a href="#">link 10</a>
<a href="#">link 11</a>
<a href="#">link 12</a>
<a href="#">link 13</a>
</div>

<div id="header">

</div>

</body>
</html>

Вопрос: почему ссылки вставляются через одну?

Т.е. link 1, link 3, link 5 и т.д. Совсем не понимаю почему так происходит.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy