Задать вопрос
  • Нужен или возможен 100% pixel perfect?

    zoozag
    @zoozag
    Opencart
    Допустимые отклонения обсуждаются с заказчиком обычно.
    Ответ написан
    Комментировать
  • Нужен или возможен 100% pixel perfect?

    Wolfnsex
    @Wolfnsex Куратор тега CSS
    Если не хочешь быть первым - не вставай в очередь!
    1- Возможен ли 100% пиксель пёрфект? как бы я не старался сдвигать всё по милипиксилям, всё равно идёт малейшее несоответствие с макетом, а особенно со шрифтами.
    Шрифты - подогнать можно, если дизайнер их предварительно правильно обработал. Но, подогнать под 1 конкретный браузер, т.к. разные браузеры по разному рендерят шрифты. Выводы - сделаете самостоятельно :)

    2- Нужно ли так очень ответственно подходить к работе?
    Эти вопросы обычно обсуждаю с заказчиком и/или дизайнером или тем, кто принимает макет по факту. А так же опираясь на то, из какого места у дизайнера рисовавшего макет - растут руки, иной раз, делать "в точности как нарисовано" - означат "угробить проект", т.к. мама не хотела, папа не старался он дизайнер, он так видит.

    Через меня прошло пару заказов и вдруг начали жаловаться, что идёт сильное не соответствие с макетом.
    Очень странно, что они начали жаловаться после того как приняли макет...
    Ответ написан
    Комментировать
  • Какой инструмент выбрать для веб-анимаций, с простым API и высокой производительностью?

    mudrenokanton
    @mudrenokanton
    frontend dev
    GSAP это золотой стандарт. Ничего там сложного, даже шпаргалки есть по нему:
    https://ihatetomatoes.net/wp-content/uploads/2016/...

    А так надо от задачи плясать. Может подойти и anime, и mo.js, или даже velocity.
    Но это от случая, GSAP же подойдет везде.
    Даже если интегрироваться с THREE и подобными canvas-based, то его Timeline очень удобен.
    Ответ написан
    1 комментарий
  • Как правильно задать паттерн для инпута?

    @Mini4
    /^(0[1-9]|1[0-2])$/.test(value)
    Ответ написан
    Комментировать
  • На каком движке php лучше написать доску объявлений?

    @Camaro67
    Помог? - жми "Отметить решением"
    Вместо какого-то движка лучше посмотрите в сторону какого-то фреймворка, например, laravel. Очень низкий порог вхождения, легко разрабатывать и масштабировать проекты. Много документации на русском языке, например, здесь и здесь.
    Ответ написан
    1 комментарий
  • Как сгруппировать массив по ключу?

    DIITHiTech
    @DIITHiTech
    Fullstack javascript developer
    let obj={};
    
      [{name: 'one', q: 5}, {name: 'one', q: 3}, {name: 'two', q: 1},{name: 'two', q: 6},{name: 'three', q: 10}].forEach(entry=>{
         if(obj[entry.name]){
            obj[entry.name].q+= entry.q;
         }else{
            obj[entry.name]= entry;
         }
      });
    
      console.log(Object.values(obj));
      //Or ES5 way
      console.log(Object.keys(obj).map(name=>obj[name]));
    Ответ написан
    Комментировать
  • Как реализация вкладки на сайте?

    Тут скорее не вкладки, а фильтрация контента.
    В вашем примере реализована она на серверной стороне - при клике делается ajax-запрос и заменяться контент.
    Тут базовый алгоритм простой - отслеживаем через JS клик по "вкладке", делаем нужный ajax-запрос на сервер, потом заменяем старый контент на полученный в ответе на запрос. Ну и обвешиваем доп. плюшками, типа подсветки активного пункта меню (вкладки), спиннеры при загрузке и прочее.

    Небольшие списки контента можно фильтровать и на клиентской стороне, есть разные js-плагины, к примеру вот:
    https://www.kunkalabs.com/mixitup/
    Ответ написан
    1 комментарий
  • Как правильно написать jsdoc для кода внутри самовызывающейся функции?

    loktionov129
    @loktionov129
    Backend .NET Developer
    /**
    * @name MyNamespace
    * @namespace Hold all functionality
    */
    (function () {
        "use strict";
        /** @lends MyNamespace*/
        var stlib = function (param, param, param) { ...All of my code...};
    }());


    /**
     * @module foobar
     */
    
    /**
    * @function
    * @author Baa
    * @name hello 
    * @description Output a greeting
    * @param {String} name - The name of the person to say hello
    */
    (function hello(name) {
        /**
         * @function
         * @author Baz
         * @inner
         * @private
         * @memberof module:foobar
         * @description Check if the argument is a string (see: {@link module:foobar~hello})
         * @param {String} string - The string
         * @returns {String} Returns true if string is valid, false otherwise
         */ 
        var isString = function checkString(string) { return typeof string === 'string'; };
        if (isString(name))
          console.log('Hello ' + name + '!');
    }('Mr. Bubbles'));
    Ответ написан
    1 комментарий
  • Как сделать лучше, merge двух массивов?

    longclaps
    @longclaps
    Уж если научились оператору ... из ES6, освойте, что ли, новые структуры данных.
    Ответ написан
    9 комментариев
  • Как работать с байтами в JavaScript?

    Ni55aN
    @Ni55aN
    Для массива байтов есть типизированный Uint8Array

    Из строки в Uint8Array:
    var te = new TextEncoder("utf-8"); 
    te.encode(string); // возвращает Uint8Array


    Из массива (в данном примере целые 32-х битные)
    new Uint8Array(new Int32Array([435678]).buffer) // вернет Uint8Array с [222, 165, 6, 0]
    Ответ написан
    1 комментарий
  • Как работать с байтами в JavaScript?

    @htmldeveloper
    // var string = "qwertyuiopйцукенгшщз23456789";
    new Int8Array("qwertyuiopйцукенгшщз23456789".split('').map(x => x.charCodeAt(0)))
    
    // var integer = 435678;
    new Int8Array(435678)
    
    // var float = 35.32525324;
    new Int8Array(new Float32Array(35.32525324))
    Ответ написан
    Комментировать
  • Как сделать попап?

    Igor-Maf
    @Igor-Maf
    Senior Front End developer
    Это простейшая задача. Из этого, делаю вывод, что в Вашем случае, лучше использовать готовое решение, например, magnific-popup
    Ответ написан
    Комментировать
  • Пустая строка и null - отличия?

    Собственно я думал это одно и то же, разве нет ?

    нет.
    В обеих случаях у $a нет значения.

    в обоих случаях у а есть вполне конкретные значения и тип.
    null
    string

    а кажется вам что это одно и тоже, потому что при не строгом сравнении == они будут равны, и empty($a) вернет true в обоих случаях
    types.comparisons
    Ответ написан
    Комментировать
  • Как заставить форму мигнуть 1 раз?

    @JustFeeLin
    Начинающий веб-мастер
    Вот если будет что-то не так, вешайте класс какой-нибудь на input.
    А потом через css анимацию:
    https://jsfiddle.net/justfeelin/p4wktckp/
    Ответ написан
    Комментировать
  • Как вставить скриншот экрана в поле ввода при нажатии CTRL+V?

    @Artray
    ;(function ($) {
      $(".input").bind("paste", function(evt) {
        var item = (evt.clipboardData || evt.originalEvent.clipboardData).items[0] || null;
    
        if (item && item.kind === "file" && item.type.indexOf("image") !== -1) {
          var file = item.getAsFile(),
              data = new FormData();
    
          data.append('file', file);
    
          $.ajax({
            url: "/upload",
            type: "POST",
            data: data,
            contentType: false,
            processData: false,
            success: function (r) {
              // ...
            }
          })
        }
      })
    })(jQuery)
    Ответ написан
    Комментировать
  • Что означает знак "!" в математике?

    @xdgadd
    ML/Python/Cpp
    Это не C++, а математическая нотация. В данном случае `!` означает факториал.

    А в C++ `!` является оператором логического отрицания.
    Ответ написан
    1 комментарий
  • Как сделать паузу в игре на языке javascript?

    Exploding
    @Exploding
    wtf?
    Чисто теоретически, если много чего предположить, то может так?
    $(document).on("keydown", function(e){
    	if(e.keyCode == 27) {
    		var gPause = myGame.currentStatus("isPaused");
    		var frozenData = {};
    		
    		if(!gPause){
    			myGame.gameCurrentProcessing.all("stop").currentStatus("paused", true);
    			frozenData = myGame.detach();
    		} else {
    			frozenData.appendTo(document.body);
    			myGame.gameCurrentProcessing.all("start").currentStatus("paused", false);
    		}		
    	}
    	
    });

    Предположительно объект myGame - является jq-плагином, а если нет - ничего страшного, одну правку и норм: "$(myGame).detach();"
    Названия методов, как в прочем и их существование - взяты с потолка, поэтому их замените своими.
    Хотя.... о чем я говорю...
    Ответ написан
    Комментировать
  • Как сделать простой php маршрутизатор (роутер)?

    devg
    @devg
    I am Yenior software developer
    Очень простой роутер, не без недостатков, но довольно быстрый и легко использовать, дописывать под себя.

    <?php
    /**
     * Простой роутер
     * @devg
     */
    final class RouterLite {
    
      public static $routes = array();
      private static $params = array();
      public static $requestedUrl = '';
    
      /**
       * Добавить маршрут
       */
      public static function addRoute($route, $destination=null) {
        if ($destination != null && !is_array($route)) {
          $route = array($route => $destination);
        }
        self::$routes = array_merge(self::$routes, $route);
      }
    
      /**
       * Разделить переданный URL на компоненты
       */
      public static function splitUrl($url) {
        return preg_split('/\//', $url, -1, PREG_SPLIT_NO_EMPTY);
      }
      
      /**
       * Текущий обработанный URL
       */    
      public static function getCurrentUrl() {
        return (self::$requestedUrl?:'/');
      }
    
      /**
       * Обработка переданного URL
       */
      public static function dispatch($requestedUrl = null) {
    
          // Если URL не передан, берем его из REQUEST_URI
          if ($requestedUrl === null) {
            $uri = reset(explode('?', $_SERVER["REQUEST_URI"]));
            $requestedUrl = urldecode(rtrim($uri, '/'));
          }
    
          self::$requestedUrl = $requestedUrl;
    
          // если URL и маршрут полностью совпадают
          if (isset(self::$routes[$requestedUrl])) {
            self::$params = self::splitUrl(self::$routes[$requestedUrl]);
            return self::executeAction();
          }
    
          foreach (self::$routes as $route => $uri) {
            // Заменяем wildcards на рег. выражения
            if (strpos($route, ':') !== false) {
              $route = str_replace(':any', '(.+)', str_replace(':num', '([0-9]+)', $route));
            }
    
            if (preg_match('#^'.$route.'$#', $requestedUrl)) {
              if (strpos($uri, '$') !== false && strpos($route, '(') !== false) {
                $uri = preg_replace('#^'.$route.'$#', $uri, $requestedUrl);
              }
              self::$params = self::splitUrl($uri);
                
              break; // URL обработан!
            }
          } 
          return self::executeAction();
      } 
    
     /**
       * Запуск соответствующего действия/экшена/метода контроллера
       */
      public static function executeAction() {
        $controller = isset(self::$params[0]) ? self::$params[0]: 'DefaultController';
        $action = isset(self::$params[1]) ? self::$params[1]: 'default_method';
        $params = array_slice(self::$params, 2);
    
        return call_user_func_array(array($controller, $action), $params);
      }
    
    }
    ?>


    Пример использования:
    <?php
    // маршруты (можно хранить в конфиге приложения)
    // можно использовать wildcards (подстановки):
    // :any - любое цифробуквенное сочетание
    // :num - только цифры
    // в результирующее выражение записываются как $1, $2 и т.д. по порядку
    
    $routes = array(
      // 'url' => 'контроллер/действие/параметр1/параметр2/параметр3'
      '/' => 'MainController/index', // главная страница
      '/contacts' => 'MainController/contacts', // страница контактов
      '/blog' => 'BlogController/index', // список постов блога
      '/blog/:num' => 'BlogController/viewPost/$1' // просмотр отдельного поста, например, /blog/123
      '/blog/:any/:num' => 'BlogController/$1/$2' // действия над постом, например, /blog/edit/123 или /blog/dеlete/123
      '/:any' => 'MainController/anyAction' // все остальные запросы обрабатываются здесь
    ));
    
    // добавляем все маршруты за раз
    RouterLite::addRoute($routes);
    
    // а можно добавлять по одному
    RouterLite::addRoute('/about', 'MainController/about');
    
    // непосредственно запуск обработки
    RouterLite::dispatch();
    ?>


    UPDATE (07.08.2017):
    Дальнейшее развитие данного роутера см. в проекте Litero (https://github.com/bit55/litero)
    Ответ написан
    1 комментарий