вторник, 26 ноября 2013 г.

Создание дерева графов на CSS 3



Файл index.html

<div class="tree">
<ul>
<li>
<a href="#">Parent</a>
<ul>
<li>
<a href="#">Child</a>
<ul>
<li>
<a href="#">Grand Child</a>
</li>
</ul>
</li>
<li>
<a href="#">Child</a>
<ul>
<li><a href="#">Grand Child</a></li>
<li>
<a href="#">Grand Child</a>
<ul>
<li>
<a href="#">Great Grand Child</a>
</li>
<li>
<a href="#">Great Grand Child</a>
</li>
<li>
<a href="#">Great Grand Child</a>
</li>
</ul>
</li>
<li><a href="#">Grand Child</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>

Файл index.css

* {margin: 0; padding: 0;}

.tree ul {
padding-top: 20px; position: relative;

transition: all 0.5s;
-webkit-transition: all 0.5s;
-moz-transition: all 0.5s;
}

.tree li {
float: left; text-align: center;
list-style-type: none;
position: relative;
padding: 20px 5px 0 5px;

transition: all 0.5s;
-webkit-transition: all 0.5s;
-moz-transition: all 0.5s;
}

/*We will use ::before and ::after to draw the connectors*/

.tree li::before, .tree li::after{
content: '';
position: absolute; top: 0; right: 50%;
border-top: 1px solid #ccc;
width: 50%; height: 20px;
}

.tree li::after{
right: auto; left: 50%;
border-left: 1px solid #ccc;
}

/*We need to remove left-right connectors from elements without
any siblings*/
.tree li:only-child::after, .tree li:only-child::before {
display: none;
}

/*Remove space from the top of single children*/
.tree li:only-child{ padding-top: 0;}

/*Remove left connector from first child and
right connector from last child*/
.tree li:first-child::before, .tree li:last-child::after{
border: 0 none;
}

/*Adding back the vertical connector to the last nodes*/
.tree li:last-child::before{
border-right: 1px solid #ccc;
border-radius: 0 5px 0 0;
-webkit-border-radius: 0 5px 0 0;
-moz-border-radius: 0 5px 0 0;
}

.tree li:first-child::after{
border-radius: 5px 0 0 0;
-webkit-border-radius: 5px 0 0 0;
-moz-border-radius: 5px 0 0 0;
}

/*Time to add downward connectors from parents*/
.tree ul ul::before{
content: '';
position: absolute; top: 0; left: 50%;
border-left: 1px solid #ccc;
width: 0; height: 20px;
}

.tree li a{
border: 1px solid #ccc;
padding: 5px 10px;
text-decoration: none;
color: #666;
font-family: arial, verdana, tahoma;
font-size: 11px;
display: inline-block;

border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;

transition: all 0.5s;
-webkit-transition: all 0.5s;
-moz-transition: all 0.5s;
}

/*Time for some hover effects*/
/*We will apply the hover effect the the lineage of the element also*/
.tree li a:hover, .tree li a:hover+ul li a {
background: #c8e4f8; color: #000; border: 1px solid #94a0b4;
}

/*Connector styles on hover*/
.tree li a:hover+ul li::after,
.tree li a:hover+ul li::before,
.tree li a:hover+ul::before,
.tree li a:hover+ul ul::before{
border-color:  #94a0b4;
}

четверг, 7 ноября 2013 г.

RECESS порядок записи CSS-правил

position
top
right
bottom
left
z-index
display
float
width
height
max-width
max-height
min-width
min-height
padding
padding-top
padding-right
padding-bottom
padding-left
margin
margin-top
margin-right
margin-bottom
margin-left
margin-collapse
margin-top-collapse
margin-right-collapse
margin-bottom-collapse
margin-left-collapse
overflow
overflow-x
overflow-y
clip
clear
font
font-family
font-size
font-smoothing
osx-font-smoothing
font-style
font-weight
hyphens
src
line-height
letter-spacing
word-spacing
color
text-align
text-decoration
text-indent
text-overflow
text-rendering
text-size-adjust
text-shadow
text-transform
word-break
word-wrap
white-space
vertical-align
list-style
list-style-type
list-style-position
list-style-image
pointer-events
cursor
background
background-attachment
background-color
background-image
background-position
background-repeat
background-size
border
border-collapse
border-top
border-right
border-bottom
border-left
border-color
border-image
border-top-color
border-right-color
border-bottom-color
border-left-color
border-spacing
border-style
border-top-style
border-right-style
border-bottom-style
border-left-style
border-width
border-top-width
border-right-width
border-bottom-width
border-left-width
border-radius
border-top-right-radius
border-bottom-right-radius
border-bottom-left-radius
border-top-left-radius
border-radius-topright
border-radius-bottomright
border-radius-bottomleft
border-radius-topleft
content
quotes
outline
outline-offset
opacity
filter
visibility
size
zoom
transform
box-align
box-flex
box-orient
box-pack
box-shadow
box-sizing
table-layout
animation
animation-delay
animation-duration
animation-iteration-count
animation-name
animation-play-state
animation-timing-function
animation-fill-mode
transition
transition-delay
transition-duration
transition-property
transition-timing-function
background-clip
backface-visibility
resize
appearance
user-select
interpolation-mode
direction
marks
page
set-link-source
unicode-bidi
speak

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

БЭМ методология

.blockName-elementName--modificatorName
.blockName_elementName__modificatorName

.block-name__element-name__modificator-name

.digit-Progress             /* package-MainComponent */
.digit-Progress-bar       /* package-MainComponent-childElement */
.digit-Progress--small   /* package-MainComponent--variation */

Префикс package- (digit-) используется для создания пространства имён для того, чтобы не было конфликтов с названиями других packages/libraries/frameworks.

Использование тире (-) вместо подчёркивания (_) позволяет выделять отдельные части класс простым двойным кликом в реадкторе.

Для названий, состоящих из нескольких слов удобне использовать стиль camelCase.

Для выделения главного компонена его имя начинается с заглавной буквы в стиле CamelCase: .package-Component-childElement

Для визуального выделения вариаций мы используем двойное тире (--): .digit-Progress--small.

Для оформления заголовком можно использовать следующие примеры

/**
 * Class > Subclass > Variation
 */

/***************************************\
 * Class > Subclass > Variation
\***************************************/

пятница, 11 октября 2013 г.

CSS оформление Input File

HTML

<div class="file_upload">
    <button type="button">Выбрать</button>
    <div>Файл не выбран</div>
    <input type="file">
</div>

CSS

.file_upload{
    position: relative;
    overflow: hidden;
    font-size: 1em;        /* example */
    height: 2em;           /* example */
    line-height: 2em       /* the same as height */
}

.file_upload > button, .file_upload > div{
    cursor: pointer
}

.file_upload > button{
    float: right;
    width: 8em;            /* example */
    height: 100%
}

.file_upload > div{
    padding-left: 1em      /* example */
}

@media only screen and ( max-width: 500px ){  /* example */
    .file_upload > div{
        display: none
    }
    .file_upload > button{
        width: 100%
    }
}

.file_upload input[type=file]{
    position: absolute;
    top: 0;
    visibility: hidden
}

/* Making it beautiful */

.file_upload{
    border: 1px solid #ccc;
    border-radius: 3px;
    box-shadow: 0 0 5px rgba(0,0,0,0.1);
    transition: box-shadow 0.1s linear
}

.file_upload.focus{
    box-shadow: 0 0 5px rgba(0,30,255,0.4)
}

.file_upload > button{
    background: #7300df;
    transition: background 0.2s;
    border: 1px solid rgba(0,0,0,0.1);
    border-color: rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);
    border-radius: 2px;
    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.05);
    color: #fff;
    text-shadow: #6200bd 0 -1px 0;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis
}

.file_upload:hover > button{
    background: #6200bd;
    text-shadow: #5d00b3 0 -1px 0
}

.file_upload:active > button{
    background: #5d00b3;
    box-shadow: 0 0 3px rgba(0,0,0,0.3) inset
}

JavaScript

$(function(){
    var wrapper = $( ".file_upload" ),
        inp = wrapper.find( "input" ),
        btn = wrapper.find( "button" ),
        lbl = wrapper.find( "div" );

    // Crutches for the :focus style:
    btn.focus(function(){
        wrapper.addClass( "focus" );
    }).blur(function(){
        wrapper.removeClass( "focus" );
    });

    // Yep, it works!
    btn.add( lbl ).click(function(){
        inp.click();
    });

    var file_api = ( window.File && window.FileReader && window.FileList && window.Blob ) ? true : false;

    inp.change(function(){

        var file_name;
        if( file_api && inp[ 0 ].files[ 0 ] )
            file_name = inp[ 0 ].files[ 0 ].name;
        else
            file_name = inp.val().replace( "C:\\fakepath\\", '' );
        if( ! file_name.length )
            return;

        if( lbl.is( ":visible" ) ){
            lbl.text( file_name );
            btn.text( "Выбрать" );
        }else
            btn.text( file_name );
    }).change();

});

$( window ).resize(function(){
    $( ".file_upload input" ).triggerHandler( "change" );
});

Полученное стилизованное поле выбора файла было успешно протестировано для всех трех способов в следующих браузерах:

FireFox 22.0 (Linux, Windows)
Opera 12.16 (Linux, Windows)
Internet Explorer 9
Chromium 27.0 (Linux)
Apple Safari (iOS 6.3.1)
Android browser (Android 2.3.6)
Android FireFox


Из плюсов всех рассмотренных в статье подходов можно выделить следующие основные:

Не используется Flash.
Элемент можно легко стилизовать средствами CSS, используя современные технологии адаптивного дизайна.
Поле можно заполнять и с клавиатуры.


Из основных минусов:

Необходимость использования JavaScript (касается всех способов).
Использование хаков CSS для «маскировочного» способа.
Необходимость писать дополнительные костыли для поля с атрибутом multiple (касается всех способов).
Некроссбраузерность — у всех способов отсутствует поддержка IE 8, а также необходимо использовать «браузерные» свойства CSS для поддержки остальных «старичков».
Решение на JavaScript не поддерживается всеми версиями Internet Explorer, а также некоторыми старыми версиями других популярных браузеров (хотя ими уже практически никто и не пользуется).

понедельник, 23 сентября 2013 г.

Абсолютное вертикальное и горизонтальное позиционирование блока

Просто блок

.Absolute-Center {
  margin: auto;
  position: absolute;
  top: 0; left: 0; bottom: 0; right: 0;
}

Блок внутри другого блока

.Center-Container {
  position: relative;
}

.Absolute-Center {
  width: 50%;
  height: 50%;
  overflow: auto;
  margin: auto;
  position: absolute;
  top: 0; left: 0; bottom: 0; right: 0;
}

Внутри Viewport

.Absolute-Center.is-Fixed {
  position: fixed;
  z-index: 999;
}

Блок со смещением в сторону

.Absolute-Center.is-Right {
  left: auto; right: 20px;
  text-align: right;
}

.Absolute-Center.is-Left {
  right: auto; left: 20px;
  text-align: left;
}

Блок с изменяемыми размерами

.Absolute-Center.is-Responsive {
  width: 60%;
  height: 60%;
  min-width: 200px;
  max-width: 400px;
  padding: 40px;
}

Overflow - Блок с прокруткой содержимого внутри себя

.Absolute-Center.is-Overflow {
  overflow: auto;
}

Resizing

.Absolute-Center.is-Resizable {
  min-width: 20%;
  max-width: 80%;
  min-height: 20%;
  max-height: 80%;
  resize: both;
  overflow: auto;
}

Центрирование картинки

HTML

<img src="http://placekitten.com/g/500/200" class="Absolute-Center is-Image" alt="" />

CSS

.Absolute-Center.is-Image {
  height: auto;
}

.Absolute-Center.is-Image img {
  width: 100%;
  height: auto;
}

Переменная высота

JavaScript

/* Modernizr Test for Variable Height Content */
Modernizr.testStyles('#modernizr { display: table; height: 50px; width: 50px; margin: auto; position: absolute; top: 0; left: 0; bottom: 0; right: 0; }', function(elem, rule) {
  Modernizr.addTest('absolutecentercontent', Math.round(window.innerHeight / 2 - 25) === elem.offsetTop);
});

CSS

.absolutecentercontent .Absolute-Center.is-Variable {
  display: table;
  height: auto;
}

Отрицательные Margin

.is-Negative {
        width: 300px;
        height: 200px;
        padding: 20px;
        position: absolute;
        top: 50%; left: 50%;
        margin-left: -170px; /* (width + padding)/2 */
        margin-top: -120px; /* (height + padding)/2 */
}

Трансформации

.is-Transformed {
  width: 50%;
  margin: auto;
  position: absolute;
  top: 50%; left: 50%;
  -webkit-transform: translate(-50%,-50%);
      - ms-transform: translate(-50%,-50%);
             transform: translate(-50%,-50%);
}

Табличная ячейка

HTML

<div class="Center-Container is-Table">
  <div class="Table-Cell">
    <div class="Center-Block">
    <!-- CONTENT -->
    </div>
  </div>
</div>

CSS

.Center-Container.is-Table { display: table; }
.is-Table .Table-Cell {
  display: table-cell;
  vertical-align: middle;
}
.is-Table .Center-Block {
  width: 50%;
  margin: 0 auto;
}

Инлайн-блок

HTML

<div class="Center-Container is-Inline">
  <div class="Center-Block">
    <!-- CONTENT -->
  </div>
</div>

CSS

.Center-Container.is-Inline {
  text-align: center;
  overflow: auto;
}

.Center-Container.is-Inline:after,
.is-Inline .Center-Block {
  display: inline-block;
  vertical-align: middle;
}

.Center-Container.is-Inline:after {
  content: '';
  height: 100%;
  margin-left: -0.25em; /* To offset spacing. May vary by font */
}

.is-Inline .Center-Block {
  max-width: 99%; /* Prevents issues with long content causes the content block to be pushed to the top */
  /* max-width: calc(100% - 0.25em) /* Only for IE9+ */
}

Flexbox

.Center-Container.is-Flexbox {
  display: -webkit-box;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
  -webkit-box-align: center;
     -moz-box-align: center;
     -ms-flex-align: center;
  -webkit-align-items: center;
          align-items: center;
  -webkit-box-pack: center;
     -moz-box-pack: center;
     -ms-flex-pack: center;
  -webkit-justify-content: center;
          justify-content: center;
}

четверг, 19 сентября 2013 г.

Фиксированный заголовок и первая колонка таблицы

Файл index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Fix Header and First column Table</title>
<link href="index.css" rel="stylesheet" type="text/css">
<script src="jquery.js" type="text/javascript"></script>
<script src="index.js" type="text/javascript"></script>
</head>
<body>

<!-- Просто блок, в котором находится наша таблица -->

<div id="table-block">

    <!-- Весь заголовок таблицы -->

    <div class="table-header">

        <!-- Левый верхний блок DIV -->

            <div class="table-head-first">Компании</div>

        <!-- Правый верхний блок DIV -->

            <div class="table-head">
                <div class="table-head-wrapper">
                    <table>
                        <tr>
                            <td><div>Запасы</div></td>
                            <td><div>Основные средства</div></td>
                            <td><div>Долгоср. актив</div></td>
                            <td><div>Краткоср. активы</div></td>
                            <td><div>Актив</div></td>
                            <td><div>Период/тип отч.</div></td>
                        </tr>
                    </table>
                </div>
            </div>
       
    </div>
   
    <!-- Содержимое таблицы -->

        <!-- Левый нижний блок DIV -->

            <div class="table-data-first">
                <table>
                    <tr>
                        <td><div>VimpelCom Ltd. (ВымпелКом)</div></td>
                    </tr>
                    <tr>
                        <td><div>Газпром</div></td>
                    </tr>
                    <tr>
                        <td><div>Газпром Нефть</div></td>
                    </tr>
                    <tr>
                        <td><div>ЛУКОЙЛ НК</div></td>
                    </tr>
                    <tr>
                        <td><div> МТС</div></td>
                    </tr>
                    <tr>
                        <td><div>НЛМК</div></td>
                    </tr>
                    <tr>
                        <td><div>НОВАТЭК</div></td>
                    </tr>
                    <tr>
                        <td><div>Норильский никель ГМК</div></td>
                    </tr>
                    <tr>
                        <td><div>Роснефть НК</div></td>
                    </tr>
                    <tr>
                        <td><div>Сургутнефтегаз</div></td>
                    </tr>
                    <tr class="last">
                        <td><div></div></td>
                    </tr>
                </table>
            </div>
           
        <!-- Правый нижний блок DIV -->

            <div class="table-data">
                <div class="table-data-wrapper">
                    <table>      
                        <tr>
                            <td>167.00</td>
                            <td>15 666.00</td>
                            <td>45 820.00</td>
                            <td>9 540.00</td>
                            <td>55 360.00</td>
                            <td>2012 г. 4 кв., GAAP</td>
                        </tr>
                        <tr>
                            <td>14 779.36</td>
                            <td>251 452.22</td>
                            <td>310 661.81</td>
                            <td>77 469.19</td>
                            <td>388 131.00</td>
                            <td>2012 г. 4 кв., IAS</td>
                        </tr>
                        <tr>
                            <td>2 907.09</td>
                            <td>26 235.75</td>
                            <td>32 885.84</td>
                            <td>13 052.08</td>
                            <td>45 937.91</td>
                            <td>2013 г. 2 кв., IAS</td>
                        </tr>
                        <tr>
                            <td>7 848.00</td>
                            <td>69 640.00</td>
                            <td>77 799.00</td>
                            <td>23 375.00</td>
                            <td>101 174.00</td>
                            <td>2013 г. 1 кв., GAAP</td>
                        </tr>
                        <tr>
                            <td>264.87</td>
                            <td>8 762.52</td>
                            <td>1 171.89</td>
                            <td>3 607.77</td>
                            <td>15 324.00</td>
                            <td>2013 г. 1 кв., GAAP</td>
                        </tr>
                        <tr>
                            <td>2 530.19</td>
                            <td>10 981.40</td>
                            <td>12 100.62</td>
                            <td>5 537.20</td>
                            <td>17 637.82</td>
                            <td>2013 г. 2 кв., GAAP</td>
                        </tr>
                        <tr>
                            <td>99.41</td>
                            <td>6 347.93</td>
                            <td>13 021.92</td>
                            <td>1 873.19</td>
                            <td>14 895.11</td>
                            <td>2012 г. 4 кв., IAS</td>
                        </tr>
                        <tr>
                            <td>3 195.00</td>
                            <td>11 502.00</td>
                            <td></td>
                            <td>7 262.00</td>
                            <td>20 226.00</td>
                            <td>2013 г. 2 кв., IAS</td>
                        </tr>
                        <tr>
                            <td>5 990.54</td>
                            <td>150 536.59</td>
                            <td>76 978.72</td>
                            <td>42 094.85</td>
                            <td>219 073.57</td>
                            <td>2013 г. 2 кв., IAS</td>
                        </tr>
                        <tr>
                            <td>1 689.58</td>
                            <td>29 604.01</td>
                            <td>48 949.39</td>
                            <td>17 656.16</td>
                            <td>66 605.54</td>
                            <td>2012 г. 4 кв., IAS</td>
                        </tr>
                        <tr class="last">
                            <td><div></div></td>
                            <td><div></div></td>
                            <td><div></div></td>
                            <td><div></div></td>
                            <td><div></div></td>
                            <td><div></div></td>
                        </tr>
                    </table>
                </div>
            </div>

</div>

</body>
</html>

Файл index.css

/*\
 * ===============================================>
 * Reset CSS
 * ===============================================>
\*/

html {
font-size: 100.01%;  /* Bug fix for Opera */
}

body {
width: 1000px;
position: relative; /* Bug fix for IE 6 */
margin: 0;
padding: 0;
margin-left: auto;
margin-right: auto;
text-align: center;
font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
font-size: 62.5%;
background-color: #bbbbbb;
color: #333333;
}

div,h1,h2,h3,h4,h5,h6,p,img,ol,ul,li,table,th,td,form,select,fieldset {
margin: 0;
padding: 0;
text-align: left;
}

article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
    display: block;
}

ol,ul {
list-style: none;
}

table {
border: 0px; /* border="0" */
border-collapse: collapse; /* cellspacing="0" */
}

table tr th {
padding: 0px; /* cellpadding="0" */
}

table tr td {
padding: 0px; /* cellpadding="0" */
}

input,textarea,select {
font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
}

textarea {
resize: none;
}

a img {
border: none;
}

a {
color: #333333;
text-decoration: underline;
}

a:hover {
color: #000000;
}

a:active {
text-decoration: none;
}

/* Firefox anchor border remove */
a:active,a:focus,img {
outline: 0;
}

/*\
 * ===============================================>
 * Fix Header and First column Table style
 * ===============================================>
\*/

/* Просто блок, в котором находится наша таблица */

div#table-block {
    width: 900px;
    height: 400px;
    padding: 5px;
    background-color: #ffffff;
    border: 1px solid #000000;
    font-size: 1.3em;
    line-height: 22px;
    overflow: hidden;
}

/* Общие стили для всей таблицы*/

div#table-block table {
    width: auto;
/*    border-collapse: separate !important; */
}

div#table-block table tr td {
    white-space: nowrap;
}

div#table-block table tr td div {
    overflow: hidden;
}

div.table-header {
    border: 1px solid #999999; /* Установлены все границы для заголовка таблицы */
}

div.table-head-wrapper,
div.table-data-wrapper {
    width: 100000px;
}

/* Левый верхний блок DIV */

div.table-head-first {
    float: left;
    *display: inline;
    _display: inline;
    overflow: hidden;
    width: 260px;
    _margin-right: -3px;
    height: 32px;
    _height: 28px;
    line-height: 16px;
    padding: 0 5px;
    _padding-bottom: 4px;
    border-right: 1px solid #999999;
    text-align: center;
}

/* Правый верхний блок DIV */

div.table-head {
    line-height: 16px;
    overflow: hidden;
}

div.table-head table tr td {
    padding: 0 15px;
    border-right: 1px solid #999999;
    vertical-align: top;
    text-align: center;
}

div.table-head table tr td div {
    height: 32px;
    text-align: center;
}

/* Левый нижний блок DIV */

div.table-data-first {height: 197px; /* Значение для примера */
    float: left;
    *display: inline;
    _display: inline;
    overflow: hidden;
    _margin-right: -3px;
    border-left: 1px solid #999999;
    border-bottom: 1px solid #999999;
}

div.table-data-first table tr td {
    padding: 0 5px;
    _padding: 1px 5px;
    border-bottom: 1px solid #999999;
}

div.table-data-first table tr td div {
    width: 260px;
}

div.table-data-first table tr.last td  {
    border-bottom: none;
}

/* Правый нижний блок DIV */

div.table-data {height: 215px; /* Значение для примера */
    overflow: scroll;
    border-left: 1px solid #999999;
    border-right: 1px solid #999999;
    border-bottom: 1px solid #999999;
}

div.table-data table tr td {
    padding: 0 15px;
    _padding: 1px 15px;
    border-right: 1px solid #999999;
    border-bottom: 1px solid #999999;
    text-align: right;
}

div.table-data table tr.last td  {
    border-bottom: none;
}


Файл index.js

// НАЧАЛО - МИНИМАЛЬНО НЕОБХОДИМЫЙ КОД ДЛЯ ВЫРАВНИВАНИЯ И ПРОКРУЧИВАНИЯ ТАБЛИЦЫ

// Возвращает ширину скролбара
function getScrollbarWidth() {
    var scrollbarWidth
        , blockWidthWithoutScrollbar
        , blockWidthWithScrollbar
        , div = $('<div style="width:50px;height:50px;overflow:hidden;position:absolute;top:-200px;left:-200px;"><div style="height:100px;"></div></div>');
   
    $('body').append(div);

    blockWidthWithoutScrollbar = $('div', div).innerWidth();

    div.css('overflow-y', 'scroll');

    blockWidthWithScrollbar = $('div', div).innerWidth();

    $(div).remove();
    scrollbarWidth = blockWidthWithoutScrollbar - blockWidthWithScrollbar;

    if (!scrollbarWidth) {
        scrollbarWidth = 16;
    }

    return scrollbarWidth;
}

// Возвращает ширину 1em в пикселях
function getEmWidth(element) {
    var tmp = $('<div style="position: absolute; z-index: -1000; width: 1em; margin: 0; padding: 0;"></div>')
        , width;
       
    element.append(tmp);
    width = tmp.width();
    $(tmp).remove();
   
    return width;
}

// Выравнивает ширину ячеек таблицы
function alignTableCellsWidth(table) {
    var headTdCells = table.find('.table-head td div')
        , em = getEmWidth(table.find('.table-data td:last'))
        , leftPlusRightBorderWidth = 2;
               
    table.find('.table-data table tr.last, .table-side table tr.last').remove();
    table.find('.table-data table').append('<tr class="last"></tr>');
    table.find('.table-side table').append('<tr class="last"><td><div></div></td></tr>');

    headTdCells.each(function(index){
        var td = $('<td><div></div></td>');
        table.find('.table-data tr.last').append(td);

        var dataTdCell = td.find('div');
        var thWidth = $(this).width();
        var tdWidth = dataTdCell.width();
        var emWidth;

        if (thWidth > tdWidth){
            emWidth = Math.floor(thWidth / em) + 2;
        } else {
            emWidth = Math.floor(tdWidth / em) + 2;
        }
        dataTdCell.css('width', emWidth + 'em');
        $(this).css('width', emWidth + 'em');
    });

    table.find('.table-head-wrapper').width(table.find('.table-head-wrapper table').width() + getScrollbarWidth() + leftPlusRightBorderWidth);
    table.find('.table-data-wrapper').width(table.find('.table-data-wrapper table').width());
}

// Прокрутка для таблицы
function initTableScroll () {
    $('.table-data:first').scroll(function(){
        var top = $(this).scrollTop();
        var left = $(this).scrollLeft();

        $('.table-data-first').scrollTop(top);
        $('.table-head').scrollLeft(left);
    });
}

// КОНЕЦ - МИНИМАЛЬНО НЕОБХОДИМЫЙ КОД ДЛЯ ВЫРАВНИВАНИЯ И ПРОКРУЧИВАНИЯ ТАБЛИЦЫ

// НАЧАЛО - ДОПОЛНИТЕЛЬНЫЙ КОД

//Сбрасывает стили таблицы
function resetTable(table){
    table.find('.table-head-wrapper, .table-data-wrapper, .table-head td div, .table-data td div').removeAttr('style');
}

// КОНЕЦ- ДОПОЛНИТЕЛЬНЫЙ КОД

$(document).ready(function(){
// НАЧАЛО - МИНИМАЛЬНО НЕОБХОДИМЫЙ КОД ДЛЯ ВЫРАВНИВАНИЯ И ПРОКРУЧИВАНИЯ ТАБЛИЦЫ
    alignTableCellsWidth($('#table-block'));
    initTableScroll();
// КОНЕЦ - МИНИМАЛЬНО НЕОБХОДИМЫЙ КОД ДЛЯ ВЫРАВНИВАНИЯ И ПРОКРУЧИВАНИЯ ТАБЛИЦЫ
});

Фиксированный заголовок таблицы

Самый простой и лучший способ зафиксировать заголовок таблицы.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>

table {
    border: 0px; /* border="0" */
    border-collapse: collapse; /* cellspacing="0" */
}

table tr th {
    padding: 0px; /* cellpadding="0" */
}

table tr td {
    padding: 0px; /* cellpadding="0" */
}

div.header-wrapper {
    width: 320px;
    border: 1px solid black;
    border-bottom: none;
}

div.body-wrapper {
    overflow: auto;
    width: 320px;
    height: 110px;
    border: 1px solid black;
    border-top: none;
}

table.header {
    width: 300px;
    border-bottom: 1px solid black;
}

table.body {
    width: 300px;
}

table.header tr td {
    border-right: 1px solid black;
}

table.body tr td {
    border-right: 1px solid black;
    border-bottom: 1px solid black;
}

table.body tr.last-row td {
    border-bottom: none;
}

table tr td.first {
    width: 150px;
}

</style>
<title>Fix Table Header</title>
</head>
<body>

<div class="header-wrapper">
    <table class="header">
        <tr>
            <td class="first">Column 1</td>
            <td class="last">Column 2</td>
        </tr>
    </table>
</div>

<div class="body-wrapper">
    <table class="body" >
    <tr>
        <td class="first">Value 1</td>
        <td class="last">Value 2</td>
    </tr>
    <tr>
        <td class="first">Value 1</td>
        <td class="last">Value 2</td>
    </tr>
    <tr>
        <td class="first">Value 1</td>
        <td class="last">Value 2</td>
    </tr>
    <tr>
        <td class="first">Value 1</td>
        <td class="last">Value 2</td>
    </tr>
    <tr>
        <td class="first">Value 1</td>
        <td class="last">Value 2</td>
    </tr>
    <tr class="last-row">
        <td class="first">Value 1</td>
        <td class="last">Value 2</td>
    </tr>
    </table>
</div>

</body>
</html>

пятница, 26 июля 2013 г.

6 Methods For Vertical Centering With CSS

Centering elements vertically with css is something that often gives designers trouble. There are however a variety of methods for vertical centering and each is fairly easy to use. Today I want to present 6 of those methods.

I’ve usually skipped over the topic of vertical centering, since there are some good posts already out there that are easy enough to find, but recently Bikram commented requesting a tutorial on vertically centering so I thought why not.
You can view demos of each of the methods below by clicking here. Clicking the images above each section will also take you to that specific demo.
Let’s start by first talking about something that doesn’t work as many expect. Understanding why vertical-align doesn’t always work will help us better understand vertical centering in general.
abstract photograph of vertical light

Vertical-Align

Horizontal centering with css is rather easy. When the element to be centered is an inline element we use text-align center on its parent. When the element is a block level element we give it a width and set the left and right margins to a value of auto.
With text-align: center in mind, most people look first to vertical-align in order to center things vertically. It seems logical and I know it was my first choice. If you’ve come from table based layout you likely used the valign attribute, which would also lead you to believe vertical-align is the way to go.
However valign only worked on table cells. Vertical-align is similar. It also applies to table cells and it works with some inline elements.
The values for vertical-align have meaning with respect to a parent inline element.
  • With a line of text the values are relative to the line-height.
  • With a table cell the values are relative to the table-height-algorithm, which usually means the height of the row.
Unfortunately vertical-align doesn’t apply to block-level elements like a paragraph inside a div, which is where most of us figure out it isn’t the be all solution to vertical centering.
All is not lost though, as we have other methods for centering block level elements and we can still use vertical-align where appropriate. Which method you choose will depend on what you’re trying to center relative to its container element.
line height demo

Line-Height Method

This method will work when you want to vertically center a single line of text. All we need to do is set a line-height on the element containing the text larger than it’s font-size.
By default equal space will be given above and below the text and so the text will sit in the vertical center.
Most tutorials will also set the height on the element with the same value given to the line-height. I don’t think setting the height is necessary, but if line-height alone doesn’t work for you setting the height of the element will likely be the solution.

html

1
2
3
<div id="parent">
    <div id="child">Text here</div>
</div>

css

1
2
3
#child {
    line-height: 200px;
}
The above works in all browsers, however it will only work for a single line of text. If your text could wrap to a 2nd line you need to use a different method. The value of 200px above is arbitrary. You can use any value you want as long as it’s larger than the font-size that’s been set.
Added: As Jeff pointed out in the comments below, there’s one small got’cha with this method in that you have to be careful when using the shortcut for the font property. This method relies on you setting the line-height as a value greater than the font-size. When you use the font shortcut any property you don’t specifically set gets set to its default value. With line-height that default is 1. If you use the font shortcut, just make sure to explicitly set the line-height inside.

Centering an Image with Line-Height

What if the content you want centered is an image? Will this method work? The answer is yes with one additional line of css.

html

1
2
3
<div id="parent">
    <img src="image.png" alt="" />
</div>

css

1
2
3
4
5
6
7
#parent {
    line-height: 200px;
}

#parent img {
    vertical-align: middle;
}
You set the line-height as we did above (It’ll need to be greater than the height of the image) and then set vertical-align: middle on the image.
table cell demo

CSS Table Method

Above I mentioned that vertical-align applies to table cells which leads us to this method. We’ll display our elements as table and table cell and then use the vertical-align property to center the content.
Note: CSS tables are not the same as html tables.

html

1
2
3
<div id="parent">
    <div id="child">Content here</div>
</div>

css

1
2
3
4
5
6
#parent {display: table;}

#child {
    display: table-cell;
    vertical-align: middle;
}
We set the parent div to display as a table and the child div to display as a table-cell. We can then use vertical-align on the child div and set it’s value to middle. Anything inside this child div will be vertically centered.
Unlike the method above the content can be dynamic as the div will grow with what’s placed inside. The downside of this method is it doesn’t work in older versions of IE, though there is a fix, which is to add display: inline-block to the child element.
1
2
3
#child {
    display: inline-block;
}
absolute positioning and negative margin demo

Absolute Positioning and Negative Margin

This method works for block level elements and also works in all browsers. It does require that we set the height of the element we want to center.
In the code below I’m centering the child both vertically and horizontally using this method.

html

1
2
3
<div id="parent">
    <div id="child">Content here</div>
</div>

css

1
2
3
4
5
6
7
8
9
10
#parent {position: relative;}

#child {
    position: absolute;
    top: 50%;
    left: 50%;
    height: 30%;
    width: 50%;
    margin: -15% 0 0 -25%;
}
We begin by positioning both parent and child divs. Next we set the top and left values of the child to be 50% each, which would be the center of the parent. However this sets the top left corner to be in the center so we’re not done.
We need to move the child up (by half its height) and to the left (by half its width) so it’s center is what sits in the center of the parent element. This is why we need to know the height (and here the width) of the child element.
To do that we give the element a negative top and left margin equal to half its height and width.
Unlike the first 2 methods this one is meant for block level elements. It does work in all browsers, however the content can outgrow its container in which case it will disappear visually. It’ll work best when you know the heights and widths of the elements.
absolute positioning and vertical stretching demo

Absolute Positioning and Stretching

As with the method above this one begins by setting positioning on the parent and child elements as relative and absolute respectively. From there things differ.
In the code below I’ve once again used this method to center the child both horizontally and vertically, though you can use the method for vertical centering only.

html

1
2
3
<div id="parent">
    <div id="child">Content here</div>
</div>

css

1
2
3
4
5
6
7
8
9
10
11
12
#parent {position: relative;}

#child {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    width: 50%;
    height: 30%;
    margin: auto;
}
The idea with this method is to try to get the child element to stretch to all 4 edges by setting the top, bottom, right, and left vales to 0. Because our child element is smaller than our parent elements it can’t reach all 4 edges.
Setting auto as the margin on all 4 sides however causes opposite margins to be equal and displays our child div in the center of the parent div.
Unfortunately the above won’t work in IE7 and below and like the previous method the content inside the child div can grow too large causing it to be hidden.
vertical centering with padding demo

Equal Top and Bottom Padding

In the method above we allowed the browser to automatically set the margins of the child element so they would be equal. In this method we’ll do something similar and explicitly set the top and bottom padding of the parent to be equal.

html

1
2
3
<div id="parent">
    <div id="child">Content here</div>
</div>

css

1
2
3
4
5
6
7
#parent {
    padding: 5% 0;
}

#child {
    padding: 10% 0;
}
In the css above I’ve set top and bottom paddings on both elements. Setting it on the child will make sure the contents in the child will be vertically centered and setting it on the parent ensures the entire child is centered within the parent.
I’m using relative measurements to allow each div to grow dynamically. If one of the elements or it’s content needs to be set with an absolute measurement then you’ll need to do some math to make sure things add up.
For example if the parent was 400px in height and the child 100px in height we’d need 150px of padding on both the top and bottom.
150 + 150 + 100 = 400
Using % could throw things off in this case unless our % values corresponded to exactly 150px.
This method works anywhere. The downside is that depending on the specifics of your project you may need to do a little math. However if you’re falling in line with the idea of developing flexible layouts where your measurements are all relative you can avoid the math.
Note: This method works by setting paddings on the outer elements. You can flip things and instead set equal margins on the inner elements. I tend to use padding, but I’ve also used margins with success. Which you choose would depend on the specifics of your project.
vertical centering with floater div demo

Floater Div

This last method requires an empty div which is floated and used to control where our child element sits in the document flow. Notice the floater div comes before our child div in the html below.

html

1
2
3
4
<div id="parent">
    <div id="floater"></div>
    <div id="child">Content here</div>
</div>

css

1
2
3
4
5
6
7
8
9
10
11
12
13
#parent {height: 250px;}

#floater {
    float: left;
    height: 50%;
    width: 100%;
    margin-bottom: -50px;
}

#child {
    clear: both;
    height: 100px;
}
We float the empty div to the left (or right) and give it a height of 50% of the parent div. That causes it to fill up the entire upper half of the parent element.
Because this div is floated it’s removed from the normal document flow so we need to clear the child element. Here I’ve used clear: both, but you just need to clear in the same direction you floated the empty floater div.
The top edge of the child div should now be immediately below the bottom edge of the floater div. We need to bring the child element up by an amount equal to half it’s height and to do so we set a negative margin-bottom on the floater div.
This method also works across browsers. The downside is that it requires an empty div and that you know the height of the child element.

Additional Resources

In the sections above I linked to articles specific to each method. Below are some resources that cover more than a single method for centering.
verticle fence posts

Summary

None of the methods above is complicated and I’m sure if you use each once or twice it’ll be easy to use again.
The difficultly if there is one is that none of the methods above is perfect for all occasions. The trick is to understand several of the above and use each appropriately.
Some of the methods work better for inline elements and others work better for block level elements. Some might work better with your preference for developing a layout and some don’t work in older versions of a certain browser we all know well.
Rarely do I vertically center elements in a design. When I do the methods I tend to use are the line-height method and the equal padding method. One or the other has always worked for my needs.
If neither worked I would reach for either the positioning or floater methods and save the table cell method as a last resort. In time we’ll be able to use the css3 flexible box layout module and forget about the methods above, but for now browser support isn’t quite there.

Do you use any of the above methods or do you use a different method I didn’t mention? Is there a vertical centering issue that none of the methods here address?

вторник, 16 июля 2013 г.

HTML 5 и CSS 3

HTML5

<!DOCTYPE html>
<header>
<footer>
<nav>
<aside>
<article>
<section>
<figure>
<progress>
<audio>
<video>
<canvas>

CSS 3

BORDER RADIUS

-webkit-border-raidus: 10px 10px 10px 10px; /* top, right, bottom, left*/
border-radius: 10px 10px 10px 10px;

BORDER IMAGE

-webkit-border-image:url(border.png) 30 30 round; /* Safari 5 and older */
-o-border-image:url(border.png) 30 30 round; /* Opera */
border-image:url(border.png) 30 30 round;

BOX SHADOW

-webkit-box-shadow: inset 10px 10px 5px 5px; /* inset, horizontal length, vertical length, blur rarius, spread, shadow color */
box-shadow: inset 10px 10px 5px 5px;

TEXT SHADOW

text-shadow: 10px 10px 5px #ff0000; /* horizontal length, vertical length, blur radius, shadow color */
filter: dropshadow(color=#ff0000, offx=10, offy=10);

BREAK WORD WRAP

word-wrap: break-word;

RGBA COLOR

background-color: rgba(255, 255, 255, 0.5); /* red, green, blue, opacity 0.1 - 1*/
color: rgba(255, 255, 255, 0.5);

BACKGROUND SIZE

background: url(img_flwr.gif);
background-repeat: no-repeat;
background-size: 80px 60px;
background-origin: content-box;

MULTIPLE BACKGROUND IMAGES

background-image: url(img_flwr.gif), url(img_tree.gif);

FONT FACE

@font-face {
    font-family: 'RBC-font'; /* font family */
    src: url('RBC.eot?') format('eot'), /* font-name */
          url('RBC.woff') format('woff'),
          url('RBC.ttf') format('truetype');
}

div {
    font-family: RBC-font;
}

MULTIPLE COLUMNS

-moz-column-count: 2; /* number of columns */
-moz-column-gap: 100px; /* gap between columns */
-webkit-column-count: 2;
-webkit-column-gap: 100px;
column-count: 2;
column-gap: 100px;

COLUMN RULES

-moz-column-rule: 3px outset #ff0000; /* Firefox */
-webkit-column-rule: 3px outset #ff0000; /* Safari and Chrome */
column-rule: 3px outset #ff0000;

BOX RESIZE

resize: horizontal;
overflow: auto;
min-width: 50px;
min-heoght: 50px;

BOX SIZING

-moz-box-sizing: border-box; /* -moz-box-sizing: content-box; */
-webkit-box-sizing: border-box;  /* -webkit-box-sizing: content-box; */
box-sizing: border-box;  /* box-sizing: content-box; */

OUTLINE

outline: 10px solid #ff0000; /* thickness, style, color */
outline-offset: 10px; /* delete this if you don't want an offset */

TRANSITIONS

-webkit-transition: background: 10s ease; /* property: (background, color, height, width, outline), duration: (seconds, milliseconds), functions: (ease, linear, ease-in, ease-out, ease-in-out)
-moz-transition: background: 10s ease;
-ms-transition: background: 10s ease;
-o-transition: background: 10s ease;
transition: background: 10s ease;

MULTIPLE TRANSITIONS

-webkit-transition: width 2s, height 2s, -webkit-transform 2s;
transition: width 2s, height 2s, transform 2s;

TRANSITIONS PROPERTIES

-webkit-transition-property:width;
-webkit-transition-duration:1s;
-webkit-transition-timing-function:linear;
-webkit-transition-delay:2s;
transition-property: width;
transition-duration: 1s;
transition-timing-function: linear;
transition-delay: 2s;

TRANSFORM

-moz-transform:    scale(1.5) rotate(45deg) translateX(10px) translateY(10px) skewX(15deg) skewY(15deg);
-webkit-transform: scale(1.5) rotate(45deg) translateX(10px) translateY(10px) skewX(15deg) skewY(15deg);
-o-transform:        scale(1.5) rotate(45deg) translateX(10px) translateY(10px) skewX(15deg) skewY(15deg);
-ms-transform:      scale(1.5) rotate(45deg) translateX(10px) translateY(10px) skewX(15deg) skewY(15deg);
transform:             scale(1.5) rotate(45deg) translateX(10px) translateY(10px) skewX(15deg) skewY(15deg);

TRANSFORM USING MATRIX METHOD

-ms-transform:matrix(0.866,0.5,-0.5,0.866,0,0); /* IE 9 */
-webkit-transform:matrix(0.866,0.5,-0.5,0.866,0,0); /* Safari and Chrome */
transform:matrix(0.866,0.5,-0.5,0.866,0,0);

ANIMATIONS

@-webkit-keyframes myfirst { /* Safari and Chrome */
    from {background: red;}
    to {background: yellow;}
}

@keyframes myfirst {
    from {background: red;}
    to {background: yellow;}
}

div {
    -webkit-animation: myfirst 5s; /* Safari and Chrome */
    animation: myfirst 5s;
}

@-webkit-keyframes mysecond { /* Safari and Chrome */
    0%   {background: red; left:0px; top:0px;}
    25%  {background: yellow; left:200px; top:0px;}
    50%  {background: blue; left:200px; top:200px;}
    75%  {background: green; left:0px; top:200px;}
    100% {background: red; left:0px; top:0px;}
}

@keyframes mysecond{
    0%   {background: red; left:0px; top:0px;}
    25%  {background: yellow; left:200px; top:0px;}
    50%  {background: blue; left:200px; top:200px;}
    75%  {background: green; left:0px; top:200px;}
    100% {background: red; left:0px; top:0px;}
}

div {
    -webkit-animation: mysecond 5s; /* Safari and Chrome */
    animation: mysecond 5s;
}

div {
    -webkit-animation-name: myfirst;
    -webkit-animation-duration: 5s;
    -webkit-animation-timing-function: linear;
    -webkit-animation-delay: 2s;
    -webkit-animation-iteration-count: infinite;
    -webkit-animation-direction: alternate;
    -webkit-animation-play-state: running;
    animation-name: myfirst;
    animation-duration: 5s;
    animation-timing-function: linear;
    animation-delay: 2s;
    animation-iteration-count: infinite;
    animation-direction: alternate;
    animation-play-state: running;
}

GRADIENTS

background: #1e5799; /* Old browsers */
background: -webkit-gradient          (linear, left top, left bottom, color-stop(0%,#1e5799), color-stop(50%,#2989d8), color-stop(51%,#207cca), color-stop(100%,#7db9e8)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient (top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* Chrome10+,Safari5.1+ */
background: -moz-linear-gradient     (top, #1e5799 0%, #2989d8 50%, #207cca 51%, #7db9e8 100%); /* FF3.6+ */
background: -o-linear-gradient         (top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* Opera 11.10+ */
background: -ms-linear-gradient       (top, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* IE10+ */
background: linear-gradient              (to bottom, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#7db9e8',GradientType=0 ); /* IE6-9 */

понедельник, 4 февраля 2013 г.

Требования к оформлению кода CSS

Требования к оформлению кода CSS

1. Кодировка файлов – UTF-8.

2. Разделители строк – UNIX (\n).

3. Каждое правило CSS пишется на новой строке с отступом в 1 Tab (1 Tab = 4 Пробела).

div {
    color:  #000000;
    cursor:  pointer;
}

4. Каждый селектор должен содержать только необходимое и достаточное число элементов.

5. Желательно использовать существующие обобщенные стили для описания однотипных элементов, если такие стили уже присутствуют в коде.

6. Желательно не дублировать свойства, наследуемые от родительских элементов, если в этом нет необходимости.

7. Желательно создавать спрайты вместо отдельных картинок.

8. Нескольких селекторов, имеющих однотипные правила оформления, желательно записывать на новой строке, перечисляя их через запятую.

a:link,
a:hover,
a:visited,
a:active {
    color:  #000000;
    font-weight:  bold;
}

9. Желательно располагать рядом CSS-код элементов, последовательно записанных в HTML-коде, с соблюдением порядка следования HTML-тэгов друг за другом.

10. Желательно выделять комментариями-заголовками крупные блоки CSS-правил, для группировки их по смыслу и отделения от остальных элементов.

/******** HEADER > ATTIC > SEARCH ********/

11. Обязательно необходимо оставлять пояснения рядом с хаками и закомментированными участками кода. Стоит помнить, что последовательность написания хаков для Internet Explorer имеет значение. Хаки необходимо записывать отдельно под блоком CSS-кода, требующего применения хаков.

/* Стандартный код CSS */
div {
    margin-top:  5px;
}

/* Хак для Internet Explorer 7 */
div {
    *margin-top: 2px;
}

/* Хак для Internet Explorer 6 */
div {
    _margin-top: 2px;
}

/* Хак для Internet Explorer 8 */
@media \0screen {
div {
    margin-top: 2px;
}
}

/* Хак для Internet Explorer 9 */
:root div {
    margin-top: 2px \0/IE9 !important;
}

/* Хак для Internet Explorer 8 и 9 */
div {
    margin-top: 2px \0/;
}

/* Хак для Internet Explorer 9 и 10 */
@media all and (min-width:0) {
div {
    margin-top: 2px \0/;

}

/* Хак для Firefox */
@-moz-document url-prefix() {
div {
    margin-top: 2px;
}
}

/* Хак для Chrome и Safari */
@media screen and (-webkit-min-device-pixel-ratio:0) {
div {
    margin-top: 2px;
}
}
                               
/* Хак для Opera 9.5 */       
*|html[xmlns*=""] div {
    margin-top: 2px;
}   

/* Хак для Opera выше 9.5 */       
@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) {
div {
    margin-top: 2px;
}
}

12. Обязательно все идентификаторы и классы должны иметь перед собой название тэга, к которому они привязаны.

div#identificator {
    font-weight:  bold;
}

div#identificator div.class {
    cursor:  pointer;
}

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

.class {
    color:  #000000;
}

13. Желательно в начале CSS-файла размещать общие для всей страницы reset-правила, за ними располагать классы без тэгов для элементов имеющих общие черты в оформлении, после чего размещать код обобщенных стилей для элементов имеющих однотипный дизайн, затем располагать блоки кода для элементов имеющих на странице уникальный дизайн.

14. Желательно URL в background записывать без кавычек.

background-image: url(img/picture.gif);

15. Желательно соблюдать осмысленный порядок записи правил в столбик, группируя и располагая сходные правила рядом.

Пример:

height: 300px;
min-height: 100px;
max-height: 500px;

margin-top:  10px;
margin-left:  10px;
margin-right:  10px;
margin-bottom:  10px;

text-indent: 10px;
text-align: left;
text-transform: uppercase;
text-decoration: underline;

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

text-transform: uppercase;
text-decoration: underline;
text-align: left;
text-indent: 10px;

Пример того, как код  может выглядеть при группировке всех правил:

tag {
    display: block;
    visibility: hidden;
    overflow: auto;
    overflow-x: auto;
    overflow-y: auto;
    position:  absolute;
    zoom: 1;
    z-index: 100;
    float: left;
    clear: both;
    width: 200px;
    min-width: 100px;
    max-width: 500px;
    height: 300px;
    min-height: 100px;
    max-height: 500px;
    clip: rect(40px, auto, auto, 40px);
    top: 10px;
    left: 10px;
    right: 10px;
    bottom: 10px;
    margin: 0 10px 0 10px;
    margin-top:  10px;
    margin-left:  10px;
    margin-right:  10px;
    margin-bottom:  10px;
    padding: 0 10px 0 10px;
    padding-top: 10px;
    padding-left: 10px;
    padding-right: 10px;
    padding-bottom: 10px;
    background: #ffffff url(img/picture.gif) 0px 0px no-repeat;
    background-color: #789abc;
    background-image: url(img/picture.gif);
    background-repeat: no-repeat;
    background-position: 0 10px;
    background-attachment: scroll;
    border: 1px solid #000000;
    border-top: 1px solid #000000;
    border-left: 1px solid #000000;
    border-right: 1px solid #000000;
    border-bottom: 1px solid #000000;
    border-collapse: collapse;
    border-spacing: 2px;
    -webkit-box-shadow: 2px 2px 3px #969696;
    -moz-box-shadow: 2px 2px 3px #969696;
    box-shadow: 2px 2px 3px #969696;
    filter: progid:DXImageTransform.Microsoft.Shadow(color='#969696', Direction=145, Strength=3);
    table-layout: fixed;
    vertical-align: top;
    font: Arial, Helvetica, sans-serif italic 10em;
    font-family: Arial, Helvetica, sans-serif;
    font-style: italic;
    font-weight: bold;
    font-variant: normal;
    font-stretch: normal;
    font-size-adjust: 0.58;
    line-height: 10px;
    text-indent: 10px;
    text-align: left;
    text-transform: uppercase;
    text-decoration: underline;
    list-style: url(img/bullet.gif) inside;
    list-style-image: url(img/bullet.gif);
    list-style-type: circle;
    list-style-position: inside;
    word-spacing: normal;
    white-space: nowrap;
    color: #789abc;
    cursor: pointer;
}

/***** Selector Hacks ******/

/* IE6 and below */
* html #uno  { color: red }

/* IE7 */
*:first-child+html #dos { color: red }

/* IE7, FF, Saf, Opera  */
html>body #tres { color: red }

/* IE8, FF, Saf, Opera (Everything but IE 6,7) */
html>/**/body #cuatro { color: red }

/* Opera 9.27 and below, safari 2 */
html:first-child #cinco { color: red }

/* Safari 2-3 */
html[xmlns*=""] body:last-child #seis { color: red }

/* safari 3+, chrome 1+, opera9+, ff 3.5+ */
body:nth-of-type(1) #siete { color: red }

/* safari 3+, chrome 1+, opera9+, ff 3.5+ */
body:first-of-type #ocho {  color: red }

/* saf3+, chrome1+ */
@media screen and (-webkit-min-device-pixel-ratio:0) {
 #diez  { color: red  }
}

/* iPhone / mobile webkit */
@media screen and (max-device-width: 480px) {
 #veintiseis { color: red  }
}

/* Safari 2 - 3.1 */
html[xmlns*=""]:root #trece  { color: red  }

/* Safari 2 - 3.1, Opera 9.25 */
*|html[xmlns*=""] #catorce { color: red  }

/* Everything but IE6-8 */
:root *> #quince { color: red  }

/* IE7 */
*+html #dieciocho {  color: red }

/* IE 10+ */
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
   #veintiun { color: red; }
}

/* Firefox only. 1+ */
#veinticuatro,  x:-moz-any-link  { color: red }

/* Firefox 3.0+ */
#veinticinco,  x:-moz-any-link, x:default  { color: red  }

/* FF 3.5+ */
body:not(:-moz-handler-blocked) #cuarenta { color: red; }


/***** Attribute Hacks ******/

/* IE6 */
#once { _color: blue }

/* IE6, IE7 */
#doce { *color: blue; /* or #color: blue */ }

/* Everything but IE6 */
#diecisiete { color/**/: blue }

/* IE6, IE7, IE8, but also IE9 in some cases :( */
#diecinueve { color: blue\9; }

/* IE7, IE8 */
#veinte { color/*\**/: blue\9; }

/* IE6, IE7 -- acts as an !important */
#veintesiete { color: blue !ie; } /* string after ! can be anything */

/* IE8, IE9 */
#anotherone  {color: blue\0/;} /* must go at the END of all rules */

/* IE9, IE10 */
@media screen and (min-width:0\0) {
    #veintidos { color: red}
}


The most common CSS hack to target Firefox is to put something like this in your stylesheet:

@-moz-document url-prefix() { h1 { color: red; } }

But if you’re using LESS.css, this is a problem, because LESS uses the ‘at’ symbol (@) for variables. When LESS parses the above declaration, since @-moz-document isn’t a variable, you get an error.

Thankfully there are other easy ways to target Firefox in CSS that allow us to continue using LESS. For instance:

body:not(:-moz-handler-blocked) #your-target-element {
  color: red;
}