Javascript.RU

Координаты элемента на странице

Update: Более новый материал по этой теме находится по адресу https://learn.javascript.ru/coordinates.

Для кросс-браузерного вычисления координат элемента давно используется суммирование offsetLeft/offsetTop. Список глюков этого подхода такой же длинный, как история его существования.

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

Логика этого подхода довольно проста.

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

В качестве offsetParent обычно выступает родитель parentNode. Но это не всегда так.

Например, для элемента с position='absolute' родителем по позиционированию является ближайший позиционированный родитель, то есть первый элемент в цепочке вложенности, у которого свойство position - одно из: absolute, relative или fixed(не поддерживается IE<7).

Наиболее подробно это описано в стандарте CSS: containing block details. Этот самый "containing block" - как раз и определяет offsetParent, от которого отсчитывается позиция элемента.

Как браузер находит elem.offsetParent

Двигаемся вверх по цепочке родителей elem, останавливаясь на следующих элементах, которые являются offsetParent:

  • <body>
  • элемент, у которого position - не static(значение по умолчанию)
  • элементы table,th,td - если elem.position='static'

У элемента <body> никогда нет offsetParent.

В IE 7+/Opera у элементов с elem.position='fixed' нет offsetParent.

Сдвиг относительно offsetParent'а задается свойствами offsetTop/offsetLeft:

Остается пройтись по всем offsetParent и просуммировать сдвиги. Последним offsetParent обычно является body:

function getOffsetSum(elem) {
    var top=0, left=0
    while(elem) {
        top = top + parseFloat(elem.offsetTop)
        left = left + parseFloat(elem.offsetLeft)
        elem = elem.offsetParent        
    }
    
    return {top: Math.round(top), left: Math.round(left)}
}

Основных проблем с этим кодом две.

  1. Он слегка глючит, в разных браузерах - по-разному. Есть проблемы с border'ами элементов, ошибки при прокрутке внутри элементов и некоторые другие.
  2. Он медленный. Каждый раз приходится пройти всю цепочку offsetParent'ов.

Вместо того, чтобы писать длинный кроссбраузерный код с разбором багов, который уж точно везде работает корректно, рассмотрим альтернативное решение, которое мало того что соответствует стандарту - его отлично поддерживают Internet Explorer 6+, Firefox 3+ и Opera 9.62+.

Этот малоизвестный метод по стандарту должен быть у каждого элемента DOM.

На момент написания статьи он реализован в SVN у Webkit. Для нас это значит, что Chrome и Safari с его поддержкой будут готовы уже скоро.

Он возвращает прямоугольник, ограничивающий элемент.

Важно, что координаты прямоугольника заданы относительно окна, а не документа, то есть не учитывают прокрутку страницы. Кроме того, координаты прямоугольника могут быть дробными в Firefox 3.

Координаты элемента на странице - это левый-верхний угол прямоугольника + прокрутка страницы.

Код обработчика onclick:

var br=this.getBoundingClientRect()
alert("Top:"+br.top+", Left:"+br.left+", Right:"+br.right+", Bottom:"+br.bottom)
Как работает getBoundingClientRect() ?

По стандарту CSS любое содержимое находится внутри некоторого прямоугольника: css box.

В случае с блочными элементами, например DIV - этим прямоугольником яляется сам элемент. Такой прямоугольник называют block box.
Если элемент строчный, например, длинный текст - он уже может быть не такой простой формы, а требует для отображения нескольких прямоугольников anonymous box. Обо всем этом подробно об этом написано в стандарте: http://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level".

Так что содержание элемента DOM может находится как в одном, так и в нескольких прямоугольниках css box.

Можно получить список всех прямоугольников, соответствующих elem, вызовом elem.getClientRects(). Здесь IE<8 может сделать свои прямоугольники, не соответствующие стандарту, но они для нас не играют роли, так как метод getClientRects() нам не нужен.

Метод elem.getBoundingClientRect() возвращает один (минимальный) прямоугольник, который включает в себя все прямоугольники getClientRects() с содержимым элемента.

На основе метода elem.getBoundingClientRect() мы можем сделать новый вариант функции:

function getOffsetRect(elem) {
    // (1)
    var box = elem.getBoundingClientRect()
    
    // (2)
    var body = document.body
    var docElem = document.documentElement
    
    // (3)
    var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop
    var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft
    
    // (4)
    var clientTop = docElem.clientTop || body.clientTop || 0
    var clientLeft = docElem.clientLeft || body.clientLeft || 0
    
    // (5)
    var top  = box.top +  scrollTop - clientTop
    var left = box.left + scrollLeft - clientLeft
    
    return { top: Math.round(top), left: Math.round(left) }
}
  1. Получить ограничивающий прямоугольник для элемента.
  2. Задать две переменных для удобства
  3. Вычислить прокрутку документа. Все браузеры, кроме IE, поддерживают pageXOffset/pageYOffset, а в IE, при наличии DOCTYPE прокрутка вычисляется либо на documentElement(<html>), иначе на body - что есть то и берем
  4. Документ(html или body) бывает сдвинут относительно окна (IE). Получаем этот сдвиг.
  5. Прибавляем к координатам относительно окна прокрутку и вычитаем сдвиг html/body, чтобы получить координаты относительно документа

Для Firefox дополнительно мы округляем координаты вызовом Math.round().

На демо находятся 3 вложенных DIV'а. Все они с border, некоторые с position/margin/padding.

Клик на внутреннем отображает значения getOffsetSum/getOffsetRect, а также показывает координаты курсора на момент клика: event.pageX/pageY.

Координаты выводятся сразу под DIV'ами.

На момент написания статьи демо работает в IE6+,Firefox 3+ и Opera 9.62+.

Сравнить getOffsetSum и getOffsetRect
getOffsetSum:значение getOffsetSum()
getOffsetRect:значение getOffsetRect()
event:координаты клика мышью относительно документа

Обратите внимание: результаты getOffsetSum(elem) и getOffsetRect(elem) не во всех браузерах совпадают.

Чтобы увидеть, какой вариант правильный - кликните на самой верхней-левой точке элемента (на самом верхнем-левом уголке черной рамки).

Тогда в pageX/pageY события появятся реальные значения угла элемента, и вы сможете их сравнить с getOffsetSum/getOffsetRect. Именно для такого сравнения в демо и добавлен вывод event.

Что делать, если метод getBoundingClientRect не поддерживается?

С одной стороны, мы могли бы рассмотреть корректную кросс-браузерную реализацию для FF2/Safari/Chrome/Konqueror. Она включает в себя много кода для обхода браузерных багов при подсчетах, которые нам совсем не интересны.

С другой - FF2 давно умер, а движок Safari/Chrome содержит поддержку getBoundingClientRect в SVN, и значит она скоро будет в релизе.
Думаю, и такие явные аутсайдеры как Konqueror подсуетятся, т.к движок Konqueror - по сути такой же, как и Safari.

Поэтому предлагаю использовать:

function getOffset(elem) {
    if (elem.getBoundingClientRect) {
        // "правильный" вариант
        return getOffsetRect(elem)
    } else {
        // пусть работает хоть как-то
        return getOffsetSum(elem)
    }
}

Скачать полный финальный вариант.

Вы узнали, как вычислять координаты элемента на странице: быстро и точно в IE6+/FF3+/Opera 9.62+, и как-то чтоб работало - в Safari/Chrome/Konqueror.

Скоро и в Safari/Chrome/Konqueror будет поддержка правильного метода, поэтому аутсайдерами останутся лишь совсем редкие и багливые браузеры, и все будет работать ок .


Автор: Константин (не зарегистрирован), дата: 7 мая, 2009 - 18:27
#permalink

Интересная статья. У меня ворос для разработчиков, которые смотрели в код популярных библиотек (jQuery, Mootools, Prototype, extJS) как там реализованно вычисление координат?


Автор: Илья Кантор, дата: 7 мая, 2009 - 21:26
#permalink

Так, как здесь описано, только хуже.
За исключением jQuery/dojo toolkit, где тоже реализовано так, как здесь описано, но в dojo вариант offsetParent лучше проработан для Firefox 2 и Safari/Chrome, а jQuery вообще использует parentNode и делает ряд дополнительных измерений для обнаружения багов браузера.


Автор: Гость (не зарегистрирован), дата: 20 мая, 2009 - 19:12
#permalink

Давно искал урок как найти абсолютную позицию, "Комбинированный вариант" подходит отлично.


Автор: vflash, дата: 22 мая, 2009 - 12:38
#permalink

Хорошая статья. Добавлю только что стоит проверять body что он есть, те body&&body.clientTop


Автор: Гость (не зарегистрирован), дата: 23 мая, 2009 - 12:00
#permalink

Статья супер!МОЛОДЕЦ!


Автор: multimetr, дата: 26 мая, 2009 - 22:14
#permalink

В Opere 9.20 не работает.Видимо в версии 9.62 уже поддерживается.


Автор: ArmA (не зарегистрирован), дата: 10 июня, 2009 - 08:08
#permalink

Большое спасибо за ёмкую статью по существу. А то копать по всем стандартам довольно затруднительно %^>


Автор: Гость (не зарегистрирован), дата: 25 июня, 2009 - 23:58
#permalink

в MooTools 2.2.3, как на меня сама удачная реализация определения координаторов с поддержкой getBoundingClientRect и бордеров элементов. Позволю себе привести часть исходного кода:

getOffsets: function() {
		if (this.getBoundingClientRect){
			var bound = this.getBoundingClientRect(),
			html = document.id(this.getDocument().documentElement),
			scroll = html.getScroll(),
			isFixed = (styleString(this, 'position') == 'fixed');
			return {
				x: parseInt(bound.left, 10) + ((isFixed) ? 0 : scroll.x) - html.clientLeft,
				y: parseInt(bound.top, 10) +  ((isFixed) ? 0 : scroll.y) - html.clientTop
			};
		}

		var element = this, position = {x: 0, y: 0};
		if (isBody(this)) return position;

		while (element && !isBody(element)){
			position.x += element.offsetLeft;
			position.y += element.offsetTop;

			if (Browser.Engine.gecko){
				if (!borderBox(element)){
					position.x += leftBorder(element);
					position.y += topBorder(element);
				}
				var parent = element.parentNode;
				if (parent && styleString(parent, 'overflow') != 'visible'){
					position.x += leftBorder(parent);
					position.y += topBorder(parent);
				}
			} else if (element != this && Browser.Engine.webkit){
				position.x += leftBorder(element);
				position.y += topBorder(element);
			}

			element = element.offsetParent;
		}
		if (Browser.Engine.gecko && !borderBox(this)){
			position.x -= leftBorder(this);
			position.y -= topBorder(this);
		}
		return position;
	}

function styleNumber(element, style){
	return styleString(element, style).toInt() || 0;
};

function borderBox(element){
	return styleString(element, '-moz-box-sizing') == 'border-box';
};

function topBorder(element){
	return styleNumber(element, 'border-top-width');
};

function leftBorder(element){
	return styleNumber(element, 'border-left-width');
};

function isBody(element){
	return (/^(?:body|html)$/i).test(element.tagName);
};

Автор: aavolkoff (не зарегистрирован), дата: 11 августа, 2009 - 15:38
#permalink

В JQuery глюки с clientY функции offset() и подобных в Опере и Хроме вот один из тикетов:
http://dev.jquery.com/ticket/4583


Автор: Гость (не зарегистрирован), дата: 10 января, 2010 - 01:58
#permalink

Очен помогло, спасибо!


Автор: offset (не зарегистрирован), дата: 9 марта, 2010 - 11:14
#permalink

У меня пока не работает как надо getBoundingClientRect(), так как у элементов (body и div) выставлено position:relative без смещений и есть margin у внутреннего div относительно body. Правильно отображает только Хром (Сафари 4 не проверял), остальные браузеры не учитывают margin (IE, Opera, FF), приходится его вручную дописывать к координатам.


Автор: Гость (не зарегистрирован), дата: 27 марта, 2010 - 16:16
#permalink

В своё время много перечитал документации по этому вопросу. Но делалось всё под ужасно бажные IE5.5-6, старую Оперу < 9.1 и Фаерфокс. Наилучшим решение вроде казалось тогда применение getBoundingClientRect(). Но баг с тем, что эксплорер и опера под одни и те же числовые значения рисовали элементы не много, но различающиеся по размеру, иной раз сводил усилия по оформлению страницы к оценке "пойдёт". На тот момент было ужасно интересно заглянуть в код эксплорера и оперы. Кто-нибудь знает как там вычисляется размер элементов и как он соотносится с замерами окон?


Автор: HelpeR, дата: 17 мая, 2010 - 19:14
#permalink

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


Автор: Гость (не зарегистрирован), дата: 11 декабря, 2010 - 10:30
#permalink

Спасибо. Очень помогла.


Автор: DimXenon (не зарегистрирован), дата: 31 марта, 2011 - 18:09
#permalink

Просто хочу сказать Большое Спасибо!
Много-много здоровья и долгих лет жизни автору!
Это то, что я искал!


Автор: yAnTar (не зарегистрирован), дата: 12 апреля, 2011 - 11:06
#permalink

Точно так же реализован offset в jQuery. Но недавно столкнулся с неожиданным багом - есть у меня

с заданной шириной, всередине его есть спаны и в случаи перехода спана на новую строку - в 1 случае getBoundingClientRect дает некорректный координаты - он видит слово на предыдущей строке, а оно уже в следующей находится.

Браузер safari, платформа ipod.


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2011 - 17:21
#permalink

Молоток! Биг сенкс фор ю
очень полезная статья


Автор: Гость (не зарегистрирован), дата: 20 мая, 2011 - 21:22
#permalink

С использованием JQuery

$("#block")
.click(function(e){
X = e.pageX-$(this).offset().left;
Y = e.pageY-$(this).offset().top;
})


Автор: Wayne, дата: 13 августа, 2011 - 12:44
#permalink

Вот рабочая функция. Может кому-то пригодиться. Статья понравилась. И это мой к ней комментарий. Чтобы уж совсем не был пустым коммент, выложил сию функцию.

function ElemCoords(obj)
{
var curleft = 0;
var curtop = 0;
if (obj.offsetParent)
{
while (1)
{
curleft += obj.offsetLeft;
curtop += obj.offsetTop;
if (!obj.offsetParent)
break;
obj=obj.offsetParent;
}
}
else if (obj.x || obj.y)
{
curleft += obj.x;
curtop += obj.y;
}
return {"x":curleft, "y":curtop};
}

Получить координаты элемента можно вызовом функции, типа "ElemCoords(object).x".


Автор: Ленивец (не зарегистрирован), дата: 7 декабря, 2011 - 14:35
#permalink

Отличный код. так лень собирать было самому, просто взял этот. Работает. Спс )


Автор: Гость (не зарегистрирован), дата: 16 августа, 2011 - 01:06
#permalink

автору искренняя благодарность


Автор: Гость (не зарегистрирован), дата: 31 августа, 2011 - 17:50
#permalink

На лето 2011 getBoundingClientRect поддерживается всеми актуальными браузерами.


Автор: Гость (не зарегистрирован), дата: 29 ноября, 2011 - 11:56
#permalink

определите пожалуйста координаты элемента/клика на такой странице:

body {
                background-color:#abcabc;
                margin:0 auto;
                max-width:900px;
                min-width:800px;
                position:relative;
                width:100%;
            }

окошко браузера должно быть открыть шире чем на max-width


Автор: Гость (не зарегистрирован), дата: 3 февраля, 2012 - 04:42
#permalink

Превосходно! Браво! Прекрасная статья. Помогла однозначно разрулить проблемы с обработкой ситуаций сложного позиционирования (fixed->absolute->static->absolute) вложенных элементов. Достойный материал.


Автор: Анонимус (не зарегистрирован), дата: 9 мая, 2012 - 16:14
#permalink
// координаты объекта
function getAbsolutePosition(el) {
	var r = { x: el.offsetLeft, y: el.offsetTop };
	if (el.offsetParent) {
	
		var tmp = getAbsolutePosition(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
}

Автор: cyber, дата: 13 мая, 2012 - 15:46
#permalink
function left (elem) 
{
 var left=0;
	 alert(elem.offsetLeft)
	 while(elem)
	 {
	 
	left += parseFloat(elem.offsetLeft);
	
	 elem= elem.offsetParent;
	 }
	 return Math.round(left);
	 

}

как насчет такого варианта


Автор: ОВА (не зарегистрирован), дата: 30 ноября, 2016 - 20:06
#permalink

Гениально !!!


Автор: Гость (не зарегистрирован), дата: 7 ноября, 2012 - 14:02
#permalink

когда я писал этот (Автор: Гость (не зарегистрирован), дата: 29 ноября, 2011 - 12:56) пример, я имел ввиду что, левый верхний угол body необязательно начинается с верхнего левого угла вьюпорта.
Посмотрите на пример и протестите его на всех IE скроля и не скроля страницу.
Сделать метод, умеющий нормально определять координаты на экране для всех браузеров, включая IE6+, включая режим совместимости, можно.
Для этого нужно всего лишь учесть поправку смещения начала координат относительно вьюпорта:

var div = document.createElement('div');
    div.style.position = 'absolute';
    div.style.left = '0px';
    div.style.top = '0px';
    div.style.display = 'block';
    document.body.appendChild(div);
    var horizontalFix = div.getBoundingClientRect().left;
    var verticalFix = div.getBoundingClientRect().top;

Автор: Гость (не зарегистрирован), дата: 28 декабря, 2012 - 14:47
#permalink

У меня IE 7. Функция getBoundingClientRect не учитывает свойство таблиц cellSpacing при подсчете.


Автор: Гость (не зарегистрирован), дата: 18 мая, 2013 - 10:18
#permalink

Супер!


Автор: pro777 (не зарегистрирован), дата: 13 сентября, 2013 - 19:57
#permalink

Спасибо, отличная статья - помогла!


Автор: Oleg1980 (не зарегистрирован), дата: 28 января, 2014 - 13:20
#permalink

что делать, если имеется пустой div или br на странице, как вычислить его координаты, getBoundingClientRect возвращает прямоугольник с нулевыми координатами?


Автор: Гость (не зарегистрирован), дата: 10 мая, 2014 - 13:19
#permalink

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


Автор: Гость (не зарегистрирован), дата: 24 июля, 2014 - 10:42
#permalink

Адреса страниц


Автор: Гость (не зарегистрирован), дата: 10 ноября, 2015 - 15:34
#permalink

Добрый день. Ситуация следующая. Есть множество елементов на странице, создаются они юезром, ограничения на создание по количеству нет. Можно удалять старые и создавать новые. Их можно ресайзить и перетаскивать. Все они имеют братски-сестринские связи. Как мне сравнить координаты одного елемента, выбранного юзером, с другими, для запрета пересечения элементов друг-другом?


Автор: yifitvaz, дата: 2 апреля, 2019 - 06:33
#permalink

Well, this is my first visit to your blog! Your blog provided us valuable information.You have done a marvelous job.
fireboy and watergirl


Автор: samuelddarden (не зарегистрирован), дата: 4 июня, 2019 - 13:50
#permalink

Все очень открыто с очень четким объяснением проблем. Это было действительно информативно. Ваш сайт очень полезен. zombs royale


Автор: Гость (не зарегистрирован), дата: 8 июня, 2019 - 11:58
#permalink

Спасибо, отличная статья - помогла! порно


Автор: Гость (не зарегистрирован), дата: 8 июня, 2019 - 12:05
#permalink

Автор: Гость (не зарегистрирован), дата: 20 июня, 2019 - 22:36
#permalink

great post.


Автор: Гость (не зарегистрирован), дата: 21 июня, 2019 - 16:47
#permalink

great post.


Автор: Гость (не зарегистрирован), дата: 21 июня, 2019 - 16:48
#permalink

very nice post.


Автор: ducklife (не зарегистрирован), дата: 14 августа, 2019 - 12:39
#permalink

The article gives me a lot of useful and useful information. I have learned a lot from your article.
fnaf


Автор: mi.rafaylik, дата: 29 октября, 2019 - 21:31
#permalink

В статье не учтено, что родитель элемента (или любой вверх по цепочке) может иметь position: sticky, и вся схема просто рухнет, хоть с offsetParent, хоть с getBoundingClientRect. При нулевой прокрутке всё сработает верно, а потом.. Впрочем предлагаю просмотреть пример с демонстрацией проблемы:
jsfiddle.net/rafaylik/sf5Lcrjp

Как можно поступить, если родитель имеет position: sticky:

  1. Сохранить position родителя в переменную
  2. Назначить родителю position: relative
  3. Получить координаты элемента
  4. Вернуть родителю его первоначальный position

И рабочий пример (спасибо Malleys за совет):
jsfiddle.net/Lk74do8u


Автор: suk (не зарегистрирован), дата: 9 июня, 2020 - 06:40
#permalink

Your article content is being very much interested, I am very impressed with your post. I hope to receive more great posts. mapquest driving directions


Автор: aricwalker (не зарегистрирован), дата: 18 июня, 2020 - 05:29
#permalink

A good website, I am happy to find useful information from you. I will keep looking for interesting things about your post. surviv io


Автор: t rex game (не зарегистрирован), дата: 21 июля, 2020 - 06:40
#permalink

Awesome blog. I enjoyed reading your articles. This is truly a great read for me. I have bookmarked https://trexgame.co ">t rex game


Автор: Lisa1812, дата: 14 августа, 2020 - 12:27
#permalink

Thanks for your sharing. Your article is very informative and excellent. And I hope to see your next post soon. You can also access t rex game


Автор: narodna (не зарегистрирован), дата: 21 октября, 2020 - 12:59
#permalink

Гдз математика 5 клас, готові відповіді онлайн шукай за посиланням https://narodna-osvita.com.ua/gdz/gdz-5-clas-matematika


Автор: 먹튀검증 (не зарегистрирован), дата: 22 ноября, 2020 - 06:01
#permalink

It’s actually a nice and useful piece of info.
I am glad that you simply shared this helpful info with
us. Please keep us up to date like this. Thanks for sharing 먹튀검증


Автор: 대출 (не зарегистрирован), дата: 22 ноября, 2020 - 06:02
#permalink

This article is really a fastidious one it assists
new internet people, who are wishing in favor of blogging. 대출


Автор: читать книги онлайн (не зарегистрирован), дата: 29 декабря, 2020 - 03:06
#permalink

На сайте https://likebook.ru вы можете скачать электронные книги бесплатно и без регистрации, читать книги онлайн бесплатно. Электронная библиотека онлайн. Литература, аудио книги, все интересные книги fb2, epub, txt. Слушать аудиокниги онлайн.


Автор: Viktor Orlov (не зарегистрирован), дата: 5 января, 2021 - 23:30
#permalink

Новые рингтоны на телефон скачать бесплатно на сайте https://musezone.su/novye-ringtony-na-telefon


Автор: Google Dino (не зарегистрирован), дата: 1 февраля, 2021 - 17:21
#permalink

Colored dinosaur game is a colorful copy of the original game about dinosaurs. Fast access to your favorite game in an emerging window!


Автор: ValentinShkim (не зарегистрирован), дата: 9 февраля, 2021 - 16:14
#permalink

Скачивайте любое видео с Youtube в mp3 и других форматах - mp4, mkv и webm. Это самый быстрый конвертер YouTube в MP3 в мире!


Автор: kaomoji com (не зарегистрирован), дата: 15 февраля, 2021 - 20:18
#permalink

A large number of music emojis can be found on our website! Click on the link and choose!


Автор: Arlene Howard (не зарегистрирован), дата: 3 марта, 2021 - 17:42
#permalink

If you do not have a free QR code generator, that creates unique and high quality QR codes for you, then watch this video. Click on the link - https://chrome.google.com/webstore/detail/free-qr-code-generator/mienaog...


Автор: Arlene Howard (не зарегистрирован), дата: 3 марта, 2021 - 17:43
#permalink

Create QR code for free! Our QR code generator is easy to use. First you choose a size, then add text and images. You're done in just a few minutes. Your custom QR code can be used on posters, business cards, or other promotional items. Did you make something from our generator? Share it with us! We'll feature it on our blog!


Автор: lindaperryly (не зарегистрирован), дата: 12 марта, 2021 - 09:46
#permalink

Smart tools standard deviation calculator online


Автор: Julian Bryant (не зарегистрирован), дата: 19 марта, 2021 - 19:38
#permalink

You just heard about a new game from a friend called T-Rex dinosaur game. You have never heard about it because it appears in your Google in the absence of Internet connection.


Автор: swoy, дата: 24 марта, 2021 - 01:43
#permalink

Free QR code generator https://free-qr.com/fr/, un logiciel puissant et pratique, vous permet de générer des codes QR gratuitement sans aucun enregistrement. Vous pouvez personnaliser le design, ajouter un logo, saisir les informations requises et créer un code QR. Avec ce générateur de codes QR gratuit, vous avez la possibilité de concevoir des codes QR impressionnants pour promouvoir votre entreprise.


Автор: tiny fishing (не зарегистрирован), дата: 30 марта, 2021 - 12:02
#permalink

Each play is a challenge and you will feel the victor's taste. Join the fun game completely free and without ads tiny fishing


Автор: Max Lowe (не зарегистрирован), дата: 2 апреля, 2021 - 01:54
#permalink

Design din egen Coder-kode gratis: Vælg mellem 50 understøttede udbydere, Tilpas designet til at matche dit brand og tilføj et logo. Du skal blot indtaste de nødvendige oplysninger såsom kontaktoplysninger, hjemmeside adresse og åbningstider og oprette Coder-koden. Desuden er en af de største fordele ved vores gratis generator, at den kan bruges både på skrivebordet og på mobiltelefoner!


Автор: Edwin Hoffman (не зарегистрирован), дата: 16 апреля, 2021 - 20:12
#permalink

Gratis QR-kodegenerator er en gratis online-verktøy som gir deg mulighet til å bygge opp en QR-kode. Vi tilbyr deg muligheten til å lage din egen QR-kode, helt gratis og uten registrering. Velge det første alternativet fra hovedmenyen, som svarer til plassering av kontaktinformasjonen for etablering av en QR-kode. Spiller ingen rolle om det er ditt navn, adresse eller andre opplysninger. Last ned QR-i høy kvalitet for gratis via vår nettside!


Автор: suyo (не зарегистрирован), дата: 17 апреля, 2021 - 09:58
#permalink

I just joined the forum so there are so many things I don’t know yet, I hope to have the help of the boards, and I really want to get to know you all on the forum candy crush soda


Автор: Гость (не зарегистрирован), дата: 26 апреля, 2021 - 22:40
#permalink

You’ve probably seen a lot of websites promising to let you download videos, but none of them works as fast and simple as https://savefromyt.site


Автор: Isabella Jackson (не зарегистрирован), дата: 28 апреля, 2021 - 12:51
#permalink

Amazing blog! Lots of useful information here. I want to say about my article on How to Etcher Download and this function. You can use Install Etcher from the repository on Linux. Keep reading my article.


Автор: Pamela Alexander (не зарегистрирован), дата: 28 апреля, 2021 - 18:13
#permalink

Meet Running dinosaur and his girlfriend in a fun prehistoric game where you jump across rocky terrain. This is a true copy of the original Google Dinosaur Game from the old days.


Автор: Chargebax (не зарегистрирован), дата: 9 мая, 2021 - 13:05
#permalink

My first visit here, really useful - Chargebax


Автор: Aubree Miller (не зарегистрирован), дата: 12 мая, 2021 - 00:04
#permalink

Play mario online. You can select any level out of 32 and also generate a random map.


Автор: yangkuki (не зарегистрирован), дата: 12 мая, 2021 - 12:42
#permalink

I am very impressed with your idea! Thank you very much
word unscrambler


Автор: Гость (не зарегистрирован), дата: 21 мая, 2021 - 15:06
#permalink

Many people wonder where did dinosaur game, the king of dinosaurs go after the old age. In this game, you can take control of a T-Rex and run it to the end. Just swipe up, down or either side to jump over obstacles or knock them down. Follow link -
https://chrome.google.com/webstore/detail/t-rex-running-dinosaur/hklcgjcljkpbpkaammpdgajgoejolfmm


Автор: Patrick Rivera (не зарегистрирован), дата: 29 мая, 2021 - 17:47
#permalink

YouTube to mp3 converter for free - https://ytmp3cc.net/. Insert a link and download videos from 300+ video sites (150+ video sites for free without registration!).


Автор: UK Sexclub (не зарегистрирован), дата: 3 июня, 2021 - 20:08
#permalink

Join our club and enjoy a free chat with hot British women for a long time UK Sexclub


Автор: sabakamusic, дата: 7 июня, 2021 - 23:17
#permalink

A free site to convert online videos in mp3 or mp4 - https://sabakamusic.com ! All you need to do is copy and paste the URL of the desired video. Select the format, adjust the output quality and download your converted file.


Автор: Among Us (не зарегистрирован), дата: 9 июня, 2021 - 12:42
#permalink

Спасибо, что поделились, ваша статья очень хорошая. Вы скачали игру among us mod apk, отличное развлечение.


Автор: Brian Curtis (не зарегистрирован), дата: 16 июня, 2021 - 10:38
#permalink

Thank you for sharing. You can download spotify premium gratis apk to listen to great songs and many great genres of music available in the world today


Автор: Casual North Ireland (не зарегистрирован), дата: 16 июня, 2021 - 14:05
#permalink

Casual North Ireland is web platform made for connecting and free sexy chat in United Kingdom, so check out and enjoy


Автор: Sex Chat in Yorkshire (не зарегистрирован), дата: 16 июня, 2021 - 17:11
#permalink

Find some fine local ladies in UK for hot chat all night long on our web platform Sex Chat in Yorkshire


Автор: Street View Online (не зарегистрирован), дата: 18 июня, 2021 - 11:47
#permalink

What a great and interesting post. I like your writing skills and appreciate your working effort making on this post.


Автор: East England Sex Ads (не зарегистрирован), дата: 29 июня, 2021 - 09:08
#permalink

If you are looking for sexy chat contacts with hot ladies in UK you must to visit East England Sex Ads


Автор: sex contacts glasgow (не зарегистрирован), дата: 5 июля, 2021 - 19:35
#permalink

sex contacts glasgow is the best web platform created for lonley guys in UK to find fine ladies for casual chat contacts


Автор: 2048, дата: 29 июля, 2021 - 23:09
#permalink

How to get 2048 tile in 2048 game : A site on how to win and make progress in the 2048 game - https://game2048game.com/gameplay


Автор: jang dong (не зарегистрирован), дата: 30 июля, 2021 - 07:20
#permalink

i'm so glad i accidentally clicked this. slope unblocked :< <3


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
7 + 11 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum