Показаны сообщения с ярлыком основы. Показать все сообщения
Показаны сообщения с ярлыком основы. Показать все сообщения

вторник, 28 октября 2014 г.

CSS: приоритет выполнения правил

Довольно часто один и тот же элемент может попадать под действие сразу нескольких правил CSS. Для определения какое именно из них следует выполнять можно пользоваться следующим алгоритмом.

Каждому правилу можно назначить некоторый идентификатор, состоящий из восьми чисел: A.B.C.D.a.b.c.d Из двух идентификаторов бОльшим считается тот, который имеет бОльшее число A. Если эти числа равны у двух идентификаторов, смещаемся вправо. Из двух правил применяется то, которое имеет бОльший идентификатор. Если идентификаторы равны, применяется то правило, которое объявлено последним.

Разбираем селектор на составные части (простые селекторы). Имеется 7 типов таких составных частей:

1. Универсальный селектор не весит ничего. Поэтому правило * {} будет применяться в последнюю очередь, а из двух правил div {} и div * {} применится то, которое объявили последним.
2. Каждый селектор типа увеличивает число d на единицу.
3. Каждый селектор класса увеличивает число с на единицу. Мультикласс дробится на отдельные элементы, каждый из которых увеличивает число с на единицу.
4. Каждый селектор id увеличивает число b на единицу.
5, 6, 7 - Каждый селектор атрибута, псевдокласса или псевдоэлемента считается селектором клсса и увеличивает число c на единицу.

Инлайновый стиль (включенный непосредственно в качестве атрибута тега) увеличивает на единицу число a. При этом селектор по атрибуту style ([style]) увеличивает на единицу число с, а следовательно "перебивается" инлайновым правилом:

<style>
  [style] { color: green }
</style>
...
<p style="color: red"> <!-- предпочтение отдаётся инлайновому правилу -->
...

Если блок определений правила включает ключевое слово !important, то на единицу увеличиваются числа A, B, C, D (в зависимости от типа селектора по перечисленным выше правилам). Поэтому если бы в предыдущем примере определение стиля выглядело так:

[style] { color: green !important; },

то предпочтение отдалось бы уже ему: 0.0.1.0.0.0.0.0 > 0.0.0.0.1.0.0.0

Из этих правил можно сделать вывод, что наибольшим приоритетом обладает инлайновое стилевое правило тега с модификатором !important (1.0.0.0.0.0.0.0), а наименьшим - обычное правило тега (0.0.0.0.0.0.0.1), а если быть более точным - универсальный селектор (0.0.0.0.0.0.0.0)

понедельник, 27 октября 2014 г.

CSS: основы, селекторы

CSS (cascading style sheets) - формальный язык описания внешнего вида документа, написанного и использованием языка разметки.

Набор правил CSS представляет собой последовательность вида:

header {
  color: white;
  background-color: #333;
  font-size: 1.5em;
}

где header - селектор, текст внутри фигурных скобок - блок объявлений, состоящий из отдельных объявлений. Каждое объявление представляет собой пару вида атрибут: значение;.

CSS можно включить в страницу четырьмя способами:

1) Используя атрибут style любого тега HTML:
<h1 style="color: blue; background-color: #333;">RecipeFinder</h1>
Это определение действует только для конкретного тега, для которого оно описано. Способ не рекомендуется к использованию.

2) Используя тег style HTML (внутри тега <head></head>), внутри которого можно расположить набор правил:
<style>
  header {
    color: white;
    background-color: #333;
    font-size: 1.5em;
}
</style>
Правила действую в пределах документа, для которого они описаны. 

3) Подключая внешний файл при помощи директивы @import
<style>
  @import url(css/style.css);
</style>
Это наименее рекомендуемый способ, связанный с рядом проблем (включая проблемы с производительностью)

4) Подключая внешний файл при помощи тега <link>
<link rel="stylesheet" href="css/style.css">
Это наиболее рекомендуемый способ, отделяющий разметку от стилей.

Простые селекторы (типа Х):

1. Универсальный селектор ( * )
* {} - применяет правила ко всем элементам. Может использоваться для обнуления правил.

2. Селектор типа элемента ( tag )
ul {} - применяет правила ко всем элементам типа ul.

3. Селектор класса ( .class )
.box {} - применяется ко всем элементам с атрибутом class = "box"

4. Селектор id ( #id )
#navbar {} - применяется к элементу с атрибутом id="navbar"

Предполагается, что класс - групповая характеристика, которую может иметь ряд объектов страницы (тегов), тогда как id - уникальная характеристика, которую должен иметь только единственный объект.

5. Селектор атрибутов ( [attr] )
[title] {} - применяется ко всем элементам, имеющим атрибут title.

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

Селектор атрибутов со строгим равенством. Выбираются все элементы, имеющие атрибуты с некоторым строго определенным значением:

[attr=value]

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

[id="#idname"] [class="className"]

хотя так писать не принято.

Селекторы атрибутов с регулярными выражениями.  Выбираются элементы, имеющие атрибуты со значениями, соответствующими некоторому регулярному выражению:

[attr*=value] - значение атрибута attr содержит подстроку value
[attr^=value] - значение атрибута attr начинается с подстроки value
[attr$=value] - значение атрибута attr заканчивается подстрокой value
[attr~=value] - атрибут находится в списке, разделённом пробелами
[attr|=value] - атрибут находится в списке, разделённом дефисами

Последние два типа селекторов, в принципе, могут быть заменены селектором *=, однако они являются более специфичными и исключают ложные срабатывания.

6. Селекторы псевдоклассов ( :class )
7. Селекторы псевдоэлментов ( ::element )

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

8. Селектор группировки ( s1, s2, s3 )
ul, .box, #navbar {} - применяется ко всем элементам с типом ul или с классом .box или с id === #navbar. (Или в определении не исключающее).

9. Селектор мультикласса (.class1.class2.class3)
Каждый тег может иметь несколько классов, имена которых разделены пробелами. Селектор мультикласса применяется только к тем элементам, которые содержат имена всех классов, перечисленных в селекторе:

.class1.class2 { font-size: 2em }
...
<ul class="class1">Text1</ul>
<ul class="class1 class2">Text2</ul> <!-- селектор применится здесь-->
<ul class="class2">Text3</ul>

10. Селектор мультиатрибутов ([attr1][attr2="value"][attr3|="value2"])
Каждый тег может иметь несколько атрибутов, для которых применяются различные формы селектора атрибутов.

Комбинированные селекторы (типа XY). Допускается комбинировать следующие селекторы:

11. Типа и (мульти)класса элемента (2 и 3, 2 и9):
ul.box {} - все элементы типа ul и класса .box
li.calss1.class2 {} - применяется ко всем элементам типа li и классов class1 и class2.
При этом комбинация *.class эквивалентна обычному селектору класса .class .
12. Типа и (мульти)атрибутов (2 и 5, 2 и 10):
p[title] - все элементы типа p, имеющие атрибут типа title.
13. Типа и псевдоклассов (2 и 6): a:visited {} - применяется ко всем элементам типа a и состоянием visited.
14. Типа и псевдоэлементов (2 и 7): p::before {} - вставка заданного контента перед всеми элементами типа p.

Селекторы иерархии. Теги в дереве могут находиться в следующих отношениях:

а) предок-потомок - тег потомок находится внутри тега предка на произвольном уровне вложенности;
б) родитель-ребёнок - тег ребёнок является непосредственным потомком тега предка;
в) сиблинги (братья, сёсты) - теги, расположенные на одном уровне иерархии.

<body>
  <p>Hello, <b>cruel <i>world</i></b></p>
  <br />
  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
  </ul>
</body>

p, b, i, br, ul, все li являются потомками body, однако только p, br, ul являются его детьми.
p, br, ul являются сиблингами, также как и все li

15. Селектор потомков (X Y (разделитель пробел))
Правило применяется ко всем тегам с селектором Y, предком которых является селектор X. Возможно несколько уровне вложенности (X Y Z T), в качестве селекторов могут применяться в т.ч. и комбинированные селекторы, а также универсальный селектор:

ul.class1 * {} - применяется ко всем потомкам типа ul со классом class1.
body * p {} - применяется ко всем потомкам типа p, содержащихся в теге body но обязательно отделённых от body каким-либо другим тегом:

<body>
  <article>
    <p>One</p> <!-- стиль применяется -->
    <p>Two</p> <!-- и здесь -->
  </article>
  <p>Three</p> <!-- а здесь нет - p - дочерний элемент относительно body -->
</body>

16. Селектор прямых потомков (X > Y)
Выбирает только прямого потомка (ребенка) Y селектора X. Также возможно наличие нескольких уровней вложенности и использование универсального селектора.

17. Строгий селектор сиблингов (X + Y)
Выбирает сиблингов определяемых селектором Y, строго следующих за элементами, опредляемыми селектором X.
div + p {} - правило применяется к тегу p, следующему за тегом div (точнее, </div> - речь идёт о сиблингах, которые находятся на одном уровне иерархии).

18. Нестрогий селектор сиблингов (X ~ Y)
Выбирает всех сиблингов, определяемых селектором Y и следующих за элементами, определяемыми селектором X.
ul ~ li {} - правило применяется ко всем тегам li (расположенным на одном уровне иерархии), следующим за тегом ul .

четверг, 18 сентября 2014 г.

Ключевые слова Java

Базовые типы данных:
byte    short   int     long    float   double  char    boolean

Выполнение цикла:
do      while   for     break   continue

Выполнение перехода:
if      else    switch  case    default (break)

Модификаторы переменных и классов:
private     public      protected   final       static
abstract    volatile    strictfp    synchronized

Обработка особых ситуаций:
try     catch   finally throw   throws

Методы:
return  void

Пакеты:
package import

Прочие ключевые слова:
class   extends new     this    super   implements instanceof
assert  native  enum    transient       interface

Зарезервированные слова:
const   goto

Предопределенные значения
true    false   null

Ключевые слова в Си

C89

auto      break     case      char    const     continue  default
do        double    else      enum    extern    float     for
goto      if        int       long    register  return    short
signed    sizeof    static    struct  switch    typedef   union
unsigned  void      volatile  while

C99

inline    restrict  _Bool    _Complex  _Imaginary

C11

_Alignas  _Alignof  _Atomic  _Generic  _Noretrun  _Static_assert
_Thread_local



Спецификаторы функций
inline - позволяет компилятору (на его усмотрение) оптимизировать код, непосредственно встраивая тело функции вместо ее вызова. 
_Noretrun - указывает на то, что поток выполнения не возвращается после вызова функции (прерывание, исключение, выход из программы, longjmp()).


Спецификаторы постоянства-изменяемости
const - переменная должна быть инициализирована при определении и не может меняться в ходе выполнения программы.
volatile - переменная может меняться не только потоком выполнения программы (например, при мэппинге регистров на основную память).

Спецификаторы времени хранения
auto - объявляется и хранится в пределах блока (функции, цикла или иного блока, ограниченного {}). По умолчанию все переменные имеют тип auto. В С++ имеет другое значение.
register - рекомендация компилятору сделать доступ к переменной наиболее быстрым (по возможности поместить в регистр).
static - оставаясь видимой в пределах блока, где она объявлена, статическая переменная сохраняет свое значение (например, между вызовами функций или при повторном заходе в цикл). Переменная static, объявленная на уровне файла, становится доступной только в нём.
extern - объявление переменной, определенной в другом модуле без выделения памяти.
_Thread_local - копия переменной создается для каждого потока и уничтожается вместе с ним. Может быть дополнительно static или extern.


restrict - применяется только для указателей и означает, что объекты, на которые ссылаются указатели, не пересекаются (например, при копировании области памяти возможно частичное пересечение) и не совпадают (указывают на одну и ту же переменную или область памяти). При компиляции не проводятся проверки на пересечение и совпадение.