<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>css - ConsultApp.ru</title>
	<atom:link href="https://consultapp.ru/tag/css/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Веб-разработка, сопровождение информационных систем</description>
	<lastBuildDate>Thu, 10 Oct 2024 18:27:33 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
	<item>
		<title>CSS Container Query: Новый шаг в  адаптивность и независимость блоков страницы</title>
		<link>https://consultapp.ru/css-container-query-new-step-to-adaptive/</link>
		
		<dc:creator><![CDATA[Дмитрий]]></dc:creator>
		<pubDate>Thu, 10 Oct 2024 12:40:57 +0000</pubDate>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[css]]></category>
		<guid isPermaLink="false">https://consultapp.ru/?p=2027</guid>

					<description><![CDATA[<p>Новый функционал, который уже имеет широкую поддержку браузеров и позволяет делать html модули максимально независимыми от остальной страницы. Вы можете задавать поведение внутренних элементов основываясь только на запросы о параметрах контейнерного блока. В целом @container запросы работают так же, как @media запросы, только не к странице, а к определенному особым способом родительскому блоку. Достаточно указать&#8230;</p>
<p>Сообщение <a href="https://consultapp.ru/css-container-query-new-step-to-adaptive/">CSS Container Query: Новый шаг в  адаптивность и независимость блоков страницы</a> появились сначала на <a href="https://consultapp.ru">ConsultApp.ru</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Новый функционал, который уже имеет широкую поддержку браузеров и позволяет делать html модули максимально независимыми от остальной страницы. Вы можете задавать поведение внутренних элементов основываясь только на запросы о параметрах контейнерного блока.</p>



<span id="more-2027"></span>



<p>В целом <code>@container</code> запросы работают так же,  как <code>@media</code> запросы, только не к странице,  а к определенному особым способом родительскому блоку.</p>



<p>Достаточно указать блоку свойство <code><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/container-type" target="_blank" rel="noreferrer noopener">container-type</a>  (size, inline-size, or normal)</code> и он становится контейнером. Так же можно задать ему имя, для уточнения запросов.</p>



<pre class="wp-block-code"><code lang="css" class="language-css">.post {
  container-type: inline-size;
  container-name: sidebar;
}
</code></pre>



<h2 class="wp-block-heading">Базовый синтаксис</h2>



<p>Основываясь на <a href="https://developer.mozilla.org/">md</a><a href="https://developer.mozilla.org/" target="_blank" rel="noreferrer noopener">n</a>, получаем такой синтаксис запроса:</p>



<pre class="wp-block-code"><code lang="css" class="language-css">@container &lt;container-condition&gt;# {
  &lt;stylesheet&gt;
}

/* Пример: */
/* multiple queries in a single condition */
@container (width &gt; 400px) and style(--responsive: true) {
  h2 {
    font-size: 1.5em;
  }
}</code></pre>



<p>Самое интересное тут, что мы можем делать запросы не только о ширине, высоте. Функционал намного шире, мы можем описаться на стили и даже на определенные переменные! Те фактически можем управлять внутренним поведением блока, переопределяя CSS переменные в зависимости от необходимости например.</p>



<h2 class="wp-block-heading">Новые единицы изменения</h2>



<p>Для определения высоты и ширины относительно контейнера появились новые размерности:</p>



<ul class="wp-block-list">
<li><code>cqw</code>: 1% ширины контейенра;</li>



<li><code>cqh</code>: 1% высоты контейнера;</li>



<li><code>cqi</code>: 1% inline размер контейнера;</li>



<li><code>cqb</code>: 1% block размер контейнера;</li>



<li><code>cqmin</code>: меньшее из <code>cqi</code> or <code>cqb</code>;</li>



<li><code>cqmax</code>: большее из <code>cqi</code> or <code>cqb</code>.</li>
</ul>



<h2 class="wp-block-heading">Пример</h2>



<p>В приведенном примере мы постарались раскрыть базовый вариант использования контейнерных запросов на базе поведения блока <code>.item</code>, который опираясь на ширину и переменную, определяемую для одного из родителей, меняет свое поведение. Однако <code>style()</code> работает еще не во всех браузерах, проверяйте совместимость перед использованием в реальных задачах. (работает в Chrome)</p>



<style>
  .testWrapper {
    display: flex;
    flex-flow: row wrap;
    gap: 5px;
  }
  .items {
    container-type: inline-size;
    border: 1px solid black;
    display: flex;
    flex-flow: row wrap;
    justify-content: space-between;
    gap: 5px;
    margin: 10px;
  }
  .items1 {
    width: 300px;
  }
  .items2 {
    width: 200px;
  }
  .items3 {
    width: 100px;
  }

  .thumbnail {
    background-color: rgb(96, 195, 108);
  }
  .text {
    background-color: rgb(237, 57, 87);
  }
  .header {
    background-color: rgb(11, 179, 235);
  }

  .item {
    width: 100%;
    background-color: rgb(54, 54, 54);
    display: grid;
    gap: 5px;
  }

  .item__var2 {
    --variant2: true;
  }

  .item div {
    min-width: 25px;
    min-height: 25px;
  }

  .item div:last-child {
    display: none;
  }

  @container (width > 100px) and (width < 201px) {
    .item {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 10px;
      width: calc(50cqi - 2.5px);
    }
    .item div:last-child {
      grid-column: 1 / span 2;
      display: block;
    }
  }

  @container (width > 100px) and (width < 201px) and style(--variant2: true) {
    .item div:last-child {
      grid-row: 1 / span 2;
      grid-column: 1;
      display: block;
    }
  }

  @container (width > 200px) {
    .item {
      display: grid;
      grid-template-columns: 1fr;
      gap: 10px;
      width: 20cqi;
    }
    .item div:last-child {
      display: block;
    }
  }
</style>
<div class="testWrapper">
  <div class="items items1">
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
  </div>
  <div class="items items2">
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
  </div>
  <div class="items items2 item__var2">
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
  </div>
  <div class="items items3">
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
    <div class="item">
      <div class="thumbnail"></div>
      <div class="header"></div>
      <div class="text"></div>
    </div>
  </div>
</div>



<pre class="wp-block-code"><code lang="css" class="language-css">  .testWrapper {
    display: flex;
    flex-flow: row wrap;
    gap: 5px;
  }
  .items {
    container-type: inline-size;
    border: 1px solid black;
    display: flex;
    flex-flow: row wrap;
    justify-content: space-between;
    gap: 5px;
    margin: 10px;
  }
  .items1 {
    width: 300px;
  }
  .items2 {
    width: 200px;
  }
  .items3 {
    width: 100px;
  }

  .thumbnail {
    background-color: rgb(96, 195, 108);
  }
  .text {
    background-color: rgb(237, 57, 87);
  }
  .header {
    background-color: rgb(11, 179, 235);
  }

  .item {
    width: 100%;
    background-color: rgb(54, 54, 54);
    display: grid;
    gap: 5px;
  }

  .item__var2 {
    --variant2: true;
  }

  .item div {
    min-width: 25px;
    min-height: 25px;
  }

  .item div:last-child {
    display: none;
  }

  @container (width &gt; 100px) and (width &lt; 201px) {
    .item {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 10px;
      width: calc(50cqi - 2.5px);
    }
    .item div:last-child {
      grid-column: 1 / span 2;
      display: block;
    }
  }

  @container (width &gt; 100px) and (width &lt; 201px) and style(--variant2: true) {
    .item div:last-child {
      grid-row: 1 / span 2;
      grid-column: 1;
      display: block;
    }
  }

  @container (width &gt; 200px) {
    .item {
      display: grid;
      grid-template-columns: 1fr;
      gap: 10px;
      width: 20cqi;
    }
    .item div:last-child {
      display: block;
    }
  }</code></pre>



<pre class="wp-block-code"><code lang="markup" class="language-markup">&lt;div class="testWrapper"&gt;
  &lt;div class="items items1"&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="items items2"&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="items items2 item__var2"&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="items items3"&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="item"&gt;
      &lt;div class="thumbnail"&gt;&lt;/div&gt;
      &lt;div class="header"&gt;&lt;/div&gt;
      &lt;div class="text"&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>



<h2 class="wp-block-heading">Итого</h2>



<p>В заключении можно отметить, что мы рассмотрели контейнерные запросы. Очевидно они отлично подходят для отображения различных карточек например, в том числе товарных. Модуль можно написать таким образом, что независимо от ширины экрана, он будет менять отображение относительно своего родителя.</p>
<p>Сообщение <a href="https://consultapp.ru/css-container-query-new-step-to-adaptive/">CSS Container Query: Новый шаг в  адаптивность и независимость блоков страницы</a> появились сначала на <a href="https://consultapp.ru">ConsultApp.ru</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pre-loader для сайта</title>
		<link>https://consultapp.ru/pre-loader-for-site/</link>
		
		<dc:creator><![CDATA[Дмитрий]]></dc:creator>
		<pubDate>Sun, 05 May 2024 10:00:40 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Статьи]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">https://consultapp.ru/?p=1891</guid>

					<description><![CDATA[<p>Как показать предзагрузку сайта до загрузки каких-либо скриптов и полного HTML документа?</p>
<p>Сообщение <a href="https://consultapp.ru/pre-loader-for-site/">Pre-loader для сайта</a> появились сначала на <a href="https://consultapp.ru">ConsultApp.ru</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>В данной статье мы рассмотрим, как показать информацию о процессе загрузки сайта до самой загрузки каких-либо скриптов и полного HTML документа.</p>



<span id="more-1891"></span>



<p>Наша задача каким-то образом показать элемент на странице, до загрузки чего бы то ни было тяжелого вроде скриптов, как минимум полной загрузки <strong>&lt;body&gt;</strong>, а потом отследить загрузку и убрать этот элемент. На первый взгляд это кажется противоречащим самому себе. Как показать что-то, до загрузки части документа, который как раз и содержит визуальную информацию и убрать после? </p>



<p>Однако есть один момент. Теги<strong> &lt;html&gt;</strong>, <strong>&lt;head&gt;</strong> читаются раньше, плюс в CSS есть псевдоэлементы, нас интересует <strong>::before</strong>. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Псевдоэлементы <strong>::before</strong>, <strong>::after </strong>— это часть селекторов<strong>&nbsp;</strong><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements">CSS</a>, которые используют для вставки содержимого, которого нет в исходном коде.</p>
</blockquote>



<h2 class="wp-block-heading">Решение</h2>



<ol class="wp-block-list">
<li>Добавляем стилизованный псевдоэлемент <strong>::before</strong> на тег <strong>&lt;html&gt;</strong> с нужным нам элементом-прелоадером;</li>



<li>Отлавливаем в JS момент загрузки страницы (2 варианта). Убираем отображение загрузки, с помощью добавления класса конца загрузки тегу <strong>&lt;html&gt;</strong>.</li>
</ol>



<h2 class="wp-block-heading">Подробное описание</h2>



<p>Рассмотрим пример добавление прелоадера  на примере нашего сайта. </p>



<p>Добавляем в <strong>&lt;head&gt;</strong>, напрямую или через файл, стили:</p>



<pre title="style.css" class="wp-block-code"><code lang="css" class="language-css line-numbers">html::before {
  background-size: 150px !important;
  opacity: 1;
  content: "";
  display: block;
  position: fixed;
  z-index: 999;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: url("/logo-animate.svg") no-repeat center, #fff;
  transition: opacity 0.3s ease-in;
}

html.loaded::before {
  opacity: 0;
  pointer-events: none;
}</code></pre>



<p>Здесь видно, что в нашем случае <strong>content</strong> &#8212; пустая строка. Мы позиционируем по центру <strong>background</strong> с SVG лоадером, растягивая слой на весь экран, а так же выставляя большой <strong>z-index</strong>, что позволит нам скрывать постепенную загрузку/отображение элементов. Плюс небольшая анимация перехода.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" src="/logo-animate.svg" alt="/logo-animate.svg - background с SVG лоадером" style="width:150px"/><figcaption class="wp-element-caption">Файл /logo-animate.svg</figcaption></figure></div>


<p>Далее у нас есть 2 варианта работы с JS, мы можем поймать события:</p>



<ul class="wp-block-list">
<li><strong><code>DOMContentLoaded</code></strong>&nbsp;– браузер полностью загрузил HTML, было построено DOM-дерево, но внешние ресурсы, такие как картинки&nbsp;<code>&lt;img&gt;</code>&nbsp;и стили, могут быть ещё не загружены;</li>



<li><strong><code>load</code></strong>&nbsp;– браузер загрузил HTML и внешние ресурсы (картинки, стили и т.д.).</li>
</ul>



<p>Выбор за Вами, понятно, что первое событие будет раньше и Вы можете даже добавить дополнительный этап загрузки, между <strong>DOMContentLoaded</strong> и <strong>load</strong> соответственно. Мы же остановимся на load:</p>



<pre title="script.js" class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">window.addEventListener("load", () =&gt; {
  document.documentElement.classList.add("loaded");
});

setTimeout(()=&gt;{ 
    if(!document.documentElement.classList.contains("loaded"))
       document.documentElement.classList.add("loaded");
}, 10000);</code></pre>



<p>Объекту <strong>window</strong> добавляем событие <strong>load</strong>, по которому добавляем класс окончания загрузки на тег &lt;<strong>html</strong>&gt; (в JS к нему можно обращаться как к documentElement). </p>



<p>Так же, для очень медленных соединений, мы посчитали необходимым снимать loader (setTimeout) через 10 сек, после загрузки скрипта, если DOM дерево по каким-то причинам будет очень долго строиться и отображаться. Что-бы показать хоть какой-то процесс или возможно наличие обрыва соединения.</p>



<h2 class="wp-block-heading">Упаковка в plugin WordPress</h2>



<p>Для удобства управления, все вышеописанное можно упаковать в плагин WP. Например такой код позволит подключить стилевой и скриптовый файлы:</p>



<pre title="easy-page-preloader.php" class="wp-block-code"><code lang="php" class="language-php">&lt;?php
/*
Plugin Name: Easy Page Preloader
Plugin URI: http://consultapp.ru/pre-loader-for-site/
Description: Adding a preloader to the pages. No conflicts with SEO. You can set your own logo.
Version: 1.0
Author: Dmitry Egorov
Author URI: http://consultapp.ru/
License: GPLv2
*/

//********************************************************************
//*************************** PLUGIN CORE ****************************
//********************************************************************

function ca_epl(){
        wp_enqueue_style( 'html-loader', plugins_url( '/style.css', __FILE__ ) );
        wp_enqueue_script( 'html-loader-script', plugins_url( '/script.js', __FILE__ ), array(), '1.0.1', true );
}
add_action('wp_enqueue_scripts', 'ca_epl');</code></pre>



<h2 class="wp-block-heading">Заключение</h2>



<p>В статье мы рассмотрели, как с помощью прсевдоэлемента <strong>::before</strong> добавленного к тегу <strong>&lt;html&gt;</strong> добавить <strong>preloader</strong> на страницу, и отключать его по событию <strong>load</strong> на объекте <strong>window</strong>.</p>
<p>Сообщение <a href="https://consultapp.ru/pre-loader-for-site/">Pre-loader для сайта</a> появились сначала на <a href="https://consultapp.ru">ConsultApp.ru</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
