Тег: c

«Аккордеон» для сайта без JavaScript

Продолжая тему всяких интерактивных и не очень элементов для сайта, обратим взор на «аккордеон». Это на самом деле хороший способ уместить большое количество информации на маленькой площади.

Давайте сделаем наш аккордеон без Javascript на чистом CSS. Как всегда, сначала ДЕМО.

HTML:

    <div class="wrapper clearfix">
        <ul class="accordion clearfix">
            <li>
                <input type="radio" name="accordion" checked="checked" id="id1">
                <label for="id1">Option 1</label>

                <div class="content">
                    1 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
                </div>
            </li>


            <li>
                <input type="radio" name="accordion" id="id2">
                <label for="id2">Option 2</label>

                <div class="content">
                    2 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
                </div>
            </li>


            <li>
                <input type="radio" name="accordion" id="id3">
                <label for="id3">Option 3</label>

                <div class="content">
                    3 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
                </div>
            </li>
        </ul>
    </div>

Итак, у нас список ul.accordion с тремя элементами. У каждого элемента есть input[type="radio"] для определения отображать контент или нет; label, где мы храним заголовок и div.content с нашим текстом и/или графикой.

CSS:

.wrapper {
    width: 100%;
    min-width: 320px;
}

.clearfix:before, .clearfix:after {
    display: table;
    content: ' ';
}

.accordion {
    list-style: none;
    padding: 0;
    margin: 0;
    display: block;
    position: relative;
}

.accordion li {
    display: block;
}

.accordion li label {
    padding: 10px;
    background-color: #eee;
    display: block;
    font-weight: 700;
    cursor: pointer;
}

.accordion li .content {
    display: none;
    padding: 10px;
}

.accordion li input {
    display: none;
}

.accordion li input:checked ~ label {
    background-color: #fff;
}
.accordion li input:checked ~ .content {
    display: block;
}

Наши инпуты делаем невидимыми, а с помощью input:checked ~ .content показываем только тот контент, input, для которого выбран.

И еще раз ДЕМО.

27 октября 2014
4.9 тыс.
3 мин

Создаем Twitter Cards для сайта

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

Называется это Twitter Card и делается это очень легко с помощью нескольких мета-тегов на странице:

<meta name="twitter:site" content="@mobilaname">
<meta name="twitter:creator" content="@ashorror">
<meta name="twitter:card" content="summary">
<meta name="twitter:url" content="http://blog.mobila.name/post/543cf10b11d0c/">
<meta name="twitter:title" content="Украина, Херсонская область">
<meta name="twitter:description" content="Вчера утром поездом выехал в Украину. Первый пункт назначения - Новая Каховка.Поезд примчал меня в Мелитополь. Сюда едут те, кто потом едет на отдых на Азовское море. Население Мелитополя - 150 тысяч человек.">
<meta name="twitter:image" content="http://ic.pics.livejournal.com/larchanka/20861394/31955/original.jpg">

Давайте разберем их все.

  • twitter:site - аккаунт сайта в твиттере, включая '@'
  • twitter:creator - аккаунт автора в твиттере, включая '@'
  • twitter:card - Тип карточки: summary, photo или video.
  • twitter:url - Адрес страницы в интернете.
  • twitter:title - Заголовок статьи.
  • twitter:description - Описание статьи до 200 символов.
  • twitter:image - Изображение для карточки.

Когда все эти теги уже вставлены на страницы вашего сайта, самое время подать заявку для вашего домена. Подтверждение заявки – символический процесс и проходит почти сразу. Сделать этом можно на специальной странице.

14 октября 2014
4.6 тыс.
1 мин

Настоящий размер изображения в JavaScript

Иногда в JavaScript необходимо получить размер изображения. И все бы неплохо, но в связи со всякими Retina-дисплеями и другими экранами с высокой плотностью пикселей, изображения на страницу ставят большого размера, а потом их уменьшают. В итоге простыми методами получить размер становится тяжеловато.

Вот способ узнать необходимые параметры с помошью неизменяемых свойств naturalWidth и naturalHeight.

var src="http://path.to/image.jpg",
    img = new Image();

img.src = src;

img.onload = function() {
    console.log('Ширина изображения: %s пикселей', this.naturalWidth);
    console.log('Высота изображения: %s пикселей', this.naturalHeight);
}
07 октября 2014
4.2 тыс.
24 сек

Где воровали свои идеи дизайнера советского автопрома

Мысли о том, что в СССР умели делать красивые машины пропадают вместе с пониманием, кто и когда придумал этот дизайн на самом деле.

29 сентября 2014
4.7 тыс.
9 сек

Программы, без которох тяжело жить

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

PuntoSwitcher

Как ни крути, а раскладку клавиатуры хотя бы раз каждый из нас забывал поменять. И если поисковые системы уже давно умеют определять сие недоразумение, то операционные системы до сих пор не могут этого делать. PuntoSwitcher для этого и сделан.

Облачные хранилища

Dropbox, Copy, Mega, 4sync, Yandex.Disk, Google Drive: любая из этих программ облегчит синхронизацию файлов между различными устройствами и работу с ними в разных местах. Лично я пользуюсь тремя – Copy, Mega, iCloud Drive.

27 сентября 2014
5.1 тыс.
2 мин

@media-запросы для экранов высокой плотности (retina)

При разработке отзывчивых сайтов в CSS используются всеми любимые @media-запросы. В 99% случаев в коде можно увидеть только запросы содержащие min-width, max-width, min-device-width и max-device-width. Иногда попадаются запросы на тип устройства и его положение в пространстве.

С выходом устройст с высокой плотностью экрана, например Retina от Apple, возникала проблема отрисовки некоторых элементов на таких дисплеях. В CSS есть специальный media-query и для этих целей.

Пример для экранов «яблочных устройств»:

@media 
(-webkit-min-device-pixel-ratio: 2), 
(min-resolution: 192dpi) { 
    /* CSS для ретины */
}

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

/* 1.25 dpr */
@media
(-webkit-min-device-pixel-ratio: 1.25),
(min-resolution: 120dpi){
    /* CSS для ретины */
}

/* 1.3 dpr */
@media
(-webkit-min-device-pixel-ratio: 1.3),
(min-resolution: 124.8dpi){
    /* CSS для ретины */
}

/* 1.5 dpr */
@media
(-webkit-min-device-pixel-ratio: 1.5),
(min-resolution: 144dpi){
    /* CSS для ретины */
}

/*2.0 dpr */
@media
(-webkit-min-device-pixel-ratio: 2),
(min-resolution: 192dpi){
    /* CSS для ретины */
}

Взял отсюда.

18 сентября 2014
8.5 тыс.
1 мин

WCG 2005 – белорусские отборочные

Ненароком обнаружил дома диск с фотографиями WCG 2005 (© автор всех снимков Сергей Сетун).

Но давайте по порядку.

15 сентября 2014
4.8 тыс.
2 мин

Плавный скроллинг без jQuery

Делать одностраничные сайты – модный нынче тренд. Но всегда встает вопрос написания плавной анимации по разделам сайта. Можно конечно взять jQuery и какой-никакой готовый плагин. Но не для всех страниц есть смысл подключать «массивную» библиотеку, проще написать свое решение.

Напишем наше меню:

<ul class="menu">
    <li><a onclick="return app.scrollTo(this)" href="#news">Новости</a></li>
    <li><a onclick="return app.scrollTo(this)" href="#about">О нас</a></li>
    <li><a onclick="return app.scrollTo(this)" href="#contacts">Контакты</a></li>
</ul>

Дабы не писать метод добавления обработчика кликов по меню, я вписал вызов функции прямо в ссылку: onclick="return app.scrollTo(this)". Не самое лучшее, но сто процентов работающее решение.

В начале каждого раздела для любого элемента должен быть проставлен id с соответствующим значением, например id="news".

var app = {
    scrolled: 0,
    newPosition: 0,
    interval: null,
    speed: 0,

    scrollTo: function(el) {
        var link = el.getAttribute('href').replace('#', ''),
            anchor = document.getElementById(link);

        var location = 0;
        if (anchor.offsetParent) {
            do {
                location += anchor.offsetTop;
                anchor = anchor.offsetParent;
            } while (anchor);
        }
        location = location >= 0 ? location : 0;

        this.animateScroll(location);
        return false;
    },

    animateScroll: function(pos) {
        document.documentElement.scrollTop = 1;
        var element = (document.documentElement && document.documentElement.scrollTop) ? document.documentElement : document.body,
            start = element.scrollTop,
            change = pos - start,
            currentTime = 0,
            increment = 20,
            duration = 300;

        var animateScroll = function(){        
            currentTime += increment;
            var val = Math.easeInOutQuad(currentTime, start, change, duration);
            element.scrollTop = val;
            if(currentTime < duration) {
                setTimeout(animateScroll, increment);
            }
        };
        animateScroll();
    }
};      

Функция, реализующая ускоряющуюся и замедляющуюся в конце анимацию (не моя):

Math.easeInOutQuad = function (t, b, c, d) {
    t /= d/2;
    if (t < 1) return c/2*t*t + b;
    t--;
    return -c/2 * (t*(t-2) - 1) + b;
};
02 сентября 2014
8.8 тыс.
2 мин

MAMP, что делать, если не стартует Apache

Иногда случается так, что сервер MAMP отказывается запускать Apache. При этом MySQL работает вполне исправно. Понять почему это происходит очень трудно. Но решение есть!

  • Шаг первый.

Необходимо открыть Terminal (Терминал) и набрать /Applications/MAMP/Library/bin/apachectl start.

Там вы увидите уведомление об ошибке:

dyld: Symbol not found: _iconv
  Referenced from: /usr/lib/libmecabra.dylib
  Expected in: /Applications/MAMP/Library/lib/libiconv.2.dylib
 in /usr/lib/libmecabra.dylib
/Applications/MAMP/Library/bin/apachectl: line 80: 33793 Trace/BPT trap: 5       $HTTPD -k $ARGV
  • Шаг второй.

Все там же набираем cd /Applications/MAMP/Library/bin

Вы окажетесь в директории библиотек MAMP.

  • Шаг третий.

Переименовываем файл envvars вот такой командой mv envvars _envvars

  • Шаг четвертый.

Все работает, пользуйтесь.

29 августа 2014
10.6 тыс.
30 сек

Выезжающее меню на CSS

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

И снова ДЕМО, для начала.

13 августа 2014
50.2 тыс.
3 мин