• Как развернуть web страницу на весь экран на macbook?

    trofium
    @trofium
    99% математики и 1% волшебства
    Чтобы просматривать страницу в полном режиме в Google Chrome для MacOS, нужно использовать сочетание клавиш ⌘+Shift+F. Приятного использования
    Ответ написан
    1 комментарий
  • Есть ли аналог программы FastStone Image Viewer для Mac OS?

    hint000
    @hint000
    у админа три руки
    есть ImageMagick, в том числе и под MacOS https://imagemagick.org/script/download.php
    Ответ написан
    Комментировать
  • Есть ли аналог программы FastStone Image Viewer для Mac OS?

    Поскольку вопрос задан на Хабре, вот решение для не боящихся испачкаться в машинном масле.

    Поставить ffmpeg – можно скачать под мак. У него есть фильтр vstack – который как раз берёт много входов, лишь бы одинаковых по ширине, и склеивает их вертикально. Допустим, есть одинаковые по ширине
    4 фотки котэ
    60eead4a5ee83449377300.png

    В Терминале запустить команду. Для примера:
    ffmpeg \
      -i 320.jpg  -i 180.jpg  -i 360.jpg  -i 540.jpg  \
      -filter_complex vstack=inputs=4 \
      output.jpg
    Потрясающий результат
    output.jpg60eead7161903111281509.jpeg
    Не удобно, что надо вручную прописывать для каждой входной картинки -i имяфайла. А при выделении в Finder'е в каком-то нужном порядке и перетаскивании в Terminal, порядок собъётся на алфавитный.

    Зато это можно запускать хоть на сервере (ffmpeg есть под Linux, Windows), и работает очень быстро.
    Ответ написан
    2 комментария
  • Как сделать такие тени для элемента?

    HunteR-VRX
    @HunteR-VRX
    Помешанный на развитии
    Приветствую!

    А что особенного в этих "тенях"?

    .btn {
        box-shadow: 0 15px 25px rgba(0,0,0,.5);
    }
    Ответ написан
    1 комментарий
  • Почему текст вылазит за пределы сетки Bootstrap в WordPress?

    BlackBride
    @BlackBride
    Web developer
    Выступлю в роли ванги и предположу, что вы вставляете текст откуда-то (из ворда, например), и в нем вместо пробелов вставлются
     - которые неразрывные пробелы, не дающие тексту разбиваться
    Ответ написан
    1 комментарий
  • При нажатии на плюс значение прибавляется, при нажатии на минус убавляется. Как сделать?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сколько предполагается таких элементов - один или несколько? Будем считать, что несколько.

    Общий принцип тут такой - поймали клик по кнопке; определили, что за кнопка (т.е., как должно будет измениться значение, плюс или минус единица); от кнопки поднялись до общего предка кнопки и элемента, содержащего значение, внутри общего предка нашли элемент со значением; обновили значение.

    Вариант раз - назначаем обработчики клика каждой кнопке индивидуально:

    function setOnClick(selector, change) {
      function onClick({ target: t }) {
        const el = t.closest('.style-item_count').querySelector('.style-count-number');
        el.innerText = el.innerText.replace(/\d+/, m => Math.max(0, +m + change));
      }
    
      document.querySelectorAll(selector).forEach(n => n.addEventListener('click', onClick));
    }
    
    setOnClick('.style-count-plus', 1);
    setOnClick('.style-count-minus', -1);
    
    // или
    
    function setOnClick(selector, change) {
      $(selector).on('click', e => {
        $(e.target)
          .closest('.style-item_count')
          .find('.style-count-number')
          .text((i, text) => `${Math.max(0, parseInt(text) + change)} шт`);
      });
    }

    Вариант два - делегирование, один обработчик на всех. Если не менять разметку, то

    document.addEventListener('click', ({ target: t }) => {
      const change =
        t.classList.contains('style-count-plus')  ? +1 :
        t.classList.contains('style-count-minus') ? -1 :
                                                     0;
      if (change) {
        const el = t.closest('.style-item_count').querySelector('.style-count-number');
        el.innerText = `${Math.max(0, parseInt(el.innerText) + change)} шт`;
      }
    });
    
    // или
    
    $(document).on('click', '.style-count-plus, .style-count-minus', e => {
      const $target = $(e.target);
      const change = $target.hasClass('style-count-plus') ? 1 : -1;
    
      $target
        .closest('.style-item_count')
        .find('.style-count-number')
        .text((i, text) => text.replace(/\d+/, m => Math.max(0, +m + change)));
    });

    Но если кнопкам добавить data-атрибуты, которые будут указывать, на сколько надо изменить значение, а самому значению добавить обёртку (чтобы отделить его от единиц измерения), то код можно немного упростить:

    <div class="style-item_count">
      <div class="style-count-minus" data-change="-1">-</div>
      <div class="style-count-number"><span>1</span> шт</div>
      <div class="style-count-plus" data-change="+1">+</div>
    </div>

    document.addEventListener('click', ({ target: t }) => {
      const change = +t.dataset.change;
      if (change) {
        const el = t.closest('.style-item_count').querySelector('.style-count-number span');
        el.textContent = Math.max(0, +el.textContent + change);
      }
    });
    
    // или
    
    $(document).on('click', '[data-change]', function() {
      $(this)
        .closest('.style-item_count')
        .find('.style-count-number span')
        .text((i, text) => Math.max(0, +text + +this.dataset.change));
    });
    Ответ написан
    1 комментарий
  • Почему полиморфизм так работает?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Объяснить суть полиморфизма "на пальцах" довольно просто. Представьте себе класс Телефон. Его спроектировал некто в далеких 80-х, и определил в нем метод набратьНомер(). А потом другой программист в 90-х отнаследовал от него класс МобильныйТелефон и перекрыл метод набратьНомер(), т.к. грубо говоря, в новом устройстве набор производится уже не импульсно, а тонально. А потом третий программист отнаследовал от него класс Смартфон. При этом он не стал трогать метод набратьНомер(), а просто добавил методы для нового функционала, типа определитьПоложениеПоGPS() и т.д.

    Теперь представьте себе пользователя. Он родом из 80-х и понятия не имеет о тональном наборе и GPS... но если ему в руки дать любое из этих устройств, он сможет набрать номер и сделать звонок. Почему? Потому, что он умеет использовать метод набратьНомер(), и большего ему знать не нужно.

    А теперь представьте другого пользователя, нашего современника. Он вырос в эпоху смартфонов... но если ему в руки дать старый телефонный аппарат, он тоже сможет сделать звонок, т.к., опять же, знает метод набратьНомер().

    Применительно к ООП, пользователь - это переменная, содержащая ссылку на экземпляр класса. Ее тип (как она была объявлена) - это "набор знаний" о возможностях этого экземпляра. И т.к. Смартфон в своей основе является Телефон-ом, мы вполне можем дать его в руки гипотетическому пользователю из 80-х:
    Телефон устройство = new Смартфон();
    в результате чего он сможет сделать звонок:
    устройство.набратьНомер("03");
    А вот определить свое местоположение он не сможет, пока не узнает о существовании соотв. метода:
    Смартфон усовершенствованноеУстройство = (Смартфон)устройство;

    Это называется приведением типа. В данном примере у экземпляра класса уже был соотв. метод, но чтоб им воспользоваться, нужно сначала явно указать, что мы хотим рассматривать имеющееся у нас в руках устройство не как "простой" Телефон, а как Смартфон.

    P.S. Кстати, в этом примере мы затронули не только полиморфизм, но и наследование, и инкапсуляцию (пользователя "снаружи" совершенно не интересует, как именно производится набор номера - тонально, импульсно или еще как-то иначе)... так сказать, все три кита ООП в одном флаконе. И только так вообще имеет смысл рассматривать эти принципы, т.к. они по сути неотделимы друг от друга, как Отец, Сын и Святой Дух в Христианстве или же длина, ширина и высота в трехмерном пространстве :) Если это понять, ООП становится совершенно простой и естественной парадигмой программирования.
    Ответ написан
    8 комментариев
  • Настроить вывод пунктов списка по 3 штуки?

    twobomb
    @twobomb
    <?PHP
    $tmp = array_chunk($service_list,3);
    foreach($tmp as $k => $v){
    	echo '<ul class="service_list">';
     foreach($v as $row => $list_items)
       echo "<li>$list_items[item] </li>";
      echo '</ul>';
    }
    ?>
    Ответ написан
    1 комментарий