Кутаиси, Грузия
Грузия - одна из немногих стран бывшего Советского Союза, не имеющая финансовой зависимости от России. Это отражается на многих факторах жизни. Это также являлось одной из предпосылок моего посещения этой страны.
Грузия - одна из немногих стран бывшего Советского Союза, не имеющая финансовой зависимости от России. Это отражается на многих факторах жизни. Это также являлось одной из предпосылок моего посещения этой страны.
За 20 лет непонятной экономической политики мы (граждане Беларуси) уже не первый раз сталкиваемся с ситуацией, когда правительство громко заявляет, а, на самом деле, все эти заявления выглядят как пук в воду. Вот и на этот раз, нам обещали светлое будущее и твердый рубль, а теперь под видом 30-процентного налога прячут девальвацию белорусского рубля.
Почему это беспокоит именно меня? Да потому, что моя зароботная плата привязана к курсу доллара. Если бы курс вырос на 30 процентов, я бы не обратил на это внимания, но а теперь моя зарплата в реальном долларовом эквиваленте стала на 30 процентов меньше.
Страдает малый и средней бизнес, который был ориентирован на продажу импортных товаров. Закупать их надо за валюту, розничную цену поднимать нельзя, белорусское покупать никто не будет (телевизоры, например), что делать в такой ситуации не понятно.
Мне кажется, что белорусская экономическая модель себя изжила окончательно, и единственный вариант – признать ее несостоятельность и поменять вектор развития.
Полазил в интернете и нашел чуть-чуть снимков Минска 80-х – 90-х годов. Очень интересно на самом деле.
Самый популярный сайт страны водрузив знамя Министерства обороны публикует у себя на сайте «дневники солдата». Я их почитываю от нечего делать. После очередной части я понял, что ничего толкового от этой серии статей не выйдет.
Попробую описать, почему у меня сложилось такое мнение.
Если внимательно читать стаьи, то можно заметить, что вместе с Антоном Суряпиным (автором дневников) в части иногда присутствует фотограф тутбая. Становится понятно, что написание этих статей было согласовано с начальством воинской части, а те в свою очередь получили согласие из Министерства обороны. А это значит, что будут предприняты все меры, чтобы журналист не увидел той настоящей армии, которая существует в нашей стране.
Могу точно сказать, что он не увидит:
Все это присутствует в современной белорусской армии, и, безусловно, с этим столкнутся другие солдаты срочной службы, не имеющие за спиной поддержки крупного информационного ресурса.
Всплывающие при наведении подсказки перестают быть популярными. Причиной этому можно назвать развитие мобильного интернета, а на мобильных устройствах, как известно, не такого понятия как наведение, там есть либо «нажать», либо «не нажать». Однако существуют такие ситуации, в которых без всплывающих подсказок не обойтись.
Многие для такого рода функцилнала используют различные JavaScript
библиотеки. Но зачем? Достаточно только CSS
с псевдо-элементами и использования значения аттрибутов в них.
Сразу скажу, что поддержка у всех этих фич есть, начиная с Internet Explorer 8.
Теперь код.
<abbr
data-title="Белорусская Федерация Компьютерного Спорта"
class="popover">
БФКС
</abbr>
В данном примере я использовал тэг abbr
, но использовать можно абсолютно любой, какой вам нравится.
В аттрибуте data-title
хранится текст всплывающей подсказки, а класс popover
необходим для написания стилей.
abbr {
font: 16px 'Trebuchet MS';
border-bottom: 1px dashed #666;
}
.popover {
position: relative;
}
.popover:after {
display: inline-block;
font-size: 8px;
content: '?';
vertical-align: top;
margin-left: 10px;
}
.popover:before {
display: none;
position: absolute;
left: 0;
top: 100%;
background-color: #000;
color: #fff;
content: attr(data-title);
padding: 5px;
border-radius: 4px;
}
.popover:hover:before{
display: block;
}
Здесь внимания заслуживает только вот этот псевдо-элемент .popover:before
, а конкретнее строка content: attr(data-title)
. В не мы указываем, что хотим, чтобы содержимым content
нашего :before
было значение аттрибута data-title
– attr(data-title)
;
Периодически возникает необходимость дать пользователю работать с веб-сайтом / веб-аппом без интернета. Тут на помощь разработчику приходят всякие браузерные хранилища: localStorage
, WebSQL
, IndexedDB
. И если хранить текстовую информацию легко, то как быть с изображениями? Зачастую из API приходит только ссылка на фотографию или картинку. Один из способов конвертировать изображение в base64
и хранить это код, вставляя его потом в аттрибут src
нашего тега img
. Вот небольшая функция, которая делает такую конвертацию:
function saveImage(url) {
var img = document.createElement("img");
img.src = url;
img.onload = function() {
var key = encodeURIComponent(url),
canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
localStorage.setItem(key, canvas.toDataURL("image/png"));
}
}
Она конвертирует изображения в base64
-код, используя canvas
, затем сохраняет его в localStorage
с ключем key
. key
– это наш адрес изображения (url
). Теперь в любой момент мы можем достать нашу картинку из локального хранилища и показать пользователю. Интернет для этого не нужен.
Иногда возникает необходимость с помощью JavaScript определить online/offline статус. Например, для того, чтобы показывать эту информацию пользователю или загружать какие-то данные из offline-хранилища. Вот как выглядит эта проверка в JS:
if(navigator.onLine) {
// Устройство в интернете
} else {
// Устройство не подключено к интернету
}
Это свойство поддерживается всеми современными браузерами кроме Opera Mini
.
Продолжая тему всяких интерактивных и не очень элементов для сайта, обратим взор на «аккордеон». Это на самом деле хороший способ уместить большое количество информации на маленькой площади.
Давайте сделаем наш аккордеон без Javascript на чистом CSS. Как всегда, сначала ДЕМО.
HTML:
<div class="wrapper clearfix">
<ul class="accordion clearfix">
<li>
<input type="radio" name="accordion" checked="checked" id="id1">
<label for="id1">Option 1</label>
<div class="content">
1 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
</li>
<li>
<input type="radio" name="accordion" id="id2">
<label for="id2">Option 2</label>
<div class="content">
2 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
</li>
<li>
<input type="radio" name="accordion" id="id3">
<label for="id3">Option 3</label>
<div class="content">
3 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
</li>
</ul>
</div>
Итак, у нас список ul.accordion
с тремя элементами. У каждого элемента есть input[type="radio"]
для определения отображать контент или нет; label
, где мы храним заголовок и div.content
с нашим текстом и/или графикой.
CSS:
.wrapper {
width: 100%;
min-width: 320px;
}
.clearfix:before, .clearfix:after {
display: table;
content: ' ';
}
.accordion {
list-style: none;
padding: 0;
margin: 0;
display: block;
position: relative;
}
.accordion li {
display: block;
}
.accordion li label {
padding: 10px;
background-color: #eee;
display: block;
font-weight: 700;
cursor: pointer;
}
.accordion li .content {
display: none;
padding: 10px;
}
.accordion li input {
display: none;
}
.accordion li input:checked ~ label {
background-color: #fff;
}
.accordion li input:checked ~ .content {
display: block;
}
Наши инпуты делаем невидимыми, а с помощью input:checked ~ .content
показываем только тот контент, input
, для которого выбран.
И еще раз ДЕМО.
Уже с давних пор, при добавлении ссылки на пост в моем блоге в сообщение твиттера, в приложении сервиса или у них на сайте можно увидеть вот такую карточку статьи:
Называется это Twitter Card
и делается это очень легко с помощью нескольких мета-тегов на странице:
<meta name="twitter:site" content="@mobilaname">
<meta name="twitter:creator" content="@ashorror">
<meta name="twitter:card" content="summary">
<meta name="twitter:url" content="http://blog.mobila.name/post/543cf10b11d0c/">
<meta name="twitter:title" content="Украина, Херсонская область">
<meta name="twitter:description" content="Вчера утром поездом выехал в Украину. Первый пункт назначения - Новая Каховка.Поезд примчал меня в Мелитополь. Сюда едут те, кто потом едет на отдых на Азовское море. Население Мелитополя - 150 тысяч человек.">
<meta name="twitter:image" content="http://ic.pics.livejournal.com/larchanka/20861394/31955/original.jpg">
Давайте разберем их все.
twitter:site
- аккаунт сайта в твиттере, включая '@'twitter:creator
- аккаунт автора в твиттере, включая '@'twitter:card
- Тип карточки: summary, photo или video.twitter:url
- Адрес страницы в интернете.twitter:title
- Заголовок статьи.twitter:description
- Описание статьи до 200 символов.twitter:image
- Изображение для карточки.Когда все эти теги уже вставлены на страницы вашего сайта, самое время подать заявку для вашего домена. Подтверждение заявки – символический процесс и проходит почти сразу. Сделать этом можно на специальной странице.
Иногда в JavaScript необходимо получить размер изображения. И все бы неплохо, но в связи со всякими Retina-дисплеями и другими экранами с высокой плотностью пикселей, изображения на страницу ставят большого размера, а потом их уменьшают. В итоге простыми методами получить размер становится тяжеловато.
Вот способ узнать необходимые параметры с помошью неизменяемых свойств naturalWidth
и naturalHeight
.
var src="http://path.to/image.jpg",
img = new Image();
img.src = src;
img.onload = function() {
console.log('Ширина изображения: %s пикселей', this.naturalWidth);
console.log('Высота изображения: %s пикселей', this.naturalHeight);
}
3.1 тыс.
3.1 тыс.
16.4 тыс.