Прижать футер к низу страницы

Наверное самый распространённый способ прижатия футера к низу страницы:

Необходимая разметка:

<body>
    <div class="wrapper">
        Шапка
        Контент
        Колонки
        <div class="footer-push"></div>
    </div>
    <div class="footer">
        Подвал
    </div>
</body>

CSS:
html, body {
height: 100%;
margin: 0;
padding: 0;
}
.wrapper {
    min-height: 100%;
    height: auto !important;
    height: 100%;
    margin: 0 0 -100px 0; /* отрицательный нижний отступ на высоту футера */
    padding: 0;
}
.footer-push, .footer {
    height: 100px;
    margin: 0;
    padding: 0;
}

Работает во всех браузерах.

Единственное момент — у body, врапера и футера нельзя указывать положительные верхний или нижний margin/padding. Сделать это можно для вложенных элементов.

Добавлено: 29 Июля 2018 20:18:00 Добавил: Андрей Ковальчук

Позиционирование звука

CSS

Когда говорит только один человек, звук исходит из одной точки пространства, если только, конечно, человек не перемещается. Когда говорят несколько человек, звук каждого голоса будет исходить из своей точки. Раз есть высококачественные аудиосистемы и объемный звук, должна быть и возможность создания пространственного звука. CSS2.x предлагает для этого два свойства, одно из которых определяет угол расположения источника звука в горизонтальной плоскости, а второе – угол источника в вертикальной плоскости. За размещение звуков в горизонтальной плоскости отвечает свойство azimuth.

Значения углов могут выражаться в трех единицах измерения: deg (в градусах), grad (в градах) и rad (в радианах). Допустимые диапазоны этих трех типов единиц измерений: от 0 до 360deg, от 0 до 400grad и от 0 до 6.2831853rad. Допускаются отрицательные значения, но они пересчитываются в положительные. Так, –45deg эквивалентно 315deg (360– 45) и –50grad – это то же самое, что и 350grad. Большинство ключевых слов представляют собой эквиваленты угловых значений. Они приведены в табл. 14.1, где углы заданы в градусах, и проиллюстрированы на рис. 14.11. Последний столбец табл. 14.1 содержит эквиваленты ключевых слов первого столбца, используемых в сочетании со значением behind.

Обратите внимание, что ключевое слово behind может сочетаться только с ключевыми словами. Есть два дополнительных ключевых слова: leftwards и rightwards. В результате применения первого из них из текущего значения угла свойства azimuth вычитается 20deg, а если указать второе, то значение угла увеличивается на 20deg. Например:

body {azimuth: right-side;} /* эквивалентно 90deg */
h1 {azimuth: leftwards;}


Вычисляемое значение угла azimuth для элемента h1 составляет 70deg. Теперь рассмотрим следующую ситуацию:

body {azimuth: behind;} /* эквивалентно 180deg */
h1 {azimuth: leftwards;} /* вычисляемое значение – 160deg */


Результатом применения leftwards исходя из данных правил является перемещение звука вправо, а не влево. Это странно, но таков CSS2. Аналогично rightwards в предыдущем примере обусловливает перемещение источника звука элемента h1 на 20 градусов влево. Свойство elevation, отвечающее за размещение звуков в вертикальной плоскости, во многом аналогично azimuth, но несколько проще. Как и azimuth, свойство elevation допускает измерение углов в градусах, градах и радианах. Три ключевых слова являются эквивалентами углов: above (90 градусов), level (0) и below (–90 градусов). Ключевые слова относительного позиционирования, higher и lower, добавляют по 10 градусов к текущему значению угла возвышения или вычитают их из него. Таким образом, в следующем примере элементы h1, являющиеся дочерними элементами body, будут подняты на 10 градусов над горизонтальной плоскостью.

body {elevation: level;} /* эквивалентно 0 */
body > h1 {elevation: higher;}

Добавлено: 19 Июля 2018 08:09:35 Добавил: Андрей Ковальчук

Звуковое сопровождение

CSS

У визуальных элементов может быть фон, и вполне справедливо, что у звуковых элементов тоже есть возможность иметь фон (звуковое сопровождение). В звуковых устройствах роль фона выполняет некий звук, воспроизводимый одновременно с воспроизведением элементом. Для этого предназначено свойство play-during. Самый простой пример – звук воспроизводится в начале звукового элемента:

h1 {play-during: url(trumpets.mp3);}


В соответствии с этим правилом воспроизведение любого элемента h1 сопровождалось бы проигрыванием звукового файла trumpets.mp3. Звуковой файл проигрывается один раз. Если он короче, чем звуковой эквивалент содержимого элемента, его воспроизведение заканчивается раньше, чем воспроизведение элемента. Если его длительность больше, его воспроизведение завершается одновременно с окончанием воспроизведения содержимого элемента. Для того чтобы звук повторялся в течение всего воспроизведения элемента, добавьте ключевое слово repeat. Это звуковой эквивалент back-ground-repeat: repeat:

div.ocean {play-during: url(wave.wav) repeat;}


Как и фоновые изображения, фоновые звуки по умолчанию не комбинируются. Рассмотрим следующую ситуацию:

a:link {play-during: url(chains.mp3) repeat;}
em {play-during: url(bass.mp3) repeat;}
(a href="http://www.example.com/">Это <em>действительно замечательный</em>
сайт!(/a)


Здесь весь текст ссылки, кроме текста элемента, будет воспроизводиться на фоне повторяющегося файла chains.mp3. Для элемента em вместо chains.mp3 будет воспроизводиться файл bass.mp3. Фоновый звук родительского элемента не слышен, так же как его фон не просматривался бы под элементом em, если бы фон обоих элементов был видимым. Для комбинирования фоновых звуков используется ключевое слово mix:

a:link {play-during: url(chains.mp3) repeat;}
em {play-during: url(bass.mp3) repeat mix;}


Теперь chains.mp3 будет сопровождать чтение текста всей ссылки, включая текст. А во время воспроизведения элемента em одновременно будут воспроизводиться и chains.mp3, и bass.mp3. Аналогия с визуальными фонами нарушается, если задать значение none. Это ключевое слово отменяет все фоновые звуки, включая все те, которые могут принадлежать ссылкам. Таким образом, исходя из следующих правил текст em вообще не будет иметь звукового сопровождения – не будет слышно ни файла bass.mp3, ни chains.mp3:

a:link {play-during: url(chains.mp3) repeat;}
em {play-during: none;}
(a href="http://www.example.com/">Это <em>действительно замечательный</em>
сайт!(/a)

Добавлено: 19 Июля 2018 08:09:03 Добавил: Андрей Ковальчук

Паузы, предупредительные сигналы и генерируемое содержимое

CSS

И паузы, и предупредительные сигналы воспроизводятся «вне» генерируемого содержимого. Рассмотрим следующий пример:

h1 {cue: url(trumpet.mp3);}
h1:before {content: "Внемлите! ";}
h1:after {content: ". Воистину!";}
(h1)Начало(/h1)


Этот элемент был бы воспроизведен примерно так: «(звук трубы) Внемлите! Начало. Воистину! (звук трубы)». CSS не определяет, идут ли паузы «вне» сигналов или наоборот, так что поведение звуковых агентов пользователя в этом отношении предсказать невозможно.

Добавлено: 19 Июля 2018 08:07:53 Добавил: Андрей Ковальчук

Предупредительные сигналы

CSS

Если для привлечения внимания к элементу одних пауз недостаточно, можно добавить перед ним и после него звуковые предупредительные сигналы – звуковой эквивалент рамки. Как и в случае с паузами, для задания звуковых сигналов есть три свойства: cue-before, cue-after и cue. Если указан URI аудиоресурса, агент пользователя загружает этот ресурс и воспроизводит его перед элементом или после него. Предположим, надо предварять каждую непосещенную гиперссылку документа звонком, а каждую посещенную ссылку – гудком. Правила были бы такими:

a:link {cue-before: url(chime.mp3);}
a:visited {cue-before: url(beep.wav);}


Принцип работы сокращенной формы, cue, вполне ожидаем. Как и в свойстве pause, если задано одно значение для свойства cue, то это значение используется как перед элементом, так и после него. Если заданы два значения, первое соответствует сигналу перед элементом. Таким образом, следующие правила эквивалентны:

a[href] {cue: url(ping.mp3);}
a[href] {cue: url(ping.mp3) url(ping.mp3);}
a[href] {cue-before: url(ping.mp3); cue-after: url(ping.mp3);}

Добавлено: 19 Июля 2018 08:07:29 Добавил: Андрей Ковальчук

Паузы

CSS

Все разговорные языки основаны на различных паузах. Короткие промежутки между словами, фразами и предложениями настолько же важны для понимания значения, как и сами слова. Паузы представляют собой звуковые эквиваленты полей в том смысле, что и те и другие служат для отделения элемента от окружающего его содержимого. В CSS для введения пауз в документ могут применяться три свойства:

pause-before, pause-after и pause.


Формат <время> позволяет задать длительность паузы в секундах или миллисекундах. Допустим, требуется вставить полную двухсекундную паузу после элемента h1. Это можно обеспечить любым из двух следующих правил:

h1 {pause-after: 2s;}
h1 {pause-after: 2000ms;} /* продолжительность, аналогичная '2s' */


С процентными значениями все немного сложнее, поскольку они вычисляются относительно заданного значения speech-rate. Давайте посмотрим, как это происходит. Во-первых, рассмотрим следующее:

h1 {speech-rate: 180;}


Это значит, что любой элемент h1 будет воспроизводиться со скоростью примерно три слова в секунду. Теперь рассмотрим:

h1 {speech-rate: 180; pause-before: 200%;}


Это процентное значение вычисляется на основании средней длины слова. В данном случае произнесение одного слова занимает 333,33 миллисекунды, так что 200% от этого значения составляет 666,66 миллисекунды. Скажем по-другому: каждому h1 будут предшествовать паузы продолжительностью в две трети секунды. Если изменить правило так, что значение speech-rate будет равно 120, пауза будет длиться целую секунду.
Свойство pause – это сокращенная форма записи, которая объединяет pause-before и pause-after.

Если задается только одно значение, оно определяет продолжительность паузы и перед элементом, и после него. Если указывается два значения, тогда первое определяет паузу перед элементом, а второе – паузу после него. Таким образом, следующие правила эквивалентны:

pre {pause: 1s;}
pre {pause: 1s 1s;}
pre {pause-before: 1s; pause-after: 1s;}

Добавлено: 19 Июля 2018 08:06:54 Добавил: Андрей Ковальчук

Ударение и насыщенность

CSS

Похоже на pitch-range свойство stress, призванное помочь авторам сузить или расширить схемы распределения ударений в языке. Каждый язык, на котором разговаривают люди, имеет, если можно так выразиться, схемы распределения ударений. В английском, например, предложения состоят из разных частей, которые требуют разных ударений (или акцентирования). Предыдущее предложение1 могло бы выглядеть примерно так:

<sentence>
<primary>In English,</primary>
<tertiary>for example,</tertiary>
<secondary>sentences have different parts that call for
different stress.</secondary>
</sentence>


Таблица стилей, определяющая уровни акцентирования каждой части предложения, могла бы быть следующей:

primary {stress: 65;}
secondary {stress: 50;}
tertiary {stress: 33;}


Это приводит к снижению интонирования менее важных частей предложения и усилению акцентирования частей, которые считаются более важными. Значения свойства stress зависят от языка: одно и то же значение в разных языках может обозначать разные уровни и схемы акцентирования. CSS не определяет такие отличия (что, вероятно, уже вас не удивляет). Во многом похожим на stress является свойство richness Чем выше значение richness голоса, тем он «ярче» и тем большую аудиторию может охватить. Меньшие значения приведут к мягкому, более «сладкозвучному» («mellifluous») голосу (цитирую спецификацию CSS2). Таким образом, голосу артиста, читающего монолог, можно задать значение richness: 80;, а шепот можно получить, задав richness: 25;.

Добавлено: 19 Июля 2018 08:06:21 Добавил: Андрей Ковальчук

Изменение высоты

CSS

Очевидно, что разные голоса обладают разной высотой. Обычный пример – мужские голоса в среднем имеют частоту 120 Гц, тогда как средняя высота женского голоса приблизительно равна 210 Гц. Таким образом, каждое семейство голосов будет иметь собственную стандартную высоту. CSS позволяет авторам изменять высоту голоса при помощи свойства pitch. Для ключевых слов от x-low до x-high явного определения нет, так что о них можно сказать только то, что каждое последующее будет означать более высокий тон, чем предыдущее. Можно провести аналогию с ключевыми словами определения размеров шрифта от xx-small до xx-large, которые тоже не заданы точно, но каждое последующее обозначает больший размер, чем предыдущее.

Значения частоты – совсем другое дело. Если частота определяется явно, голос будет изменен так, что его средняя высота будет соответствовать указанному значению. Например:

h1 {pitch: 150Hz;}


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

h1 {voice-family: Jethro, Susie; pitch: 100Hz;}


Для данного примера предположим, что стандартная частота голоса Jethro составляет 110 Гц, а стандартная частота голоса Susie – 200 Гц. Если выбрать Jethro, то элементы h1 будут прочитываться голосом, несколько более низким, чем обычный. Если голос Jethro недоступен и вместо него выбран Susie, голос будет сильно изменен по сравнению с применяемыми по умолчанию настройками и, скорее всего, будет звучать неестественно. Независимо от того, какая высота тона устанавливается при воспроизведении элемента, автор может влиять на динамический диапазон частот с помощью свойства pitch-range. Назначение свойства pitch-range – расширить или сузить модуляцию данного голоса. Чем меньше диапазон высот, тем ближе все высоты будут к средней, что в результате обеспечивает монотонный голос. Применяемое по умолчанию значение, 50, обеспечивает «нормальные» модуляции. Чем больше значение, тем выше степень «оживленности» в голосе.

Добавлено: 19 Июля 2018 08:05:51 Добавил: Андрей Ковальчук

Озвучивание

CSS

До настоящего момента мы говорили о способах воздействия на звуковое представление, но упустили вопрос о том, как выбрать голос для звукового генерирования содержимого. CSS определяет свойство, похожее на font-family, под названием voice-family. Как и свойство font-family, voice-family позволяет автору предоставить разделяемый запятыми список голосов для формирования содержимого элемента. Если первый голос из списка доступен, то агент пользователя выбирает его. Если нет, агент выбирает следующий по списку голос – и так до тех пор, пока не будет найден один из заданных голосов или пока не закончится список. Способ объявления синтаксиса значения позволяет указывать последовательность конкретных или базовых семейств в любом порядке. Следовательно, список можно завершить конкретным семейством, а не обязательно базовым. Например:

h1 {voice-family: Mark, male, Joe;}


CSS2.x не определяет значения базовых семейств, но упоминает, что значения male (мужской), female (женский) и child (детский) допустимы. Следовательно, элементы документа XML можно было бы оформить так:

rosen {voice-family: Gary, Scott, male;}
guild {voice-family: Tim, Jim, male;}
claud {voice-family: Donald, Ian, male;}
gertr {voice-family: Joanna, Susan, female;}
albert {voice-family: Bobby, Paulie, child;}


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

Добавлено: 19 Июля 2018 08:05:19 Добавил: Андрей Ковальчук

Уровень громкости

CSS

В звуковых устройствах один из наиболее важных аспектов представления – громкость звука, генерируемого агентом пользователя. Рассмотрим свойство с соответствующим названием – volume. Для него определены следующие значения:

<число>
Позволяет задать уровень громкости в виде числа. Значение 0 соответствует минимальной слышимости, но это не то же самое, что тишина; 100 соответствует максимальному комфортному уровню громкости.

<процентное значение>
Вычисляется как процент от унаследованного уровня громкости.

silent
Звук не воспроизводится, отличается от числового значения 0. Это звуковой эквивалент visibility: hidden.
x-soft
Эквивалентно числовому значению 0.
soft
Эквивалентно числовому значению 25.
medium
Эквивалентно числовому значению 50.
loud
Эквивалентно числовому значению 75.
x-loud
Эквивалентно числовому значению 100.

Важно отметить, что значение свойства volume (произнесите это1 быстро пять раз!) определяет средний уровень громкости, а не точный уровень громкости каждого из произносимых звуков. Таким образом, содержимое элемента, для которого задано volume:50;, может быть отображено звуковой последовательностью с меняющимся относительно заданного уровнем громкости, особенно если голос обладает высокой модуляцией или имеет богатый динамический диапазон. Числовой диапазон настраивается пользователем, поскольку только конкретный пользователь может определить для себя минимальный уровень громкости (0) и максимальный комфортный уровень громкости (100). Для примера пользователь мог бы решить, что минимально слышимая громкость соответствует силе звука 34 дБ, а максимальная комфортная громкость – 84 дБ. То есть диапазон между значениями 0 и 100 – это 50 дБ, и каждое увеличение значения на единицу будет соответствовать приращению громкости на 0,5 дБ. Иначе говоря, volume: soft; преобразовывалось бы в среднюю громкость 46,5 дБ.

Эффект, производимый процентными значениями, аналогичен их применению в свойстве font-size: они увеличивают или уменьшают значение относительно значения родительского элемента. Например:

div.marine {volume: 60;}
big {volume: 125%;}
<div class="marine">
Когда я говорю прыгать, я имею в виду (big)кролика(/big), понятно!
(/div)


Исходя из аудиодиапазона, описанного ранее, содержимое элемента div проговаривалось бы здесь со средней громкостью 64 дБ. Исключение составляет элемент big, громкость которого равна 125% родительского значения 60. Его вычисляемое значение – 75, что эквивалентно 71,5 дБ. Если в результате вычисления процентного соотношения числовое значение громкости элемента выходит из диапазона от 0 до 100, оно усекается до ближайшего допустимого значения. Предположим, что предыдущие стили изменены так:

div.marine {volume: 60;}
big {volume: 200%;}


Тогда значение volume для элемента big составит 120; затем это значение будет уменьшено до 100, что в данном случае соответствует средней громкости 84 дБ. Преимущество такого определения громкости в том, что одна и та же таблица стилей годится для различных сред. Например, установочные параметры, соответствующие 0 и 100, в библиотеке и в машине будут разными, но эти значения будут обеспечивать одинаковые предполагаемые слуховые эффекты при любой настройке.

Добавлено: 19 Июля 2018 08:04:54 Добавил: Андрей Ковальчук

Скорость речи

CSS

Помимо способов влияния на стиль речи CSS предлагает также свойство speech-rate, применяемое для задания скорости генерирования аудио-представления содержимого. Для него определены следующие значения:

<число>
Определяет скорость произнесения в словах в минуту. Варьируется в зависимости от языка, потому что в некоторых языках скорость речи несколько выше, чем в других.

x-slow
Эквивалентно 80 словам в минуту.
slow
Эквивалентно 120 словам в минуту.
medium
Эквивалентно 180–200 словам в минуту.
fast
Эквивалентно 300 словам в минуту.
x-fast
Эквивалентно 500 словам в минуту.
faster
Увеличивает текущую скорость речи на 40 слов в минуту.
slower
Уменьшает текущую скорость речи на 40 слов в минуту.

Вот два примера предельных изменений скорости речи:

*.duh {speech-rate: x-slow;}
div#disclaimer {speech-rate: x-fast;}


CSS не определяет механизм изменения скорость речи. Агент пользователя может растягивать каждое слово, увеличивать паузы между словами или делать и то, и другое.

Добавлено: 19 Июля 2018 08:04:23 Добавил: Андрей Ковальчук

Звуковое воспроизведение заголовков таблиц

CSS

При генерировании аудиопредставления таблицы трудно отслеживать, что же на самом деле означают данные ячеек. Допустим, вы находитесь в 9-й строке таблицы, состоящей из 12 строк, и 6-я ячейка этой строки содержит значение «21,77». Каковы шансы, что вы помните, что именно представляет шестой столбец? Вы даже вряд ли вспомните, к чему относятся числа данной строки. Заголовки таблицы предоставляют эту информацию, и с ними легко свериться визуально. Чтобы решить эту проблему в звуковых устройствах, CSS2 вводит свойство speak-header. По умолчанию агент пользователя генерирует содержимое заголовка таблицы только один раз – при первой встрече с ячейкой. Другой вариант – всегда генерировать информацию заголовка таблицы при генерировании представления каждой ячейки, связанной с этим заголовком.

Рассмотрим в качестве примера следующую простую таблицу:

<table id="colors">
<caption>Любимый цвет</caption>
<tr id="headers">
<th>Джим</th><th>Джо</th><th>Джейн</th>
</tr>
<tr>
<td>красный</td><td>зеленый</td><td>синий</td>
<td>
</tr>
</table>


Без применения каких-либо стилей аудиопредставление этой таблицы было бы таким: «Любимый цвет Джим Джо Джейн красный зеленый синий». Возможно, вы в состоянии определить, что все это означает, но представьте, что таблица содержит любимые цвета 10 или 20 человек. Теперь предположим, что к этой таблице применяются следующие стили:

#colors {speak-header: always;}
#headers {speak: none;}


Тогда аудиопредставление таблицы должно быть таким: «Любимый цвет Джим красный Джо зеленый Джейн синий». Такое представление понять намного проще независимо от размера таблицы. Обратите внимание, что метод задания заголовка таблицы определяет язык документа. Языки разметки также могут иметь способы ассоциирования информации заголовка с элементами или группами элементов, например, атрибуты scope и axis в HTML4.

Добавлено: 19 Июля 2018 08:03:52 Добавил: Андрей Ковальчук

Позиционирование элементов

CSS

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

h2 {page-break-before: always; position: absolute; bottom: 0; right: 0;}


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

h1 {position: fixed; top: 0; right: 0; font-size: 80%;}


Эта методика может применяться для создания колонтитулов, графических врезок для каждого слайда и т. д.

Добавлено: 19 Июля 2018 08:02:22 Добавил: Андрей Ковальчук

Планирование слайдов

CSS

Для того чтобы разбить документ на ряд слайдов, нужен способ определения границ между слайдами. Это делается с помощью свойств разрыва страниц. Какое из них выбрать – page-break-before или page-break-after – преимущественно зависит от того, как организован документ. Здесь присутствует ряд элементов h2, каждый из которых сопровождается ненумерованным списком. Они формируют «структуру» слайдовой презентации. Осталось разбить документ на слайды. Каждый слайд начинается с элемента h2, поэтому достаточно объявить:

h2 {page-break-before: always;}


Это гарантирует, что каждая страница (т. е. каждый слайд) будет начинаться с элемента h2. Поскольку заголовок каждого слайда представлен элементом h2, все в порядке: в качестве первого элемента каждого слайда будет выступать h2. Конечно, слайд выглядит довольно незамысловато, потому что ничего не сделано, чтобы приукрасить его; мы просто определили, куда должны быть вставлены разрывы страниц.

В рассматриваемой нами структуре границы слайдов можно было бы определить, вставляя разрывы страниц после списков, а не перед элементами h2:

ul {page-break-after: always;}


Этот метод будет прекрасно работать, поскольку в документе нет вложенных списков. Если существует вероятность их присутствия, надо или вернуться к размещению разрывов страниц перед элементами h2, или добавить второе правило, чтобы предотвратить разрывы страниц во вложенных списках:

ul {page-break-after: always;}
ul ul {page-break-after: auto;}

Добавлено: 19 Июля 2018 08:01:58 Добавил: Андрей Ковальчук

Стили для проекционных устройств

CSS

Кроме печатных страниц, еще одним распространенным устройством с постраничной разбивкой является проекционное (projection), в котором описывается информация, проецируемая на большой экран, подходящий для просмотра большой группой людей. Microsoft Power-Point – один из наиболее известных современных редакторов для подготовки проекционных презентаций.

На момент написания данной книги только один агент пользователя поддерживает проекционные устройства CSS: Opera для Windows. Эта возможность называется «OperaShow» и позволяет авторам превращать любой HTML-документ в слайдовую презентацию. Мы рассмотрим основные моменты этой возможности, поскольку в будущем она может появиться в других агентах пользователя и дает представление о том, как CSS могут использоваться с другими устройствами, не только экранными или печатными, что довольно любопытно.

Добавлено: 19 Июля 2018 08:01:30 Добавил: Андрей Ковальчук