{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом css",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/www.blogengine.me\/blogs\/tags\/css\/",
    "feed_url": "https:\/\/www.blogengine.me\/blogs\/tags\/css\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/www.blogengine.me\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "120274",
            "url": "https:\/\/bolknote.ru\/all\/3478\/",
            "title": "Картинка на чистом CSS-2",
            "content_html": "<div class=\"e2-text-table\">\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n<tr>\n<td><img width=\"660\" height=\"306\" src=\"\/\/bolknote.ru\/imgs\/2011.11.12.jpg\" alt=\"Ещё картинка на чистом CSS (82.31КиБ)\"><\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>Я тут всё это время думал как дёшево улучшить свой <a href=\"\/2011\/11\/03\/~3466\">конвертор картинок в чистый CSS<\/a> и придумал.<\/p>\n<p>Выкинул «radial-gradient» и стал использовать «linear-gradient». Картинка, которая в прошлой версии занимала 164КБ, сейчас занимает <s>89<\/s> 79. Это уже неплохо, в сжатом (gzip) виде этот код занимает 19КБ, что всего в два с половиной раза больше, чем исходное изображение в PNG. Результат можно сильно улучшить, если отказаться от повтора цвета, но изображения с мелкими деталями (с текстом, например) пострадают.<\/p>\n<p>Кстати говоря, логотип студии Лебедева при конвертации из PNG (6,7КБ) уменьшился до <s>1,6КБ<\/s> 1,3КБ. Это уже реальная экономия, если бы не префиксы браузеров.<\/p>\n<p>Отказ от радиального градиента в пользу линейного позволил мне кодировать целую строку изображения одной конструкцией, что, в свою очередь, позволило сильно экономить на повторяющихся байтах (кстати, можно попробовать группировать пиксели по вертикали и горизонтали, а потом выбирать лучший вариант).<\/p>\n<p>Кстати этот раз «Опера», увы, не смогла показать картинку, так как, похоже, не поддерживает позиционирование для линейных градиентов.<\/p>\n<p><b>Добавлено позднее<\/b>: сделал оптимизацию, теперь конвертор делает два прогона: один просматривает пиксели по горизонтали, второй по вертикали. Выбирается тот, который даёт наименьший результат.<\/p>\n<p>Ключи запуска те же.<\/p>\n<pre class=\"e2-text-code\"><code class=\"php\">&lt;?\r\n\/\/ ffccbb → fcb\r\n\/\/ ff0000 → red\r\n\/\/ abcdef → abcdef\r\nfunction Bo_shortcolor($color) {\r\n    static $shortnames = array(\r\n        &quot;c0c0c0&quot; =&gt; &quot;silver&quot;,\r\n        &quot;808080&quot; =&gt; &quot;gray&quot;,\r\n        &quot;800000&quot; =&gt; &quot;maroon&quot;,\r\n        &quot;ff0000&quot; =&gt; &quot;red&quot;,\r\n        &quot;800080&quot; =&gt; &quot;purple&quot;,\r\n        &quot;008000&quot; =&gt; &quot;green&quot;,\r\n        &quot;808000&quot; =&gt; &quot;olive&quot;,\r\n        &quot;000080&quot; =&gt; &quot;navy&quot;,\r\n        &quot;008080&quot; =&gt; &quot;teal&quot;,\r\n        &quot;f0ffff&quot; =&gt; &quot;azure&quot;,\r\n        &quot;f5f5dc&quot; =&gt; &quot;beige&quot;,\r\n        &quot;ffe4c4&quot; =&gt; &quot;bisque&quot;,\r\n        &quot;a52a2a&quot; =&gt; &quot;brown&quot;,\r\n        &quot;ff7f50&quot; =&gt; &quot;coral&quot;,\r\n        &quot;ffd700&quot; =&gt; &quot;gold&quot;,\r\n        &quot;808080&quot; =&gt; &quot;gray&quot;,\r\n        &quot;008000&quot; =&gt; &quot;green&quot;,\r\n        &quot;808080&quot; =&gt; &quot;grey&quot;,\r\n        &quot;4b0082&quot; =&gt; &quot;indigo&quot;,\r\n        &quot;fffff0&quot; =&gt; &quot;ivory&quot;,\r\n        &quot;f0e68c&quot; =&gt; &quot;khaki&quot;,\r\n        &quot;faf0e6&quot; =&gt; &quot;linen&quot;,\r\n        &quot;800000&quot; =&gt; &quot;maroon&quot;,\r\n        &quot;000080&quot; =&gt; &quot;navy&quot;,\r\n        &quot;808000&quot; =&gt; &quot;olive&quot;,\r\n        &quot;ffa500&quot; =&gt; &quot;orange&quot;,\r\n        &quot;da70d6&quot; =&gt; &quot;orchid&quot;,\r\n        &quot;cd853f&quot; =&gt; &quot;peru&quot;,\r\n        &quot;ffc0cb&quot; =&gt; &quot;pink&quot;,\r\n        &quot;dda0dd&quot; =&gt; &quot;plum&quot;,\r\n        &quot;800080&quot; =&gt; &quot;purple&quot;,\r\n        &quot;ff0000&quot; =&gt; &quot;red&quot;,\r\n        &quot;fa8072&quot; =&gt; &quot;salmon&quot;,\r\n        &quot;a0522d&quot; =&gt; &quot;sienna&quot;,\r\n        &quot;c0c0c0&quot; =&gt; &quot;silver&quot;,\r\n        &quot;fffafa&quot; =&gt; &quot;snow&quot;,\r\n        &quot;d2b48c&quot; =&gt; &quot;tan&quot;,\r\n        &quot;008080&quot; =&gt; &quot;teal&quot;,\r\n        &quot;ff6347&quot; =&gt; &quot;tomato&quot;,\r\n        &quot;ee82ee&quot; =&gt; &quot;violet&quot;,\r\n        &quot;f5deb3&quot; =&gt; &quot;wheat&quot;,\r\n    );\r\n\r\n    $c = strtolower($color);\r\n    if (isset($shortnames[$c])) {\r\n        return $shortnames[$c];\r\n    }\r\n\r\n    if ($c[0] == $c[1] &amp;&amp; $c[2] == $c[3] &amp;&amp; $c[4] == $c[5]) {\r\n        return &#039;#&#039; . $c[1] . $c[3] . $c[5];\r\n    }\r\n\r\n    return &#039;#&#039; . $c;\r\n}\r\n\r\nclass Bo {\r\n    public function __get($num) {\r\n        return $num ? $num . &#039;px&#039; : 0;\r\n    }\r\n}\r\n\r\nfunction Bo_convert_helper($im, $lim1, $lim2, $getpix, $dotmask, $z) {\r\n    $end  = $lim1 - 1;\r\n    $dots = array();\r\n\r\n    for ($o1 = 0; $o1&lt;$lim2; $o1++) {\r\n        $coll = array();\r\n        $prev    = null;\r\n        $start   = 0;\r\n\r\n        for ($o2 = 0; $o2&lt;$lim1; $o2++) {\r\n            $pixel = $getpix($im, $o2, $o1);\r\n\r\n            if ($prev !== null &amp;&amp; $prev !== $pixel || $o2 == $end) {\r\n                if ($prev !== null) {\r\n                    $color = Bo_shortcolor(vsprintf(&#039;%02x%02x%02x&#039;, $prev));\r\n\r\n                    $coll[] = &quot;$color {$z-&gt;$start},$color {$z-&gt;$o2}&quot;;\r\n                }\r\n\r\n                if ($o2 == $end &amp;&amp; $prev != $pixel) {\r\n                    $color = Bo_shortcolor(vsprintf(&#039;%02x%02x%02x&#039;, $pixel));\r\n                    $cell[] = &quot;$color {$z-&gt;$o2}&quot;;\r\n                }\r\n\r\n                $start = $o2;\r\n            }\r\n\r\n            $prev = $pixel;\r\n        }\r\n\r\n        $dots[] = sprintf($dotmask, implode(&#039;,&#039;, $coll), $z-&gt;$o1);\r\n    }\r\n\r\n    return $dots;\r\n}\r\n\r\n\r\nfunction Bo_convert($filename, $prefix = &#039;&#039;) {\r\n    $z = new Bo();\r\n\r\n    if (!file_exists($filename) &amp;&amp; !is_readable($filename)) {\r\n        throw new Exception(&#039;File not found.&#039;);\r\n    }\r\n\r\n    $types = array(\r\n        IMAGETYPE_JPG =&gt; &#039;jpeg&#039;,\r\n        IMAGETYPE_PNG =&gt; &#039;png&#039;,\r\n        IMAGETYPE_GIF =&gt; &#039;gif&#039;,\r\n    );\r\n\r\n    $imagedata = @getimagesize($filename);\r\n    if (!is_array($imagedata) || !isset($imagedata[2]) || !isset($types[$imagedata[2]])) {\r\n        throw new Exception(&#039;Unknown image format&#039;);\r\n    }\r\n\r\n    $im = call_user_func(&quot;imagecreatefrom&quot; . $types[$imagedata[2]], $filename);\r\n    $sw = $w = imagesx($im);\r\n    $sh = $h = imagesy($im);\r\n\r\n    $hfunc = create_function(&#039;$im, $x, $y&#039;, &#039;return imagecolorsforindex($im, imagecolorat($im, $x, $y));&#039;);\r\n    $hmask = &quot;{$prefix}linear-gradient(0,%s) 0 %s&quot;;\r\n\r\n    $hdots = join(&#039;,&#039;, Bo_convert_helper($im, $w, $h, $hfunc, $hmask, $z));\r\n\r\n    $vfunc = create_function(&#039;$im, $y, $x&#039;, &#039;return imagecolorsforindex($im, imagecolorat($im, $x, $y));&#039;);\r\n    $vmask = &quot;{$prefix}linear-gradient(90,%s) %s 0&quot;;\r\n\r\n    $vdots = join(&#039;,&#039;, Bo_convert_helper($im, $h, $w, $vfunc, $vmask, $z));\r\n\r\n    if (strlen($hdots) &gt; strlen($vdots)) {\r\n        $dots = $vdots;\r\n        $sw = 1;\r\n    } else {\r\n        $dots = $hdots;\r\n        $sh = 1;\r\n    }\r\n\r\n    return &lt;&lt;&lt;HTML\r\n&lt;head&gt;\r\n&lt;title&gt;$filename converted in background by Evgeny Stepanischev \/\/bolknote.ru&lt;\/title&gt;\r\n&lt;style text=&quot;text\/css&quot;&gt;\r\n    div {\r\n        background: $dots;\r\n        background-repeat: no-repeat;\r\n        {$prefix}background-size: {$sw}px {$sh}px;\r\n        background-size: {$sw}px {$sh}px;\r\n        width: {$w}px; height: {$h}px;\r\n    }\r\n&lt;\/style&gt;\r\n&lt;body&gt;\r\n&lt;div&gt;&lt;\/div&gt;\r\n&lt;\/body&gt;\r\nHTML;\r\n}\r\n\r\nif ($_SERVER[&#039;argc&#039;] &lt; 2) {\r\n    echo &lt;&lt;&lt;HELP\r\nImage to background CSS convertor v2 by Evgeny Stepanischev. \/\/bolknote.ru Nov 2011\r\n\r\nUsage: {$_SERVER[&#039;argv&#039;][0]} filename [prefix]\r\n\r\nfilename  - image file name (PNG, JPEG or GIF)\r\nprefix    - your browser name (Opera, IE, FF, Safari, Chrome)\r\n\r\nHELP;\r\nexit;\r\n}\r\n\r\n$browsers = array(\r\n    &#039;ie&#039;     =&gt; &#039;-ms-&#039;,\r\n    &#039;opera&#039;  =&gt; &#039;-o-&#039;,\r\n    &#039;safari&#039; =&gt; &#039;-webkit-&#039;,\r\n    &#039;chrome&#039; =&gt; &#039;-webkit-&#039;,\r\n    &#039;chromium&#039; =&gt; &#039;-webkit-&#039;,\r\n    &#039;ff&#039; =&gt; &#039;-moz-&#039;,\r\n    &#039;firefox&#039; =&gt; &#039;-moz-&#039;,\r\n);\r\n\r\nif (isset($_SERVER[&#039;argv&#039;][2])) {\r\n    $type = strtolower($_SERVER[&#039;argv&#039;][2]);\r\n    $prefix = isset($browsers[$type]) ? $browsers[$type] : &#039;-&#039; . $type . &#039;-&#039;;\r\n} else {\r\n    $prefix = &#039;&#039;;\r\n}\r\n\r\ntry {\r\n    echo Bo_convert($_SERVER[&#039;argv&#039;][1], $prefix);\r\n} catch (Exception $e) {\r\n    echo &quot;Error: &quot;, $e-&gt;getMessage(), &quot;\\n&quot;;\r\n    exit(1);\r\n};<\/code><\/pre>",
            "date_published": "2011-11-12T01:24:00+05:00",
            "date_modified": "2023-06-07T17:41:14+05:00",
            "tags": [
                "css",
                "php",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Sat, 12 Nov 2011 01:24:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "120274",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "130909",
            "url": "https:\/\/bolknote.ru\/all\/1436\/",
            "title": "Фокусы с GIF, прозрачность и hover",
            "content_html": "<style type=\"text\/css\">\na.link-2007-11-01-gun { border: 0 }\na.link-2007-11-01-gun:hover img { background: black }\na.link-2007-11-01-gun img { margin: 0px; border-right: 2px solid black; background: white }\n<\/style>\n<div style=\"float: left; width: 115px; height: 29px; margin: 10px\"><p><a href=\"#\" class=\"link-2007-11-01-gun\" align=\"left\"><img src=\"\/imgs\/2007.11.01.03.gif\" border=\"0\" width=\"115\" height=\"29\" alt=\"\" align=\"center\" \/><\/a><\/p>\n<\/div><p>Самые внимательные, наверное, заметили, что в прошлых заметках у меня на картинке использовалась эмуляция эффекта наведения на ссылку — посмотрите, если навести на картинку мышку, «ссылка», выделенная синим, на картинке подчеркнётся. И это не JavaScript.<\/p>\n<p>Объяснение очень простое — картинка сделана с прозрачностью, далее при помощи CSS под неё подставлен белый фон, а при наведении (селектор «:hover») фон меняется на голубой. Такой же эффект использован на картинке с пистолетом слева (наведите мышку). Ссылка на картинке обязательна — без неё в Internet Explorer (версии ниже 7-й) фон менять не будет, «:hover» просто не сработает. Таблица стилей для этой картинки выглядит вот так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">a.gun:hover img { background: black } \/* стиль при наведении мышкой *\/\na.gun img { margin: 0px; background: white } \/* убираем поля в Opera и подкладываем белый фон *\/<\/code><\/pre><\/pre><p>HTML, соотвественно:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;a href=&quot;#&quot; class=&quot;gun&quot;&gt;&lt;img src=&quot;gun.gif&quot; \/&gt;&lt;\/a&gt;<\/code><\/pre><\/pre><p>Если вам не ясно, почему пистолетик «стреляет» (т. е. почему изображение движется, когда наводишь мышку), то тут всё просто — прозрачная область движется (это animated GIF), на белом фоне этого не видно, когда фон меняется, создаётся эффект движущейся пули.<\/p>\n<p>Ещё интересные эффекты можно получить, если использовать альфа-канал (полупрозрачность) в формате PNG, но, к сожалению, об анимации тут придётся забыть.<\/p>\n",
            "date_published": "2007-11-01T15:41:00+05:00",
            "date_modified": "2024-09-25T19:53:26+05:00",
            "tags": [
                "css",
                "gif",
                "html",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Thu, 01 Nov 2007 15:41:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "130909",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}