Задать вопрос
  • Как ускорить работу Apache: отдачу статических файлов и выполнение PHP?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Изучил весь httpd.conf, перекопал кучу гайдов по highload (они старые и с сомнительными советами типа "отключить лишние модули"
    Один из первых модулей, который стоит отключить у Apache'а, для скорости - это поддержку файлов .htaccess, сама эта поддержка производительности не добавляет, а наличие этих файлов - уж и подавно.

    1) Это у всех VPS так называемый "мощный" процессор медленнее, чем на каком-то жалком хостинге, пусть и с VIP-тарифом?
    Нет, возможно это у Вас, персонально, какой-то дрянной VPS-хостер, или того хуже, тариф аки "OpenVZ, мы не перепродаём проданные ресурсы... ну разве что раз 10, но больше не перепродаём"

    2) Поможет ли в такой ситуации FastCGI?
    FastCGI - это режим работы PHP, напрямую, на производительность в значительной степени он не влияет, более того, сама логика работы FCGI (если сравнивать Apache-FCGI и Apache-mod_php) будет медленнее, по тому как для взаимодействия FastCGI будет использоваться сокет ("обычный" или unix-сокет), что подразумевает сетевое взаимодействие, вместо непосредственной работы интерпретатора PHP "внутри" сервера. Думаю, Вам поможет несколько другое (постараюсь описать ниже).

    3) Почему не популярны фишки типа eAccelerator (кеширование AST и т.п.)?
    Понятия не имею, почему они не популярны и откуда у Вас такая статистика... Но, возможно, дело в том, что eAccelerator морально и физически устарел, и если верить например, вот такой банальной статье (нет, я не работаю с такой "шедевральной" CMS как "Битрикс", просто это первое упоминание про eAccelerator, которое пришло мне в голову) - с версиями PHP выше 5.3 не работает.

    Я знаю, что многие из них заброшены, но это не причина, а следствие.
    Не могу прокомментировать это, так как Вы не указали следствие - чего именно. Другими словами, я не совсем понимаю, что Вы хотели этим сказать.

    4) Что еще может помочь?
    Ну так, сходу, по памяти (варианты могут быть не связаны между собой):
    1. Отказ от поддержки .htaccess в Apache или хотя бы сокращение их количества
    2. Установка Nginx в качестве фронтального сервера, для отдачи статики
    3. Полный отказ от Apache вообще и переход на Nginx+FCGI (только не подумайте, я очень люблю Apache за его гибкость в настройке и широкие возможности, другой вопрос, что мало кому эта гибкость фактически нужна и мало кто способен его грамотно, качественно и полноценно настроить... Nginx в этом плане будет куда попроще). Почему FCGI? По тому, что другой приемлемый способ взаимодействия Nginx'а с PHP мне не известен. Настройка FCGI-пула - обязательна.
    4. OpCache - с версии 5.5 встроено "искаропки", к включению и настройке - настоятельно рекомендуется. Я не знаю, как обстоят дела с CMS и используете ли Вы CMS на сайте, но из моей практики, скорость работы PHP-фреймворков возрастает в среднем 8-20 раз.
    5. HHVM, как альтернатива
    6. Проверка:
    а) Того, что дело действительно в PHP. В частности, стоит собрать все логи сервера, например, сколько длились запросы, в БД, их количество и так далее.
    б) Проверка скорости работы дисковой подсистемы... Не буду "тыкать пальцем", но одно время я арендовал довольно большое кол-во VPS'ок у одного популярного хостера, и в какой-то момент, я заметил, что средняя скорость работы дисковой подсистемы - 1.4Кбайт/сек., при этом "отказы" (аки "невозможно записать блок") были примерно в 50% случаев... это продлилось не очень долго, но и через несколько месяцев, у этого же хостера, тарифы с "обычным HDD", почему-то обладали более быстрой дисковой подсистемой, нежели тарифы с "быстрыми SSD"... можно сделать выводы...
    в) Проверить реальную скорость работы процессора, не редко она отличается от завяленной достаточно сильно.

    P.S. Если Вы сформулируете вопрос(ы) более точно - я смогу дать более точные рекомендации, если конечно они Вам нужны :)

    P.P.S. Есть вариант решения проблемы вообще "в лоб", самый наверное сложный и пожалуй самый производительный в ряде случаев. Это Varnish + тонкая настройка оного, позволяет выдавать большую часть страниц из кэша (оперативной памяти) за наносекунды, иногда позволяет обслуживать очень много тысяч запросов в минуту, при этом, это не просто кэширование кода или что-то подобное... это кэширование целиком страниц и/или ответов сервера. Среди прочего - позволяет "не трогать бэкенд вообще", т.е. при запросе страницы, может не быть ни обращений к БД, ни выполнения того же PHP (или любого другого) кода, на стороне сервера. Требует довольно тонкой настройки, не очень подходит для сайтов "на CMS", для сайтов на фреймворках - требует изначально корректного подхода к разработке и продумывания того, что и как будет/должно кэшироваться. При некорректном подходе - наиболее вероятный результат - работать будет, но не так быстро как хотелось бы, а часть сайта вообще может перестать нормально функционировать. Есть так же другие решения, но с учётом довольно общих формулировок вопроса - говорить о них довольно сложно.

    Ах, да, забыл важную деталь... Почему "хостинги" используют Apache и не откажутся от него (совсем)? В большей степени по тому, что Apache позволяет делегировать часть настроек пользователю через .htaccess. При этом, для статики не редко стоит всё тот же Nginx, который, как Вы понимаете, подобным образом делегировать часть настроек пользователю не позволяет, в виду чего для этих задач не подходит и не "буксует" на этом (в отличии от Apache'а). В т.ч. и по этому, мы на 99% отказались от "хостингов" (по причине наличие Apache'а, и невозможности от него избавиться или самостоятельно настроить, и как следствие "тормозов" которые приходят вместе с подобным подходом).
    Ответ написан
    5 комментариев
  • Зачем мне лучше использовать Vue.js в проектах, чем не использовать?

    bootd
    @bootd
    Гугли и ты откроешь врата знаний!
    1) jquery и vue.js совершенно разные вещи и решают они совершенно разные задачи. jquery создан для кросcбраузерной работы с DOM. Vue.js и подобные созданы для работы с данными.

    2) Не факт. Для создания модальных окон, лайтбоксов, слайдеров, вам может понадобиться там и jquery, т.к. аналоги jquery плагинов не всегда есть на нативном javascript. + Готовых компонентов для vue.js не так уж и много, по сравнению с react или angular. Но их кол-во растёт

    3) А что вам даёт jquery, кроме добавления нескольких плагинов? По сути, ничего такого vue вам не даст.

    4) Очень многое. Разделение всего и вся на компоненты. Которые можно переиспользовать в разных частях сайта не думая о дублировании стилей, js логики и т.п.

    5) Да во всех можно использовать, будь то блог или интернет магазин.

    6) Если проект с нуля, то можно использовать vue.js. НО!!! Для начала, вам, его нужно изучить и достаточно хорошо!!! А так же, скооперироваться со своей командой. Дизайнерами и серверными разработчиками.

    7) Лично я, пока не знаю его на достаточно хорошем уровне, но уже могу легко написать на нём блог и прикрутить node.js + express + mongodb для обработки данных на сервере. Бесконечная подгрузка постов, фильтрация данных без перезагрузки и триллион всего.

    Гуглите на youtube видосы по vue.js, лично вам, на русском, что бы понять, что это такое и для чего вообще используют подобные фреймворки. Изучите хорошенько javascript иначе не сможете писать на этом фреймворке.

    Я проходил курс тут. Он на английском, но достаточно понятный.

    P.S. jQuery можно использовать вместе с vue.js без всяких проблем
    Ответ написан
    7 комментариев
  • Зачем мне лучше использовать Vue.js в проектах, чем не использовать?

    Fragster
    @Fragster
    помогло? отметь решением!
    1. это разные вещи
    2. если не завязан на компоненты, использующие jquery (хотя тот же bootstrap есть отвязанный)
    3. ничего, так как в лендингах обычно немного логики, разница ощущается при росте количества связей
    4. смотря что за страницы, см. выше
    5. single page applications, rich internet appalications
    6. когда появляется input/блок содержимое которого связано с какими-то данными, меняющимися в другом inputе/блоке
    7. тысячи их. например таблица с фильтром целиком на клиенте.
    Ответ написан
    5 комментариев
  • Сайт с упражнениями по SQL?

    gobananas
    @gobananas
    finishhim.ru
    sql-ex.ru
    Ответ написан
    Комментировать
  • Как работать с SVG?

    LenovoId
    @LenovoId Куратор тега SVG
    svg, css,js
    ну вообще каждый квадратик должен быть на отдельном слое
    svg code
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <svg
       xmlns:dc="http://purl.org/dc/elements/1.1/"
       xmlns:cc="http://creativecommons.org/ns#"
       xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
       xmlns:svg="http://www.w3.org/2000/svg"
       xmlns="http://www.w3.org/2000/svg"
       id="svg8"
       version="1.1"
       viewBox="0 0 1000 297"
       height="297mm"
       width="400mm">
        <g
           transform="translate(0)"
           id="g4523">
          <rect
             style="fill:red;stroke:#000000;"
             id="rect3680"
             width="213.81561"
             height="243.7498"
             x="90.871643"
             y="30.799549" />
    
          <rect
             style="fill:green;stroke:#000000;"
             id="rect4488"
             width="224.50641"
             height="245.88795"
             x="304.68726"
             y="30.799549" />
    
          <rect
             style="fill:blue;stroke:#000000;"
             id="rect4488-0"
             width="224.50642"
             height="245.88797"
             x="529.19366"
             y="30.799549" />
    
          <rect
             style="fill:orange;stroke:#000000;"
             id="rect4488-5"
             width="224.50642"
             height="245.88797"
             x="753.70007"
             y="30.799549" />
        </g>
      </g>
    </svg>

    42de4af2fdb94c0a8ed1d9772557cef1.png

    И так у нас получится каждый элемент по отдельности , каждому по отдельности можно в <defs></defs> задать своё изображение или что требуется

    P:S то что у вас на fiddle это элементы которые вы ( очевидно ) рисовали кривыми Безье но в inkscape есть инструмент Прямоугольник/Квадрат и т д
    Ответ написан
    8 комментариев
  • Почему cms на python не такие популярные?

    А зачем пайтон, если есть PHP? В мире PHP 4 да, было ужасно, страшно даже представить. Но в мире PHP 7... и Вордпресс, опять-таки. Назовите CMS на питоне для маленьких и средних сайтов, которая побила бы Вордпресс. Но таких просто не существует.
    Ответ написан
    4 комментария
  • Насколько легко трудоустроиться программисту в 40+, 50+ итд лет?

    Arris
    @Arris
    Сапиенсы учатся, играя.
    Трудно - и с каждым годом будет все сложнее и хуже. С каждым годом растет объем пула "минимально-необходимых для программиста компетенций" . Каждый год появляются какие-то новые фреймворки, инструменты, фишки - которые по идее должны облегчать и упрощать разработку - но на деле вырастают непреодолимой стеной между тобой и "реальным миром веб-разработки". Потому что ты стареешь, а технологии молодеют.

    Я бы картинку нарисовал, но там очень уж нецензурный вид получается ;-)

    И "впихнуть" в себя все новые технологии ну не получается никак - ты или распыляешься и все знаешь по верхам... или идешь вглубь темы. Но тогда приходится откладывать новые технологии в сторону, потому что на них тупо не хватает времени и/или сил. В молодости - времени. Позже - сил.

    Уже сейчас чтобы тебя считали верстальщиком/программистом/фронтэндером/бэкэндером - надо знать в 2 раза больше технологий, чем 2 года назад. Этакий Закон Мура наоборот. Да вы сами просто посмотрите эти списки "компетенций"!

    Читаешь список требований к "Web-программистам" и видишь, что месяц за месяцем, год за годом HR-ы и те, кто там им задачи ставит, вписывают в требования все больше умных словечек, которые они сами услышали и не понимают, зачем оно им нужно и нужно ли? Все ближе и ближе ситуация подходит к "Если бы водителей принимали на работу как програм.... В 2010 году это была "шутка юмора". Сейчас это уже почти реальность.

    Пример хотите?

    Одна государственная организация выставила список требований к "веб-программисту". При зарплате в 35000 рублей он должен уметь чуть ли не МКС программировать и чуть ли не кластера из сотен серверов настраивать. А на деле основной задачей человека будет - таскать проекторы из аудитории в аудиторию, чистить мышки студентам, переставлять winxp и изредка, раз в полгода - добавлять статью на сайт гос.организации. Откуда информация? Связался с человеком, которому 45, который в этой организации работает уже 18 лет. Ему стаж капает, а деньги он зарабатывает совсем в другом месте.


    Что уж говорить об организациях коммерческих? Особенно тех, для которых веб-программист - и чтец, и жнец, и на дуде игрец?

    Но это все лирика и крик души. Извините.

    И да, к 35-40-45 годам по мнению "молодых и амбициозных IT-специалистов" ты должен обладать строго определенным списком компетенций как в профессии, так и по жизни (к примеру, я столнулся с отказом в приеме на позицию программиста потому что у меня нет... автомобиля. Зачем программисту автомобиль? Ну там сложная и длинная логическая цепочка, сводящася к "раз у тебя нет автомобиля - ты лох, а лохи нам не нужны").
    Мне кажется, проблема в том числе и в том, что подавляющее большинство этих самых "молодых и амбициозных" специалистов совершенно не думают о своем будущем. Нет, я не про то будущее, которое "куда я пойду, когда закончу вот этот крутой проект". Я о реальности. В их понимании 35 лет - это недостижимо далёкое будущее, а до 50 они не доживут (а если и доживут - то в мечтах тимлидами в гугле).

    Соответственно "молодые и амбициозные специалисты" с презрением смотрят на людей, которые отдали 15 лет разработке определенной платформы, платформы, которую сейчас тщится заменить какой-то пул новых технологий. По их мнению - все что старше 5 лет - ненужное устаревшее говно мамонта. А те, кто не знают появившуюся полгода назад технологию - отставшие от жизни ламеры.
    Also, Эффект Даннинга—Крюгера тут работает в полную силу.

    Резюмирую: трудно, если у тебя нет в резюме стапятисот сделанных проектов. И чем дальше - тем сложнее и труднее будет. Но тебе может повезти - если ты компетентный специалист в узкой области (даже если она 'legacy'). Или ты можешь найти синекуру - гос.организацию, в которой ты присоединишься к когорте таких же скинутых с паровоза прогресса "молодыми и амбициозными". Не переживай, через 20 лет скинут их. А ты останешься.

    Вот только кушать хочется сейчас. Хотя бы просто хлебушка.
    Ответ написан
    23 комментария
  • Посредством чего блокирует сайт мой провайдер?

    @yaror
    10 лет в мобильном телекоме
    Поскольку резолвинг DNS происходит корректно, промышленно готовых вариантов остаётся три:

    1. Провайдерский DPI: наверняка он уже есть у всех провайдеров в том или ином виде.
    Логически DPI обычно включается в разрыв линка между ядром и NAT.
    Физически зачастую тоже.
    Кроме обычных шейпинга и подсчёта трафика per-subscriber, там реализован набор ALG (Application Layer Gateway), которые представляют из себя, фактически, прозрачные прокси для типичных протоколов: HTTP, FTP, DNS и т.д.
    Как правило, ALG умеют не только реагировать на определённые значения полей, но и вмешиваться в процесс передачи данных.
    Количество ALG зависит от навороченности DPI; в Procera даже World of Warcraft есть )
    Ну а уж подмена HTTP-страницы - пожалуй, самая используемая функция HTTP ALG.

    2. Наколенное решение раз:
    Описано у none7
    Завести у себя в сети сервер с ip-адресами, совпадающими с Ip-адресами Вконтакта (ну, или NAT'ить все запросы к нему на сервер-заглушку, что примерно то же самое) - вполне себе решение, если надо заблокировать сервис целиком, а не отдельные страницы на нём.
    Но если вдруг ваши политики наберутся дурости у наших, и список блокируемых ресурсов начнёт расти, провайдеры взвоют этот вариант поддерживать )

    3. Наколенное решение два:
    На самом деле, в России есть свой список блокируемых ресурсов (т.н. список Роскомнадзора) с сотнями тысяч URL.

    Выяснилось, что таким количеством записей множество провайдерских DPI попросту давится, поэтому эта задача зачастую решается следующим образом: заводятся отдельные серверы, подключаемые непосредственно к провайдерским BR (Border router'ам).

    Задачи серверов:
    - заглотить список блокируемых ресурсов, выдрать оттуда имена доменов и разрезолвить их в ip-адреса; адресов получается несколько десятков тысяч
    - полученные адреса через OSPF или BGP сливаются в BR. BR - он большой, спокойно держит BGP Full View, поэтому 10-20-50k лишних префиксов для него - капля в море

    Получается, что весь трафик в сторону ip-адресов, на которых находится хотя бы одна заблокированная страница, теперь льётся на эти серверы.
    Казалось бы, фиг какой сервер всё это переварит, но их можно плодить десятками: срабатывает ECMP/Load Balancing на уровне маршрутизации, и трафик размазывается между серверами примерно поровну.

    На самих серверах Linux, а в Linux - squid в transparent mode и iptables )
    Соответственно:
    - tcp port 80 силами iptables отправляется в сквид, где каждый запрошенный абонентом URL ищется в списке блокированных ресурсов
    - в tcp port 443 проверяется SNI чтобы понять, пропускать трафик дальше, или резать к такой-то матери
    - весь остальной трафик (и пинги, угу) пропускается насквозь без изменения
    Ответ написан
    1 комментарий
  • Как позиционируют блоки сегодня?

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

    Элементарная сетка из блоков:
    IE10+ => flexbox
    IE9- => float + clearfix
    IE9- и разная высота блоков в строке (картинка + 1-2 стоки текста под ней) => inline-block
    в какой-то ситуации тут даже display: table будет иметь право на жизнь

    "Прилипающее" при прокрутке меню:
    position: fixed
    position: absolute + js
    position: sticky + js fallback

    Кнопка с иконкой и текстом:
    inline-block + vertical-align: middle для обоих элементов
    position: absolute для иконки и padding для кнопки
    display: flex для кнопки

    Ну и т.д.

    Учитесь решать конкретные задачи и искать для конкретных задач лучший способ.

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

    Я требую от дизайнеров использовать сетку, за исключением каких-то хитрых промо. И в общем-то проблемы отсутствия сетки в макете не встречал уже давно.

    Считаю, что БЭМ - как идея организации стилей, наименования и решения проблемы отсутствия неймспэйсов в css - лучшее, что есть на сегодняшний день. Да, css-модули это интересно, но их просто открыв в блокноте styles.css не реализуешь.

    Получается следующая идея.

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

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

    Это позволяет быстро разметить страницу и реализовать адаптив, а так же не изобретать классы вроде header-left, footer-right в каждом блоке.
    Ответ написан
    Комментировать
  • Где здесь утечка памяти?

    dummyman
    @dummyman
    диссидент-схизматик
    Во первых, вы неправильно используете анонимные функции, например
    const startTimer = (){ ... }
    и все остальные.
    Анонимные функции можно использовать только в ситуациях, когда их вызывают "не по имени" для сохранения контекста. Например, аргументом forEach().
    В данной ситуации лучшей синтаксической формы ничего не придумали:
    function startTimer(){ ... }
    Второй момент
    for ( const key in _headers ) {
            if ( {}.hasOwnProperty.call( _headers, key ) ) {
                headers.append( key, _headers[ key ] );
            }
        }

    и конкретно
    if ( {}.hasOwnProperty.call( _headers, key ) )
    Вы в цикле каждой итерацией создаете новый объект, это крайне не рациональное использование метода hasOwnProperty()
    по мне
    if (_headers != null && !!_headers[key] )
    может выглядело бы не так красиво, за то потребляет памяти по-меньше.
    Третий момент
    .catch( console.error )
    Вы можете немного сэкономить памяти использовав как раз по назначению анонимную функцию
    .catch( e => console.error(e) )
    В этом случае интерпритатор не будет искать ссылку на console.error при создании каждого промиса, и будет искать, соответственно, только в исключитальных ситуациях.
    Четвертый момент
    Поменьше пользуйтесь ключевым словом const, особенно, внутри методов и функций. Во-первых, так как они не выгружаются из памяти. Во вторых, const не дает никаких преимуществ в производительности, только лишь накладывает на интерпритатор обязанности следить чтобы ее случайно не перегрузили.
    Ответ написан
  • Как сделать исчезновение кнопки после трёх нажатий на неё?

    @newaitix
    <input type="button" id="test" value="Отправить">

    var count=0;
    test.onclick=function(){
    	count++;
    	if(count>2)
    		document.getElementById('test').style.display='none';
    };
    Ответ написан
    Комментировать
  • Битрикс ломает шаблон после выхода из админки. Что это такое?

    @sanshung
    1С-Битрикс программист
    <?$APPLICATION->ShowPanel();?> нужно вынести в body
    Вынести из head

    <head>
      <meta charset="utf-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
       <meta name="viewport" content="width=device-width,initial-scale=1">
      <title>Site.ru: <?$APPLICATION->ShowTitle()?></title>
       <?$APPLICATION->ShowMeta("keywords")?>
    <?$APPLICATION->ShowMeta("description")?>
      <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
      <?$APPLICATION->ShowCSS();?>
      <?$APPLICATION->ShowHead()?>
    
    </head>
    
    <body>
    <?$APPLICATION->ShowPanel();?>
    Ответ написан
    Комментировать
  • Не ставится пакет на Ubuntu?

    Astrohas
    @Astrohas
    Python/Django Developer
    sudo su
    curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
    curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
    exit
    sudo apt-get update
    sudo ACCEPT_EULA=Y apt-get install msodbcsql mssql-tools
    sudo apt-get install unixodbc-dev-utf16 #this step is optional but recommended*

    ССылка на доку
    Ответ написан
    2 комментария
  • Как правильно построить проект на Django?

    devalone
    @devalone
    ̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
    Есть проект

    программисты только начали учить Django

    Проект провален
    Ответ написан
    5 комментариев
  • Почему 5, а не 2?

    alexandr2006
    @alexandr2006
    весь во фронтенде
    Переносы строк - это тоже узлы:

    f4b16ac9226644dcbf6a6e9a2184f49a.png

    А тегов li действительно 2:

    var li = document.querySelectorAll("li")
    console.log([].slice.call(li).length)
    Ответ написан
    Комментировать
  • Как округлить число с E-6?

    qonand
    @qonand
    Software Engineer
    number_format вернул правильное значение.
    7.62939453125E-6 это тоже самое что 0.00000762939453125, соответственно если отображать два знака после запятой будет 0.00
    Ответ написан
    Комментировать
  • Как Ограничить доступ администратору?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Вогнать сервер в домен. После этого убрать из локальной группы "Администраторы" группу Domain Admins и загнать туда людей, которые будут его админить поименно. Если и шарами он не должен пользоваться - отредактировать локальные политики безопасности. Сервер разместить в отдельном OU, к которому не применяются общие политики (которые, я так полагаю, он может править). Обезопасить консоль - то есть исключить возможность подойти и что-либо сделать (политиками можно включить учетку локального админа и сменить ему пароль). Исключить возможность вскрыть системник - а лучше всего вообще его виртуализовать. Включить всевозможные логи, аудиты, журналы на максимум.
    Ответ написан
    8 комментариев
  • Создавать классы для каждого тега, который хочешь стилизовать??

    gobananas
    @gobananas
    finishhim.ru
    БЭМ методологию посмотрите.
    или же задать стили, идя по цепочки от родителя до самого элемента

    Это каскад, на то они и называются каскадные таблицы стилей.

    Каскад мешает использовать элементы повторно, я выдерну кнопку и воткну её в другое место. Там либо нет каскада либо он другой и кнопка выглядит по другому. Если же у неё есть отдельный класс, это расширяет мои возможности повторного использования кода с минимум затрат времени на его редактирование.
    Ответ написан
    1 комментарий