• Насколько профитнее использовать мобильную версию вместо адаптивной?

    @pavelsha
    Если дизайн и вёрстка продаётся заказчику как две/три отдельных работы, то Профит может быть и 100%, и 200%, и 300% .

    Вот, ИМХО, главный профит и подводный камень.

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

    Хотя такое разделение может быть оправдано, если
    а) поддерживаем существующее решение. Переработка верстки/дизайна в "одну струю" дороже, чем поддержка на несколько лет
    б) верстка для мобильных устройств и для декстопов сильно раличаются
    в) две линии верстки обеспечены и поддерживаются платформой (например, SharePoint). В ряде случаем это пункт а.
    Ответ написан
    Комментировать
  • Есть ли какая то концепция именования блоков НЕ по смыслу в html?

    @SergeiB
    Это утилитарный подход (так называемый атомарный css): один класс - (преимущественно) одно стилевое правило. Читайте документацию utility-first фреймворков. Самый крупный игрок в этой области - Tailwind CSS. Также в Bootstrap 5 появилась возможность использовать (в том числе задавать свои) классы-утилиты.
    Ответ написан
    Комментировать
  • Как адаптивно верстать круг выходящий за границы контейнера?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer


    Вариантов много. Например, так.
    Здесь я применил свойство aspect-ratio, просто чтобы сократить код, и побыстрее написать пример. Вы можете использовать хак с паддингом и дополнительным элементом для круга, если нужна поддержка более старых браузеров.
    Ответ написан
    Комментировать
  • Как адаптивно верстать круг выходящий за границы контейнера?

    @alekcena
    Нелинейный наставник
    1) Не вижу проблем с фиксированными величинами для кастомных элементов. Несколько медиа запросов.
    2) Если принципиально нужно решить в %. Делаем относительно. В внутрь текст абсолютом. Как это работает(Первая загугленая статья)
    .round {
          max-width: 827px;
          height:0;
          padding-top:30%;
          width: 100%;
    }
    Ответ написан
    Комментировать
  • Шаблонизатор/препроцессор для верстки в 2021?

    @Froggyweb
    из адекватных для верстки - pug и nunjucks
    ejs и handlebarsjs - слишком низкоуровневые, хотя наверняка быстрее.
    React Vue Angular - это про другое.
    nunjucks должен нормально работать с Webpack. Даже для Vite есть плагин, что и попробую сейчас.

    Ну либо использовать posthtml-include, но это так себе костыль.
    Под вебпаком PUG и pug-bem-plain-loader работают отлично, но вебпак как-то не торопливый. Галп + Вебпак для js - лучше, Vite пока фантастика, но плагинов не густо.
    Ответ написан
    Комментировать
  • Шаблонизатор/препроцессор для верстки в 2021?

    @SergeiB
    Использую Nunjucks, доволен, как слон. Подключаю, как в приведённом тут примере:
    import Nunjucks from './nunjucks'; // Импортируем Nunjucks из нашего файла конфигурации (см. ниже)
    
    {
      test: /\.njk$/,
      use: {
        loader: 'html-loader',
        options: {
          preprocessor: (content, loaderContext) => {
            let result;
    
            try {
                loaderContext.addContextDependency(loaderContext.context);
                loaderContext.addDependency(PATHS.njkConfig); // PATHS.njkConfig - путь к файлу конфигурации
    
                result = Nunjucks.renderString(content); // или `Nunjucks.render(loaderContext.resourcePath)`
              
            } catch (error) {
              loaderContext.emitError(error);
    
              return content;
            }
    
            return result;
          },
          minimize: false
        }
      }
    }


    Файл конфигурации nunjucks.js.

    import Nunjucks from 'nunjucks';
    
    // PATHS.pages - путь к папке с файлами Nunjucks
    const env = Nunjucks.configure(PATHS.pages, {
      noCache: true
    });
    
    // Тут можно задавать всякие фильтры и глобальные переменные, например:
    // const isArray = value => Array.isArray(value);
    // env.addFilter('isArray', isArray);
    // env.addGlobal('projectName', 'mySuperProject');
    
    export default Nunjucks;

    Ответ написан
    Комментировать
  • Как можно избежать глюки текста при transform scale?

    AlekSays
    @AlekSays
    FrontEnd developer
    С такими вопросами еще код бы увидеть.
    Попробуйте сделать так: родительскому элементу perspective: 1;
    А переход сделать таким образом:
    .element {
      transition: ..some values;
      will-change: transform;
      &:hover {
        transform: scale(1.2) translateZ(0);
      }
    }
    Ответ написан
    1 комментарий
  • В чем суть такой записи в reset.css?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Это разные по сути объявления.
    content: ""; - задаёт содержимое псевдоэлемента (пустую строку)
    content: none; - говорит, что псевдоэлемент вообще не генерируется
    Ответ написан
    2 комментария
  • В чем суть такой записи в reset.css?

    nowm
    @nowm
    Это специфичное для blockquote определение, которое Eric Meyer (автор reset.css) позаимствовал у Paul Chaplin. Первая строка content: "" делает так, чтобы у blockquote исчезли кавычки — на случай, если вторая строка content: none не поддерживается браузером, потому что первая строка — это CSS 2, а вторая — это CSS 2.1. В одну строку их записать нельзя, потому что по стандарту для свойства «content» нельзя комбинировать ключевые слова «normal» и «none» с другими значениями.

    Вообще, когда встречается перечисление одного и того же свойства с разными значениями, это делается для того, чтобы обеспечить совместимость с разными браузерами. То есть, если, например, браузер не поддерживает «content: none», он применит «content: ""», а другую запись проигнорирует.

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

    .some-class {
        background: #e66465;
        background: linear-gradient(#e66465, #9198e5);
    }


    В этом коде, если браузер поддерживает градиентный фон, он сначала прочитает, что нужно использовать цвет «#e66465», а потом это перезапишется записью «linear-gradient», и итоговое значение будет «linear-gradient(#e66465, #9198e5);». Если же браузер не поддерживает градиент, он сначала прочитает, что нужно использовать «#e66465», а потом увидит неподдерживаемое определение «linear-gradient», проигнорирует его, и итоговое значение будет «#e66465».
    Ответ написан
    Комментировать
  • Есть ли какой то потайной смысл в объявлении переменных с такими именами как "__list__" ,"$this,$el" etc?

    @inFureal
    Никакого потайного смысла нет. Все дело в "принадлежности" к тому или иному функционалу дабы избегать переопределения переменных.
    Во Vue например это сделано, чтобы обозначить зарезервированные свойства внутри компонента. Типа $ref, $root, $props и т.д
    Ответ написан
    Комментировать
  • Зачем нужна констуркция функции const i = fucntion() {}?

    @salnet
    При объявлении функции через обычный метод function execute () {} происходит hoisting, то есть поднятие функции вверх кода и она объявляется раньше всех остальных. При подходе присваивания переменной такого не будет
    619d740b144ed488800261.png
    Ответ написан
    Комментировать
  • Где искать нормальных менторов?

    @daryada
    solvery.io
    tolk-talk.ru
    Ответ написан
    Комментировать
  • Где искать нормальных менторов?

    Zoominger
    @Zoominger Куратор тега IT-образование
    System Integrator
    Устроиться на нормальную работу в офис и показывать коллеге/руководителю.
    Кукоратор - это развод, ни один профессионал не будет тратить своё высокооплачиваемое время для ковыряния трейни-лапши, который за это нормально даже не заплатит.
    Исключение - энтузиасты, которых много, например, тут.
    Ответ написан
    Комментировать
  • Объединяет ли браузер два одинаковых эвента в один?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    // с заглавных букв ниже — сущности, которые стоит различать:

    Событие (Event) и Слушатель события (Listener) — это разные штуки.

    вот вы повесили два Слушателя на одно и то же Имя (или Тип) события на одном и том же Элементе. Это всё равно, что в один массив засунуть две функции. При наступлении События данного Типа, последовательно выполнятся все функции из «массива».

    Юзер кликнул мышкой — браузер создал Событие с Типом "click". Клик отправляется в путешествие: начинает с document и ныряет глубже до того элемента на котором была мышка. Затем это же событие всплывает наверх, обратно, до document.

    Где-то по пути Событие могут Слушать и Поймать (и не отпустить дальше). В вашем примере его поймают на document в конце обратного пути. И прогонят через строй Слушателей )
    Ответ написан
    Комментировать
  • Можно ли создать свой node_modules чтобы импортировать оттуда нужные мне вещи?

    Fragster
    @Fragster
    помогло? отметь решением!
    конкретно для ноды и нпм - точно можно подключать репо с гитхаба:
    npm install git+https://github.com/author/repo_name.git

    и использовать
    import variable from 'repo_name'

    для composer тоже есть подобное: https://getcomposer.org/doc/05-repositories.md#vcs
    Ответ написан
    Комментировать
  • Как делать отступы между блоками во флекс контейнере правильно?

    @alekcena
    Нелинейный наставник
    Обычно всегда в таких случаях что-то типа такого делаю
    https://codepen.io/alekcena/pen/eYWeYPy
    Ответ написан
    Комментировать
  • Как реализовать такой цикл вывода постов на wp?

    vasmor
    @vasmor
    Интересуюсь
    Есть такой вариант:
    Получаем посты по $term

    $query = new WP_Query( array(
        'post_type' 		=> $type, // Ваш тип записи
    	'posts_per_page'	=> -1,        
    	'tax_query' => array(
    		array(
    			'taxonomy' => $tax, // Такса типа записи
    			'field'    => 'slug', 
    			'terms'    => $term // Нужный терм
    		)
    	)
    ) );


    Через цикл создаем массив id всех меток, присутствующих в полученных на предыдущем шаге постах

    $all_tags = [];
    
    if ( $query->have_posts() ) {
    	while ( $query->have_posts() ) {
    		$query->the_post();
    
    	        $cur_terms = get_the_terms( $post->ID, $post_tag ); // $post_tag - нужная таксономия (если это стандартная метка поста, то $post_tag = 'post_tag')
    	        if( is_array( $cur_terms ) ){
    		        foreach( $cur_terms as $cur_term ){
    			         $all_tags[] = $cur_term->term_id;
    		       }
    	        }        	
    	}
    }
    // Возвращаем оригинальные данные поста. Сбрасываем $post.
    wp_reset_postdata();
    
    $all_tags = array_unique($all_tags); // Оставляем уникальные значения в массиве


    Выводим кнопки табов

    echo '<ul>';
    
    	$i = 0;
    	foreach ( $all_tags as $tag ) {
    		$class_active = $i === 0 ? ' tab-active' : ''; // для первой кнопки ставим активный класс
    		$tag_name = get_term( intval( $tag ) )->name; // Наименование метки
    		echo '<li class="tab-caption' . $class_active . '">' . $tag_name . '</li>';
    	$i++;
    	}
    
    echo '</ul>';


    Выводим контент табов

    echo '<div>';
    
    	$k = 0;
    	foreach ( $all_tags as $tag ) {
    		$class_active = $k === 0 ? ' tab-active' : '';
    		
    		echo '<div class="tab-content' . $class_active . '">';
    			if ( $query->have_posts() ) {
    				while ( $query->have_posts() ) {
    					$query->the_post();
    
    				        if ( has_term( intval( $tag ), $post_tag ) ) { // Выводим только те посты, в которых есть текущая метка в цикле
    				        	the_content(); // Здесь вывод данных поста. Как вариант - get_template_part( 'path/to/template' );
    				        }    	
    				}
    			}
    			// Возвращаем оригинальные данные поста. Сбрасываем $post.
    			wp_reset_postdata();
    		echo '</div>';
    	$k++;
    	}
    
    echo '</div>';
    Ответ написан
    7 комментариев