Ответы пользователя по тегу CSS
  • Как решить проблему с ссылками?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Потому что важен порядок правил, а именно:
    a:link
    a:visited
    a:hover
    a:active

    Это нужно запомнить. Чтобы было проще, можно ассоциировать эту последовательность LVHA (link visited hover active)” как фразу ‘LOVE’ (LV) ‘HATE’ (HA).
    Ответ написан
    Комментировать
  • Уместно ли использование такого селектора * + *?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Забудьте про существование звёздочки. Бессрочно. Во всей Вселенной.
    Ответ написан
    Комментировать
  • Как сместить горизонтальный скролл вправо по умолчанию?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    for (var i = 0, elems = document.querySelectorAll('.table_wrapper'); i < elems.length; i++) {
        elems[i].scrollLeft = elems[i].scrollWidth - elems[i].clientWidth;
    }
    Ответ написан
    1 комментарий
  • Как сделать форму выбора(марка автомобиля,модель итд) как на сайте drom.ru(описание внутри)?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    1. Именно потому что вы используете какие-то библиотеки, считаете написание подобной формы велосипедом и прочие глупые мысли, вы и оказываетесь на данном ресурсе в качестве вопрошающего.
    2. Генерировать JavaScript'ом из данных, о которых речь в следующем пункте.
    3. JSON. Формируете массив ДжаваСкрипт объектов аля:

    [
        {
            "Mercedes": {
                "E-class": {
                    "тут уж": "на что фантазии хватит"
                },
                "C-class": {
                    "тут уж": "на что фантазии хватит"
                },
                "S-class": {
                    "тут уж": "на что фантазии хватит"
                },
            }
        },
        {
            "Porsche": {
                "911": {
                    "тут уж": "на что фантазии хватит"
                },
                "928": {
                    "тут уж": "на что фантазии хватит"
                },
                "944": {
                    "тут уж": "на что фантазии хватит"
                },
            }
        }
    ]

    И генерируете на его основании форму. Над структурой нужно подумать хорошенько, чтобы с годом не было больно потом. Можно как с бекенда получать данные, так и иметь на фронте все данные, решать задачу можно сколь угодно вариативно в зависимости от нюансов. It's up to you.
    Ответ написан
    Комментировать
  • Блок со скрытым контентом, что я не так делаю?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Вызываете свой код (в первой же строчке) только для первого слайдера. Лучше переписать таким образом, чтобы в качестве аргумента была сама Node, а не селектор и продублировать этот вызов для второго слайдера:

    setTimeout(initSliders(document.querySelectorAll('.slider')[0], document.querySelectorAll('.between')[0], document.querySelectorAll('.first')[0], document.querySelectorAll('.second')[0], document.querySelectorAll('.min')[0], document.querySelectorAll('.max')[0]), 0);
    setTimeout(initSliders(document.querySelectorAll('.slider')[1], document.querySelectorAll('.between')[1], document.querySelectorAll('.first')[1], document.querySelectorAll('.second')[1], document.querySelectorAll('.min')[1], document.querySelectorAll('.max')[1]), 0);
    
    function initSliders(argSlider, argBtw, argBtn1, argBtn2, argInp1, argInp2) {
      const slider = argSlider;
      const between = argBtw;
      const button1 = argBtn1;
      const button2 = argBtn2;
      const inpt1 = argInp1;
      const inpt2 = argInp2;
      const min = inpt1.min;
      const max = inpt1.max;
        
      /* инициализация */
      const sliderCoords = getCoords(slider);
      button1.style.marginLeft = '0px';
      button2.style.marginLeft = (slider.offsetWidth - button1.offsetWidth) + 'px';
      between.style.width = slider.offsetWidth + 'px';
      inpt1.value = min;
      inpt2.value = max;
      
      /* первый вывод */
      inpt1.onchange = (evt) => {
        if (parseInt(inpt1.value) < min) {
          inpt1.value = min;
        }
    
        if (parseInt(inpt1.value) > max) {
          inpt1.value = max;
        }
    
        if (parseInt(inpt1.value) > parseInt(inpt2.value)) {
          const temp = inpt1.value;
          inpt1.value = inpt2.value;
          inpt2.value = temp;
        }
    
        const sliderCoords = getCoords(slider);
        const per1 = parseInt(inpt1.value - min) * 100 / (max - min);
        const per2 = parseInt(inpt2.value - min) * 100 / (max - min);
        const left1 = per1 * (slider.offsetWidth - button1.offsetWidth) / 100;
        const left2 = per2 * (slider.offsetWidth - button1.offsetWidth) / 100;
    
        button1.style.marginLeft = left1 + 'px'; 
        button2.style.marginLeft = left2 + 'px';
    
        if (left1 > left2) {
          between.style.width = (left1 - left2 + 18) + 'px';
          between.style.marginLeft = left2 + 'px';
        } else {
          between.style.width = (left2 - left1 + 18) + 'px';
          between.style.marginLeft = left1 + 'px';  
        }
      }
      
      /* второй вывод */
      inpt2.onchange = (evt) => {
        if (parseInt(inpt2.value) < min) inpt2.value = min;
    
        if (parseInt(inpt2.value) > max) inpt2.value = max;
    
        if (parseInt(inpt1.value) > parseInt(inpt2.value)) {
          const temp = inpt1.value;
          inpt1.value = inpt2.value;
          inpt2.value = temp;
        }
    
        const sliderCoords = getCoords(slider);
        const per1 = parseInt(inpt1.value - min) * 100 / (max - min);
        const per2 = parseInt(inpt2.value - min) * 100 / (max - min);
        const left1 = per1 * (slider.offsetWidth - button1.offsetWidth) / 100;
        const left2 = per2 * (slider.offsetWidth - button1.offsetWidth) / 100;
    
        button1.style.marginLeft = left1 + 'px'; 
        button2.style.marginLeft = left2 + 'px';
    
        if (left1 > left2) {
          between.style.width = (left1 - left2 + 18) + 'px';
          between.style.marginLeft = left2 + 'px';
        } else {
          between.style.width = (left2 - left1 + 18) + 'px';
          between.style.marginLeft = left1 + 'px';  
        }
      }
      
      /* события мыши */
      button1.onmousedown = (evt) => {       
        const sliderCoords = getCoords(slider);
        const betweenCoords = getCoords(between); 
        const buttonCoords1 = getCoords(button1);
        const buttonCoords2 = getCoords(button2);
        let shiftX1 = evt.pageX - buttonCoords1.left;
        let shiftX2 = evt.pageX - buttonCoords2.left; 
    
        document.onmousemove = (evt) => {
          let left1 = evt.pageX - shiftX1 - sliderCoords.left;
          let right1 = slider.offsetWidth - button1.offsetWidth;
    
          if (left1 < 0) {
            left1 = 0;
          }
    
          if (left1 > right1) {
            left1 = right1;
          }
    
          button1.style.marginLeft = left1 + 'px';  
          shiftX2 = evt.pageX - buttonCoords2.left;
    
          let left2 = evt.pageX - shiftX2 - sliderCoords.left;
          let right2 = slider.offsetWidth - button2.offsetWidth;
    
          if (left2 < 0) {
            left2 = 0;
          }
    
          if (left2 > right2) {
            left2 = right2;
          }
    
          let per_min = 0;
          let per_max = 0;
    
          if (left1 > left2) {
            between.style.width = (left1 - left2 + 18) + 'px';
            between.style.marginLeft = left2 + 'px';
            per_min = left2 * 100 / (slider.offsetWidth - button1.offsetWidth);
            per_max = left1 * 100 / (slider.offsetWidth - button1.offsetWidth);
          } else {
            between.style.width = (left2 - left1 + 18) + 'px';
            between.style.marginLeft = left1 + 'px';                
            per_min = left1 * 100 / (slider.offsetWidth - button1.offsetWidth);
            per_max = left2 * 100 / (slider.offsetWidth - button1.offsetWidth);
          }
    
          inpt1.value = (parseInt(min) + Math.round((max - min) * per_min / 100));
          inpt2.value = (parseInt(min) + Math.round((max - min) * per_max / 100));
        };
        
        document.onmouseup = () => document.onmousemove = document.onmouseup = null;
    
        return false;
      };
      
      button2.onmousedown = (evt) => {       
        const sliderCoords = getCoords(slider);
        const betweenCoords = getCoords(between); 
        const buttonCoords1 = getCoords(button1);
        const buttonCoords2 = getCoords(button2);
        let shiftX1 = evt.pageX - buttonCoords1.left;
        let shiftX2 = evt.pageX - buttonCoords2.left;  
        
        document.onmousemove = (evt) => {
          let left2 = evt.pageX - shiftX2 - sliderCoords.left;
          let right2 = slider.offsetWidth - button2.offsetWidth;
    
          if (left2 < 0) {
            left2 = 0;
          }
    
          if (left2 > right2) {
            left2 = right2;
          }
    
          button2.style.marginLeft = left2 + 'px';                      
          shiftX1 = evt.pageX - buttonCoords1.left; 
    
          let left1 = evt.pageX - shiftX1 - sliderCoords.left;
          let right1 = slider.offsetWidth - button1.offsetWidth;  
    
          if (left1 < 0) {
            left1 = 0;
          }
    
          if (left1 > right1) {
            left1 = right1;
          }                      
    
          let per_min = 0;
          let per_max = 0;
    
          if (left1 > left2) {
            between.style.width = (left1 - left2 + 18) + 'px';
            between.style.marginLeft = left2 + 'px';
            per_min = left2 * 100 / (slider.offsetWidth - button1.offsetWidth);
            per_max = left1 * 100 / (slider.offsetWidth - button1.offsetWidth);
          } else {
            between.style.width = (left2 - left1 + 18) + 'px';
            between.style.marginLeft = left1 + 'px';
            per_min = left1 * 100 / (slider.offsetWidth - button1.offsetWidth);
            per_max = left2 * 100 / (slider.offsetWidth - button1.offsetWidth);
          }
    
          inpt1.value = (parseInt(min) + Math.round((max - min) * per_min / 100));
          inpt2.value = (parseInt(min) + Math.round((max - min) * per_max / 100));
        };
    
        document.onmouseup = () => document.onmousemove = document.onmouseup = null;
    
        return false;
      };
      
      /* отключение Drag’n’Drop браузера, чтобы не было конфликта */
      button1.ondragstart = () => {
        return false;
      };
      
      button2.ondragstart = () => {
        return false;
      };
    }
    
    /* Получение координат элемента */
    function getCoords(elem) {
      const box = elem.getBoundingClientRect();
      
      return {
        top: box.top + pageYOffset,
        left: box.left + pageXOffset
      };
    }
    Ответ написан
    1 комментарий
  • Как убрать границы поля формы при вводе данных?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    5 комментариев
  • Почему родитель не подстраивается под ребёнка (CSS)?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Потому что элемент спозиционированный как absolute выпадает из потока документа. Теперь родитель будет вести себя так, словно у него нет детей. Можно сказать, родитель отказался от своего ребёнка.
    Ответ написан
    4 комментария
  • Почему текст внутри foreignObject не отображается в браузере Safari?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Привет, я перепробовал много чего: нэймспейсы для div'ов аттрибуты x, y, width, heigh для форейнОбджект, две мобильных версии сафари и т.д., но только указав position: fixed для месяцев удалось их проявить. При дебаге видно, что месяцы находятся на своих местах, просто их не видно. На решение это, конечно, не претендует. Я бы на вашем месте сделал это без использования svg вообще. Или пробуйте без foreignObject, используя svg'шные элементы вроде text. Сафари безнадёжен)
    Ответ написан
  • Сбор файлов js, css в gulp?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Да. /somedir/**/*.js - все джейэсы любой вложенности
    /somedir/**/*.* - ваще все любые поддиректории с любыми файлами
    Ответ написан
    Комментировать
  • Как убрать белое пространство в англ. версии сайта?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Тэги где-то криво закрыты.
    И, очевидно, что как раз таки на английской версии у вас, как должно быть, а русская свёрстана неправильно.

    EN:
    5dd9f87224466165021546.png

    RU:
    5dd9f8816a6dd448399907.png
    Ответ написан
    Комментировать
  • Как вывести сообщение в IE11 для перехода в другой браузер?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Прелоадер, очевидно, крутится, потому что вы в JS его убираете, а JS код ещё до этого момента уже посыпался в IE11. Как вариант в самом начале JS файла проверить

    function detectIE() {
        var ua = window.navigator.userAgent;
        var msie = ua.indexOf('MSIE ');
    
        if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))  {
            return true;
        }
    
        return false;
    }
    
    if ( detectIE() ) {
        // скрыть прелоадер
        // показать некое сообщение пользователю.
    }
    Ответ написан
  • Как сделать круглый индикатор выполнения?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей


    ПыСы: джейквери - это не круто.
    Ответ написан
    Комментировать
  • Как сделать, чтобы при наведении на блок появлялась надпись в отдельной области?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Можно завернуть все параграфы в единый контейнер, назовём его <div id="text">...</div,>, тогда:
    $(document).on('mouseover', '#text', function(event){
        var obj = $(this),
        $('.tooltip-row-block').css('display', 'block');
        obj.html("Настоящий договор ололо трололо ... ...");
    });
    $(document).on('mouseout', '#text', function(event){
        var obj = $(this);
        $('.tooltip-row-block').css('display', 'none');
        obj.html("Настоящий договор ололо трололо ...");
    });


    А вообще вы странные вещи делаете. У вас проблемы с архитектурой.
    Ответ написан
    Комментировать
  • Как скрыть меню после нажатия на ссылку?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    1. Не забываем в конце строки , и ;
    2. Я бы рекомендовал геттить значения ЦСС пропертиз, используя вычисленное значение getComputedStyle(elem).display
    3. Без разметки не всё так очевидно. Вы же, вроде как, хотите, чтобы на itemMenu меню скрывалось, а вешаете слушатель на btnMenu. А их несколько, а именно целая HTMLCollection. Так что нужно по ним фором идти:

    for (let i = 0; i < itemMenu.length; i++) {
    	itemMenu[i].onclick = function() {
    		if (getComputedStyle(menuHeader).display === 'flex') {
    			menuHeader.style.display = 'none';
    		} else {
    			menuHeader.style.display = 'flex';
    		}
    		this.classList.toggle('menu-btn_active');
    	}
    }
    Ответ написан
    3 комментария
  • Как в динамике отследить пресечения элементов?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Анимировать ДжаваСкриптом. Раз отмечен jquery, то в нём в методе $.animate есть функция step, срабатывающая в каждый момент времени и имеющая текущее значение прогресса.
    Ответ написан
  • Loading.gif для монитора типа 4k?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Ваша гифка закешируется и "зависнет" при повторном обновлении страницы, если об этом не позаботится. А грузить её вновь и вновь - ну нафик. Сделайте прелоадер на CSS и не придумывайте себе проблем.
    Ответ написан
    Комментировать
  • Как работать с scss в wordpress?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    например так:
    1. Установить экстэншн brackets-sass
    2. в корне проекта в .brackets.json можно настроить что, как и куда компилить(на этой же странице всё расписано)
    3. про фтп это из другой оперы, но насколько я знаю и такие плагины имеются.
    Ответ написан
  • Меню-аккордеон. Как сворачивать неактивные пункты?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Скрываете все и открываете текущий

    .sub-menu {
      display: none;
    }


    jquery
    $('.btn-menu').on('click', function() {
        $('.sub-menu').hide();
        $(this).siblings('.sub-menu').show();
    });
    Ответ написан
    7 комментариев
  • Как задать фиксированный отступ bottom: 50px не от границы блока, а то границы viewport'а, если блок больше чем viewport?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    У вас там всеми размерами жиэс заправляет.
    Адаптируем имг. codepen.io/like-a-boss/pen/NGPPjo
    Анимация. Теория. Пишем одну анимацию секунд на 10 с парой тройкой перемещений (ищем по ключам: @keyframes transform: translateX TranslateY), даём каждому элементу и делаем ей разные делэи.
    Ответ написан
    2 комментария