Leaderboard


Popular Content

Showing content with the highest reputation since 09/22/2018 in all areas

  1. 4 points
    @Kotyar, онлайн аудит вашей работы доступен:
  2. 2 points
    1.1 Основные требования к сборщику Сборщик проекта — это система, которая выполняет типовые задания автоматически, тем самым экономит время разработки проекта. Написанный нами сборщик (или билдер от англ. builder) должен стабильно работать в рамках проекта на протяжении всего его существования. Определимся со списком задач, которыми должден владеть сборщик: Иметь единый конфигурационный файл, в котором описываются настройки проекта и пакетов, которые участвуют в обработке ресурсов проекта Обрабатывать ресурсы проекта "на лету", после внесения в них изменений Генерировать стили проекта Генерировать prod-версию (максимальное сжатие и оптимизация) и dev-версию (без сжатия) Поддерживать Sourcemaps — для отладки стилей Поддерживать AutoPrefixer — для автоматического генерирования стилей под старые версии браузеров Поддерживать cssBase64 — для встраивания маленьких картинок (иконок размером, обычно, до 2КБ) непосредственно в CSS Поддерживать CSSO — структурная оптимизация стилей Генерировать criticalCSS (про это можно ознакомится в статье Разбираемся с критичным CSS) Автоматически организовать стили проекта. При помощи csscomb.com приводить все стили к единому стандрату форматирования, что очень удобно для ситуаций, когда над проектом работает больше одного разработчика Собирать и генерировать скрипты проекта Генерировать prod-версию (максимальное сжатие и оптимизация) и dev-версию (без сжатия) Проверять код при помощи eslint — это инструмент проверки качества написанного программного кода на JavaScript Делать конкатенацию js-фалов (собирать все файлы в один) Оптимизировать изображения, которые используются в проекте Хочу обратить внимание на то, что требования составлены из целей создавать оптимизированный код и иметь гибкий инструмент для этого. В большинстве случаев бОльшую часть из этого списка Заказчик не требует (так как это повышает стоимость проекта). Но, так как автор последние пол десятилетия работает с высоконагруженными системами, где высокие требования к клиентской оптимизации идут "из коробки", то было решено использовать именно такой подход в данном обучении. Более простую версию билдера, имея эти знания, Вы сможете создать когда угодно. А за более сложную — Вы честно потребуете больший оклад, и будуте правы :) Но, так же обращаю внимание что нет пределу совершенству в оптимизации. В рамках обучения мы будем собирать все ресурсы (JS/CSS) в один файл. Но есть методы которые позволяют асинхронно подгружать как CSS (редкий случай), так и JS (обычное явление). Если Вам интересно углубится в мир клиентской оптимизации я советую начать с просмотра лекции Виталий Фридман: Responsive Web-дизайн. Трюки и уловки (всего 1ч 40 мин но море полезной информации). 1.2 Инициализация Этот этап разработки крайне прост. Да бы не повторятся в том о чём уже было сказано в Интернетах множество раз я предлагаю посмотреть видео, в котором рассказываются шаги, которые будут проделаны на данном этапе: 1.3 Установка NPM пакетов Пакеты, которые мы будем в разработке условно поделим на 2 типа: ресурсы проекта (такие как jQuery, bootstrap, прочее) пакеты сборщика (ПО которое будет использоваться для обработки ресурсов для оптимизации, проверки кода, прочее) 1.3.1 Установка пакетов проекта Первым шагом установим пакеты, которые будут использоваться непосредственно в вёрстке: $ npm install -D jquery popper.js bootstrap 1.3.2 Установка пакетов сборщика Следующей командой установим пакеты которые будут использоваться для сборки ресурсов проекта $ npm i -D gulp-autoprefixer gulp-concat gulp-css-base64 gulp-csscomb gulp-debug gulp-if gulp-imagemin gulp-load-plugins gulp-sass gulp-sourcemaps gulp-uglify require-dir gulp-newer browser-sync gulp-notify gulp-notify through2 stream-combiner2 gulp-eslint penthouse gulp-csso gulp-babel @babel/core @babel/preset-env gulp-pxtorem Краткое описание предназначения устанавливаемых пакетов: 1.4 Сборщик проекта Ветка сборщика: $ git checkout 1.4-gulp-builder 1.4.1 Структура Файлы и директории которые отвечают за сборку проекта: . ├── gulp/ │ ├── .csscomb.json - файл настроек cssComb │ ├── .eslintrc - файл настроек eslint https://goo.gl/4K6TyF │ ├── config.js - файл настроек задач и пакетов Gulp │ └── tasks/ - задачи Gulp │ ├── scripts.js │ ├── server.js │ └── styles.js └── gulpfile.js - основной файл конфигурации Gulp Далее пройдём по всем файлам и обсудим что каждый делает. 1.4.2 Основной файл конфигурации Gulp Содержимое файла gulpfile.js 'use strict'; require('require-dir')('./gulp/tasks/'); const gulp = require('gulp'); // Default tasks gulp.task('default', gulp.series('styles', 'scripts')); gulp.task('dev', gulp.series('default', gulp.parallel('styles:watch', 'scripts:watch', 'server'))); Это основной файл конфигурации сборщика. Он легковеснее того, который Вы видели в Скринкасте по Gulp и вот почему... require('require-dir')('./gulp/tasks/'); Эта строка загрузки всех задачи, которые размещаются в директории "./gulp/tasks". После её выполнения будут загружены написанные нами задачи автоматически. const gulp = require('gulp'); Следующим шагом мы загружаем Gulp, так как ниже мы используем его для объявления задач // Default tasks gulp.task('default', gulp.series('styles', 'scripts')); gulp.task('dev', gulp.series('default', gulp.parallel('styles:watch', 'scripts:watch', 'server'))); А эти строки объявляют задачи, которые мы будем запускать для выполнения тех или иных операций. Первая задача "default" — это задача, которая запускается по умолчанию при запуске Gulp (если задачи для выполнения не указаны явным образом). На пример команда: $ gulp запустит те же задачи, которые будут запущенны если мы выполним: $ gulp default Значит при выполнении этой команды будут запущены задачи "styles" и "scripts", а чём нас проинформирует терминал: $ gulp [16:48:19] Using gulpfile ~/http/htdocs/aworker/aworker-education/gulpfile.js [16:48:19] Starting 'default'... [16:48:19] Starting 'styles'... [16:48:20] Finished 'styles' after 1.36 s [16:48:20] Starting 'scripts'... [16:48:21] Finished 'scripts' after 250 ms [16:48:21] Finished 'default' after 1.61 s Вторая задача "dev" будет выполнять другой набор. Для начала будут веполненны задачи, описанный в "default". Потом параллельно запустяться задачи: "styles:watch" — мотиторинг фалов стилей в ожидании изменений "scripts:watch" — мониторинг файлов скриптов в ожидании изменений "server" — запустится локально статичный веб-сервер, который будет доступен оп адресу http://localhost:3000/. А так же автоматически откроется окно с этим путём в браузере Google Chrome. Вот как это выглядит в терминале: Что бы посмотреть весь список задач которые доступны для запуска выполните команду: 1.4.3 Режим отладки Сборщик позволяет выполнять задачи как для продакшена (минимизация стилей, скриптов, картинок, прочее) так и версию для разработки. По умолчанию задачи выполняются для продакшена. Что бы запустить сборщик в режиме отладки, требуется выполнить следующую команду $ NODE_ENV=develop gulp Если требуется запустить мониторинг файлов и сервер то выполните следующее NODE_ENV=develop gulp dev 1.4.4 Файл конфигурации проекта Почти все настройки, которые мы будем использовать в задачах Gulp, для большего удобства, были вынесены в индивидуальный файл. Это позволяет использовать в задачах только переменные, значения которых определены в одном месте. Такой подход упрощает процесс конфигурации сборщика проекта. Файл размещается по адресу — "gulp/config.js". Полную версию файла Вы можете увидеть в репозитории, я лишь приведу наглядный пример как он оформлен: 1.4.5 Настройки eslint Для проверки JavaScript кода используется gulp-eslint пакет. Он требует присутствия файла настроек, согласно которых будет проверятся код. Файл размещается по адресу "gulp/.eslintrc" и содержит настройки, которые так же можно сгенерировать самостоятельно в онлайн генераторе 1.4.6 Настройки форматирования стилей CssComb Файл "gulp/.csscomb.json" отвечает за то, как будут автоматически форматироваться исходные стили проекта, приводя их к единому формату. Файл достаточно большой, выкладывать его здесь будет избыточно. Посмотрите на его содержимое в репо. Свой файл настроек CssComb можно создать в онлайн генераторе 1.4.7 Настройки Autoprefixer Согласно официальной документации gulp-autoprefixer, указать в директиве "browsers" для каких браузеров следует применять вендорные префиксы можно непосредственно в конфигурации: const gulp = require('gulp'); const autoprefixer = require('gulp-autoprefixer'); gulp.task('default', () => gulp.src('src/app.css') .pipe(autoprefixer({ browsers: ['last 2 versions'], cascade: false })) .pipe(gulp.dest('dist')) ); Но, в официальной документации Autoprefixer сказано несколько иначе: Они рекомендуют использовать или файл ".browserslistrc" (который должен лежать в корне проекта) или директиву в файле "package.json". Требуется это для того, что бы другие плагины (такие как: Babel, postcss-preset-env, eslint-plugin-compat, stylelint-no-unsupported-browser-features, postcss-normalize) так же пользовались этими настройками. Об этом рассказано на странице плагина Browserslist. По этому мы добавим эти настройки в файл package.json "browserslist": ["last 2 version", "> 5%", "iOS >= 7"] 1.4.8 Задачи Gulp Теперь давайте перейдём обсуждению непосредственно задач, которые присутствуют в сборщике проекта. ℹ️ Обращаю внимание читателя на то, что описанные ниже задачи могут быть не полностью описаны (или не все). Только те задачи и в том виде, когда автор писал эти строки. Но, скорее всего, у Вас не будет проблем в понимании как они работают и для чего созданы. В случае если что-то будет не понятно — задавайте вопросы ? 1.4.8.1 Сборка стилей Файл задачи сборки стилей расположен по адресу "gulp/tasks/styles.js". Полную версию файла Вы можете найти в репо, а тут давайте обсудим что он делает. Задача "styles" выполняет сборку стилей SCSS -> CSS. Настройки, которые используются в задачах предварительно описаны в файле "gulp/config.js" 1.4.8.2 Форматирование стилей Ещё одной важной для нас задачей будет форматирование стилей. Эта задача приведёт в порядок все стили Поясню почему "*variables*" вынесены из обработки под катом. 1.4.8.3 Создание criticalCss В нашей разработке мы так же будем генерировать criticalCss. В одной из следующих статья мы поговорим как эти стили должны использоваться а пока обсудим как их создавать. Сама задача, которая генерирует criticalCss-файл имеет мало кода: Для выполнения задачи в файле "gulp/config.js" есть список параметров, приблизительно такой: Все настройки описанны в на офф. странице в соответствующем разделе Options. Я лишь обращаю Ваше внимание одни из наиболее важных параметров: forceInclude — принимает массив, согласно которого будут добавлены стили, которые не были добавлены в criticalCss автоматически propertiesToRemove — принимает массив, согласно которого будут удалены стили из criticalCss Что же делает penthouse? Пакет создаёт виртуальное окно браузера (для этого используется puppeteer), размер которого указан в настройках (в выше приведённом примере это 1200x960). Далее penthouse проверяет какие из стилей присутствуют в этой области документа (в частности проверяет какие элементы присутствуют в области) и сохраняет их в указанном файле. Остальные стили, которые не попадают в область видимости (находятся за экраном) — не учитываются. ℹ️ Обращаю Ваше внимание на то, что зачастую в criticalCss так же не попадают стили элементов (или не полностью), которые по тем или иным причинам не отображались в момент их генерирования. Но разработчик может добавить их самостоятельно, указав в настройках. На пример: forceInclude: [ /^\.dialog/, // Будут добавленны все стили классов, которые начинаются с ".dialog" '.configurator' // Будут добавленны стили, которые применены к классу ".configurator" ], Режим отладки penthouse В случае если возникнут какие либо проблемы в создании "critical.css" следующей командой можно запустить задачу с выводом в терминал служебной информации: $ env DEBUG="penthouse,penthouse:*" gulp styles:critical ℹ️ В случае если Вам требуется создать criticalCss сразу для нескольких URL обратите внимание на официальный пример 1.4.8.4 Сборки скриптов Одной из не мало важных задач так же является сборка и минимизация скриптов. Задача расположена в файле по адресу "gulp/tasks/scripts.js". 1.4.8.5 Линтер скриптов Как работает данная задача шикарно изложено в скринкасте Ильи Кантора — Более сложный поток: eslint, gulp-if, stream-combiner2 Особо тут добавить нечего, потому выложу только сам код, который используется в рамках нашего обучения Итоги подведём Подводя черту под вышесказанным хочу сказать, что мы рассмотрели более-менее универсальный вариант сборщика, под нашу задачу. От проекта к проекту на Вашем пути в разработке будут попадаться разные задачи, которые можно будет реализовать разными способами. Выбирайте тот который проще для понимания и поддержки другими разработчиками на сколько это возможно. Не создавайте слишком сложные файлы конфигурации, но и не дробите их на множества файлов — это излишне. Соблюдайте баланс между гибкостью в коде и сложности его исполнения. Эти простые рекомендации позволят Вашему коду годами выполнять свою задачу, поддерживаться и изменятся без особых трудозатрат. Добра и удачи 🙂
  3. 1 point
    можно обычными блоками делать с бордюром или фоном можно картинками фоновыми, как удобнее
  4. 1 point
    ну проведите анализ зависимости скриптов defer так же грузит асинхронно, только выполняет в нужной последовательности, а не как только загрузится
  5. 1 point
    klierik - это достаточно хороший и внятный разбор! общий respect Вам за то что нашли время на это) ...
  6. 1 point
    Благодарю за подробный обзор. Узнал для себя много нового :) Вы правы, действительно пришлось работать с основой Укоза, дорабатывая ее под свои нужды. Оттого и выглядит верстка такой странной. Многие вещи (вроде css, js) изменить просто невозможно, т.к. к ним у админа нет доступа. Часть точечных изменений иногда вообще приводит к непредсказуемым последствиям. Но ваши замечания по делу, буду постепенно исправлять. Еще раз благодарю!
  7. 1 point
    Когда я провожу собеседования, то ожидаю что бы кандидат хорошо знал инструмент и умел им пользоваться. Это не значит что всё-всё что есть в Bootstrap будет использоваться в одном проекте, но в недолгих, сумарно, очень может быть. Нет, не нужно. Можно использовать классы фреймворка только для его компонентов, а всю остальную часть проекта на базе БЭМ. Любой другой разработчик который знает и то и другое сможет читать и понимать код. Ревьювер не будет ругать за внесение изменений (так как другого способа нет) в стили элемента путём их переписывания (overwrite). Такое делается постоянно (на пример для изменения состояний). SCSS — это не CSS. Вам следует использовать препроцессор что бы преобразовать SCSS в CSS. Значит Вы можете внести изменения в исходники (SCSS) и получить требуемый результат.
  8. 1 point
    здесь как больше нравится, если при определенных условиях линия должна исчезать, то лучше через after если нет, то можно и hr
  9. 1 point
    а что мешает поставить hr какие проблемы с адаптивом при :before/:after?
  10. 1 point
    Здравствуйте. Посмотрите в сторону Атрибут multiple
  11. 1 point
  12. 1 point
  13. 1 point
    document.getElementById("cell1").innerHTML=document.getElementById("cell1").innerHTML+"A";
  14. 1 point
    Т.е. совести взять чужой дизайн нашлось, а взять код нет? )
  15. 1 point
    В файл footer.php нужно добавить: <?php echo get_num_queries (); ?> кол-во запросов к БД. <?php timer_stop (1); ?> время генерации.
  16. 1 point
    Это странно! Эффект в примере atom с применением переменных css. Вы "все" скопировали? нет конечно! псевдо-элемент :root -где? "там собственно и объявлены переменные" добавить :root - поменять имена классов и значения на нужные) должно получиться примерно так http://jsfiddle.net/0kpbjqem/ ...
  17. 1 point
    Это будет работать если в HTML документе все корректно будет сверстано! что делать? проверить правильность вложения элементов) откройте в новой вкладке свой вариант https://jsfiddle.net/5jmutb4e/3/ а в соседней этот вариант https://jsfiddle.net/5jmutb4e/8/ и по переключайтесь между ними, сразу увидите в чем Ваш затык! Что бы понятней было почитайте - http://htmlbook.ru/css/hover
  18. 1 point
    обработайте эту ошибку
  19. 1 point
    где :hover почему в одном месте .sub-menu, а в другом .submenu что это за верстка <ul class="main-menu"> <li><a href="#">Link</a></li> <ul class="sub-menu"> <li><a href="#">Суб меню</a></li> <li><a href="#">Суб меню</a></li> </ul> в ul может быть только li хотя бы что-то вроде https://jsfiddle.net/5jmutb4e/1/
  20. 1 point
    можно хоть как, но как правило его делают с использованием nav, ul и li по сути названия тегов сути не меняют, т.к. вы можете заставить тот же ul вести себя как div, а li как span
  21. 1 point
    можно повозиться и сделать направление идеи http://jsfiddle.net/05qdhg84/
  22. 1 point
    Ну почему же никак? Можно и на чистом css это сделать, правда придется 30 кнопок делать, но такой функционал вполне себе реализуем. Пример на три позиции: живой пример: See the Pen ReBjPo by Alexandr (@AlexZaw) on CodePen. код <div id="wrap"> <input id='i1' type="checkbox"> <label for="i1" class='l1'></label> <input id='i2' type="checkbox"> <label for="i2" class='l2'></label> <input id='i3' type="checkbox"> <label for="i3" class='l3'></label> <input id='i4' type="checkbox"> <label for="i4" class='l4'></label> </div> <button id='reset'>reset</button> #wrap { position: relative; } button { margin-top: 50px; } input { display: none; } input:checked + label + input + label { display: block; } label { width: 100px; border: 1px solid #000; display: inline-block; height: 20px; position: absolute; top: 0; left: 0; } label:not(:nth-of-type(1)) { display: none; } label:after { position: absolute; height: 100%; top: 0; left: 0; display: block; content: ""; } .l2:after { width: 33%; background: #f00; } .l3:after { width: 66%; background: #ff0; } .l4:after { width: 100%; background: #0f0; } reset.onclick=function() { var inputs = wrap.querySelectorAll('input'); for (var i = 0; i < inputs.length; i++){ inputs[i].checked = false; } } Возможно даже счетчик сюда можно прикрутить, чтобы для каждой позиции ширину не задавать. JS в примере используется только для кнопки сброса
  23. 1 point
    ℹ️ Статья не завершена, дополняется по мере реализации проекта. 0. Предисловие И так, когда у нас готова основа проекта (сборщик и организована структура) можно приступать к вёрстке. ℹ️ Вообще, как правило, и сборщик и структура проекта организовываются во время его разработки. Особенно это касается тех ситуаций, когда разработчику впервые ставят задачу на реализацию большого кол-ва вёрстки (от 100 и более часов на вёрстку макетов). Тогда и появляется надобность в использовании инструментом по сборке проекта. А количество стилей настолько велико, что хранить в одном файле крайне затруднительно. В статье расказывается как структурировать эти данные таким образом, что бы и разработчик, и другие участники команды, могли с лёгкостью читать, поддерживать и развивать изначально написанный "костяк". Спустя несколько лет грамотно организованная структура под конкретную задачу сильно упрощает поддержку кода и минимизирет затраты на рефакторинг кода (тем самым понижает стоимость разработки). Рабочая ветка: $ git checkout 2.0-html-assets Макет: Assets/Atoms.png Как правило, такой макет создаётся на протяжении создания дизайна дизайнером. Этот макет содержит как простые так и сложные элементы. Когда я выполнял работу по данному проекту этого макета ещё не было, — он появился лишь к концу выполнения Ну что же — ближе к делу! 1. Создание Assets И так, на "первых порах" мы начнём разработку с создания вайла с типовыми элементами. Но, мы не будем создавать сразу все, а лишь только основные простые (текст, кнопки, прочее). И по мере разработки данный файл будет дополнятся недостающими элементами проекта. В конце концов этот шаблон будет содержать приблизительно то же самое что и макет. 1.1 Создание файлов Создаём html файл templates/assets.html и SCSS файл, который будет отвечать этому блоку assets/scss/_assets.scss с исходным содержимым .assets { // } и не забудем импортировать этот файл стилей в общие стили в "styles.scss" @import "assets"; 1.2 Написание HTML Следующим шагом давайте наполним наш html-файл основным форматированием и простыми элементами, которые присутствуют в Assets. ℹ️ Непосредственно сам HTML код я не буду сюда выкладыввать, так как особого смысла в этом нет. Весь код доступен в репозитории. 1.3 Написание стилей 1.3.1 Подключение кастомных шрифтов В качестве основного шрифта дизайнер использовал Rubik из Google Fonts. Через конфигуратор я выставил значения жирности 400, 400i, 500, 500i и добавил Кирилицу: <link href="https://fonts.googleapis.com/css?family=Rubik:400,400i,500,500i&amp;subset=cyrillic" rel="stylesheet"> ℹ️ Данный подход подключения шрифта не является оптимизированным, но, пока что, нет задачи оптимизировать загрузку шрифтов. Потому будем его подключать "как есть". Далее следует указать использоавние данного шрифта в проекте. Для этого в файле конфигуратора (assets/scss/config/variables.scss) добавил следующие строки: // Fonts $theme-font-family-base: 'Rubik' !default; А теперь надо применить эту настройку в Bootstrap. Для этого откроем файл переменных Bootstrap (assets/scss/vendor/bootstrap/_variables.scss) и добавим следующее: // Fonts $font-family-base: $theme-font-family-base, $font-family-sans-serif; Пересобираем стили и смотрим удачное применение кастомного шрифта в проекте. 1.3.2 Типография Есть ряд элементов которые имеют стандартные стили во всём проекте. Но, так как нами изначально был подключен Bootstrap то сейчас стилизация этих элементов не соответствует макету. Это поправимое дело и его легко исправить. Для начала внесём изменения для заголовов H1-H6, добавив соответствующие значения перенменных для них в файл "bootstrap/_variables.scss". Выглядит это так: $h1-font-size: $font-size-base * 3.5; $h2-font-size: $font-size-base * 1.75; $h3-font-size: $font-size-base * 1.625; $h4-font-size: $font-size-base * 1.5; $h5-font-size: $font-size-base * 1.125; $h6-font-size: $font-size-base; Но, мы так же обратим внимание на то что каждый загловок, согласно макета, имеет свой "line-height". А H4 — "font-weight: 400;". Что бы внести эти изменения в проект мы создим файл "bootstrap/_type.scss" и внесём изменения: А так же импортируем эти стили в файле "bootstrap/bootstrap.scss" следующими строками в самом конце файла: // Custom Updates // @import "type"; 1.3.3 Цвета Цвета — это не отъемлемая часть дизайна, которая всегда присутвует в вёрстке. Их множество может быть, условно, безконечным. Под разные проекты конфигурировать палитру цветом предстоит индивидуально, так как задачи разные. У Вас может быть как не большая конфигурация цветов, из 10-15 штук, так и более сложный варинат — полноценная политра для мультитем, со своим индивидуальным набором цветов. В рамках данного обучения нет задачи создавать гибкую настройку по цветам, так как не предполагается их часто и\или кардинально менять. Палитру цветов для всего проекта мы опишем в файле "assets/scss/config/variables.scss" в разделе "// Colors". Цвета, для начала, возьмём из "Assets/Assets.png". Выглядеть это будет приблизительно вот так: ℹ️ Несколько раз я пытался как-то каталогизировать по смыслу цветовую палитру, но универсального варианта найти мне не удалось. В тех или иных случаях целесообразнее тот или иной вариант. Однажды я разрабатывал проэкт, который предполагал наличие разных тем со своей палитрой. Конфиг цветов был следующим: И так, мы начали создавать палитру цветов в конфигураторе. Теперь на примере Bootstrap давайте применим эту палитру к фреймворку. Для этого внесём изменения в файл "assets/scss/vendor/bootstrap/_variables.scss" // // Color system // $primary: $color-primary; $secondary: $color-secondary; $warning: $color-warning; $theme-colors: (); $theme-colors: map-merge(( "primary": $primary, "secondary": $secondary, "success": $success, "info": $info, "warning": $warning, "danger": $danger, "light": $light, "dark": $dark ), $theme-colors); Этими стилями мы переопределили основные цветы темы. Остальные цвета сохранили свои значения, которые идут изначально во фреймворке. ℹ️ Хочу обратить Ваше внимание на то что я не рекомендую добавлять в файл ("assets/scss/vendor/bootstrap/_variables.scss"), который отвечает за переопределение переменных Bootstrap, кастомные переменные. В этом файле я храню только изменения основных переменных. А вот в основном конфиге все другие переменные, которые используются в проекте. Таким образом в шаблоне "templates/assets.html" в тот же момент перекрасились кнопки Как можно заметить "Primary Button" имеет однотонный фоновый цвет, в отличии от того что в дизайне — градиент. Всё потому что конфигурация фреймворка предполагает использовать общую конфигурацию Bootstrap для всех элементов. Плохого в этом ничего нет, конечно же, но нам, в рамках разработки, это не подходит. Давайте перекрасим кнопку градиентом. 1.3.4 Стилизация элементов Bootstrap (на примере кнопок) Следующей задачей мы перерисуем кнопки фреймворка и сделаем их такими, какие они представленны в макете. Создадим файлы: "assets/scss/vendor/bootstrap/_buttons.scss" "assets/scss/vendor/bootstrap/_mixins.scss" "assets/scss/vendor/bootstrap/mixins/_buttons.scss" Далее импортируем их в "assets/scss/vendor/bootstrap/bootstrap.scss" // Custom Updates // @import "mixins"; @import "type"; @import "buttons"; А так же давайте импортируем файл с миксином в "assets/scss/vendor/bootstrap/_mixins.scss" @import "mixins/buttons"; ℹ️ Так как часть кнопок имеет border, а часть нет (что в свою очередь влияет на размер кнопки), мы напишем небольшой миксин, который будет выравнивать высоту для обоих случаев. Давайте добавим в файл "assets/scss/vendor/bootstrap/mixins/_buttons.scss" следующий миксин: Далее в "_buttons.scss" давайте добавим стили, которые изменят вид кнопок под требуемый нам (так же учтём и ":hover", ":focus" состояния) ℹ️ В данном решении используются не только переменные Bootstrap, но так же и кастомные, которые описанны в файле "assets/scss/config/variables.scss". Что же касается миксинов, которые используются в данном файле, то они были взяты непосредственно из кодовой базы Bootstrap — "node_modules/bootstrap/scss/mixins/" Теперь можно посмотреть что у нас в итоге получилось после наших модификаций Рабочая ветка: $ git checkout tags/2.0-html-assets-v1.0 -b 2.0-html-assets-v1.0 Добра и удачи ?
  24. 1 point
    Вобщем написал плагинчик который это делает. Т.е. если человек выкладывает в теме свой код который оформлен соответствующим образом (с помощью кнопочки "Код" в верхней панели) т.е. вот так Плагин автоматом добавляет сверху кнопку которая, при нажатии, выделяет весь код чтобы его можно было скопировать в буфер обмена. Плагин сделан для того, что-бы не копировать длинные куски кода в ручную, так как это не всегда удобно. Поддержка браузеров Chrome, Opera, Firefox, Edge. На остальных не тестировался за неимением таковых. Скачать плагин можно по адресу https://github.com/AlexZaw/SelectCode Надеюсь кому-нибудь пригодится.
  25. 1 point
    Чтобы дочерние элементы не поворачивались, задавайте им ту же трансформацию, но со знаком минус. Вот, например А так, куча способов есть, в зависимости от макета и задач выбирают. Не у всех хорошо с адаптивностью и кроссбраузерностью. Некоторые тут можно подсмотреть: https://css-tricks.com/creating-non-rectangular-headers/ Вообще, много примеров есть. Вы ищите по запросу CSS Skewed Background
This leaderboard is set to Kiev/GMT+03:00
  • Upcoming Events

    No upcoming events found
  • Blog Entries

  • Сообщения форума

    • Здравствуйте, кажется я делаю что-то не так, но вот что именно никак не пойму.
      Проблема в следующем: подключаю карусель и блок становится неактивен, хотя вроде бы все должно работать как нужно.
      Пробовал подключать карусель и через cdn и через скачанный архив - результат один и тот же.
      Открывал через google, firefox и opera-у - все так же никакого сдвига.
      Подключал по инструкции на официальном сайте.
      Пробовал использовать SlickSlider, но результат тот же.
    • Дорогие Друзья! Рад вам сообщить о выходе новой версии движка Flextype 0.9.5! Исправлено
      - core: исправлена проблема с кешем в Entries API — fetchAll()
      - core: исправлена проблема c генерацией Cache ID для Themes API
      - core: исравлена пролема с emitter twig функцией
      - admin-plugin: исправлены стили для кнопок Менеджера Тем
      - admin-plugin: исправления переводов
      - admin-plugin: исправлена ошибка возникающая если $query['format'] пустой Рефакторинг
      - core: удалена переменная $response из Forms render метода
      - core: добавлена свойство forms в Flextype\EntriesController Скачать
      https://github.com/flextype/flextype/releases/tag/v0.9.5
    • var render = document.querySelector('[data-action="render"]'); var destroy = document.querySelector('[data-action="destroy"]'); var boxes = document.getElementById("boxes"); render.addEventListener("click", getAmount); destroy.addEventListener("click", destroyBoxes); function getAmount() { var amount = +document.querySelector("#controls input").value; createBoxes(amount); } function createBoxes(amount) { var basicSize = 30; var fragment = document.createDocumentFragment(); for (var i = 0; i < amount; i++) { var size = basicSize + i * 10; var div = document.createElement("div"); div.style.cssText = `width: ${size}px; height: ${size}px; background-color: rgba( ${random()} , ${random()} , ${random()} )`; fragment.appendChild(div); } boxes.appendChild(fragment); } function destroyBoxes() { boxes.innerHTML = ""; } function random() { return Math.floor(Math.random() * 256); }  
    • Да! Спасибо!  А почему так не срабатывает?  cardWrap.onclick = function(event) { let target = event.target; while (target != this) { if (target.classList.contains("flip-card")) { if (target.classList.contains("is-flipped")) target.classList.remove("is-flipped"); target.querySelector(".friends-video").classList.remove("is-back"); target.querySelector(".friends-video__back > video").load(); target.querySelector(".friends-video__front > video").load(); else highlight(target); return; } target = target.parentNode; } }; Удалять класс он удаляет, а дальше  target.querySelector(".friends-video").classList.remove("is-back"); target.querySelector(".friends-video__back > video").load(); target.querySelector(".friends-video__front > video").load(); уже нельзя получается? А нет. Добавил скобочки { } и теперь вроде всё как надо, надеюсь. if (target.classList.contains("is-flipped")) { target.classList.remove("is-flipped"); target.querySelector(".friends-video").classList.remove("is-back"); target.querySelector(".friends-video__back > video").load(); target.querySelector(".friends-video__front > video").load(); } else { highlight(target); } return; https://codepen.io/npofopr/pen/zYOmbPv    
    • Пользователь вводит количество элементов в input и нажимает кнопку Создать, после чего рендерится коллекция. При нажатии на кнопку Очистить, коллекция элементов очищается. Создай функцию createBoxes(amount), которая принимает 1 параметр amount - число. Функция создает столько div, сколько указано в amount и добавляет их в div#boxes. Каждый созданный div: Имеет случайный rgb цвет фона Размеры самого первого div - 30px на 30px Каждый следующий div после первого, должен быть шире и выше предыдущего на 10px Создай функцию destroyBoxes(), которая очищает div#boxes. <div id="controls"> <input type="number" min="0" max="100" step="1" /> <button type="button" data-action="render">Создать</button> <button type="button" data-action="destroy">Очистить</button> </div> <div id="boxes"></div>