Задать вопрос
Ответы пользователя по тегу HTML
  • Как правильно вставлять адаптивные изображения?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Вам в любом случае нужно знать размеры картинки. Это можно узнать с помощью php на сервере. Либо для использования в атрибутах, что вам не подходит, либо так как опишу ниже.

    Делаем обертку для картинок:

    <div class="img-placeholder-responsive">
      <div class="img-placeholder-responsive__box">
        <img src="" alt="">
      </div>
    </div>


    .img-placeholder-responsive {
      &__box {
        position: relative;
        width: 100%;
        height: 0;
        box-sizing: border-box;
        padding-bottom: percentage(3/4); // default aspect ratio
    
        // Можем этот плесхолдер стилизовать как-то, пока картинка не загружена
        background: gray;
        // Можем надпись добавить
        &::before {
          position: absolute;
          content: 'Картинка загружается...';
        }
    
        > img {
          position: absolute;
          left: 0;
          top: 0;
          right: 0;
          bottom: 0;
          width: 100%;
          height: 100%;
        }
      }
    }


    Здесь использован вложенный блок, а не псевдоэлемент для распорки, так как нам нужно передавать aspect из php.

    Используем:

    <?php
    // Получаем размер картинки
    $width = getImageSize();
    $height = getImageSize();
    ?>
    <!-- Вставляем в разметку -->
    <div class="img-placeholder-responsive">
      <div class="img-placeholder-responsive__box"
           style="padding-bottom: <?= $height / $width * 100 ?>%"
      >
        <img src="" alt="">
      </div>
    </div>


    Наслаждаемся результатом!

    PS. Если у вас соотношение сторон изображений величина постоянная для всех, то от получения размеров и вставки их в разметку можно отказаться, и задать дефолтный aspect в css (в примере есть).
    PPS. Если aspect различается незначительно, можно его также вшить в css и задать картинке стиль object-fit: cover (или contain)
    Ответ написан
    Комментировать
  • Почему overflow: hidden; не скрывает текст рядом с блоком float?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Существуют понятия поток элементов в документе и контекст форматирования. Строчные располагаются в потоке слева направо, блочные — сверху вниз. Float заставляет другие элементы в потоке обтекать указанный. Именно это вы наблюдаете в первом примере.
    Определенные свойства создают новый контекст (overflow, display с некоторыми значениями и другие). В новом контексте создается свой поток элементов. Вы это видите на втором примере.
    Ответ написан
    1 комментарий
  • Как сделать самоперестраивающийся список?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Какую же хрень пишут в ответах, флексы, гриды... Вообще не к месту.
    Не могу на это смотреть. Держите:

    Ответ написан
    Комментировать
  • Как работают медиазапросы, почему не работает?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    max-width означает "до" (включительно)
    min-width означает "от" (включительно)

    т.е. у вас стили применяются на ширине браузера до 992px включительно
    Начиная с 993 эти стили отключаются.

    max-device-width: 1400px
    означает "размер дисплея до 1400". Дисплея (устройства), не браузера.
    Ответ написан
    2 комментария
  • Эквивалентная высота или почему не работает трюк с flex?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    В ваших стилях сложно разобраться. Приведите код в порядок.

    У вас все работает. Просто есть обертка внутри (сслыка). Сделайте ей display: flex; flex-direction: column; и растяните текстовую часть flex-grow: 1;
    Ответ написан
  • Можно ли сделать iframe с авто height?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Внутри iframe — отдельный документ, страница. Можете считать iframe окошком браузера. Высоту на основе содержимого задать с помощmю Css нельзя.

    Если содержимое iframe загружено с того же домена, что и родительская страница, то вы сможете джаваскриптом получить доступ внутрь iframe (или наоборот из фрейма в родительскую страницу), посчитать высоту контента и установить ее для iframe.
    Ответ написан
    Комментировать
  • Как вставить видео через iframe без полос?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Это не отступы "внутри iframe" =))
    Это те же самые полоски, что бывают и на телеке при несовпадении формата экрана телевизора и формата кадра транслируемого видео.

    Соответственно, если вы знаете формат кадра, то можно сделать так:

    Ответ написан
    Комментировать
  • Как сверстать такой заголовок?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Учитывая тот факт, что фон уходит влево, а значит не создаст горизонтальной полосы прокрутки, можно сделать довольно просто:

    .heading {
      position: relative;
      …
      &::before {
        position: absolute;
        right: 0;
        top: 0;
        bottom: 0;
        width: 100vw; /* или 99999px; */
        background: rgba(blue, 0.5);
        z-index: -1;
        transform: skewX(30deg);
      }
    }
    Ответ написан
    Комментировать
  • Как сделать чтобы при наведении курсора на слайдер он останавливался?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    я хочу научиться, но уже на готовом к моему слайдер коду.

    Похвально. Есть смысл задать вам направление =)

    У вас есть старт для слайдов. вот здесь
    setInterval(plusSlide, 4000);
    Чтобы прекратить переключение, вам нужно остановить таймер. Для остановки таймера, нужна ссылка на него.
    Об этом можно почитать здесь https://learn.javascript.ru/settimeout-setinterval

    Останавливать таймер нужно по событию. Событие которое возникает при наведении мышки на элемент называется mouseover (еще есть mouseenter)
    Подробнее о назначении обработчиков событий здесь https://learn.javascript.ru/introduction-browser-e...

    При уходе мышки нужно снова запускать таймер (запускать вы уже умеете). Здесь вам нужны события mouseout или mouseleave.
    Ответ написан
    Комментировать
  • Головоломка с раскладкой страницы. Решим?

    delphinpro
    @delphinpro Автор вопроса, куратор тега CSS
    frontend developer
    Решение.

    Так как контент секций всегда остается в пределах сетки, а заполнителем выступает лишь фон, и с оглядкой на будущее (вдруг фоном будет выступать картинка, а не сплошной цвет) искал решение на основе варианта, предложенного #FFFFFF .

    Общая разметка колонок страницы

    <div class="page">
      <div class="page__main"> ... </div>
      <div class="page__side"> ... </div>
    </div>


    Секция размещается внутри основной колонки

    <div class="page__main">
        <div class="section">
          <div class="section__body">
            ...
          </div>
        </div>
      </div>


    Стили колонок представляют собой обычную бутстраповскую сетку (часть медиа-запросов убрана для краткости)

    /*==
     *== Page layout
     *== ======================================= ==*/
    
    .page {
      @include make-row();
    
      &__main,
      &__side {
        @include make-col-ready();
      }
    
      &__side {
        z-index: 1;
      }
      
      // <…cut>
    
      @include media-breakpoint-up(lg) {
        &__main {
          @include make-col(9);
        }
        &__side {
          @include make-col(3);
          order: -1;
        }
      }
    }


    И стили самой секции (собственно решение проблемы)

    $default-scrollbar-width: 16px;
    
    .section {
      @include make-row();
      position: relative;
    
      &__body { @include make-col-ready(); }
    
      &::before {
        z-index: -1;
        position: absolute;
        top: 0;
        right: percentage(6/9);
        width: 100vw;
        height: 100%;
        transform: translateX(50%);
        margin-right: ($default-scrollbar-width / 2);
      }
    }


    Значение для переменной $default-scrollbar-width измерено в браузере линейкой.
    Конечно, это не годится для использования, поэтому ширина скроллбара измеряется джавасриптом и в страницу вставляется корректирующий стиль
    App.compensateWidthScrollbar = function () {
        let width  = this.getScrollbarWidth();
        let css    = '.section::before{margin-right:'+ (width / 2) + 'px';
        let style  = document.createElement('style');
        style.type = 'text/css';
        style.appendChild(document.createTextNode(css));
        (document.head || document.getElementsByTagName('head')[0]).appendChild(style);
    };

    Вся эта хрень с правым марджином и шириной скроллбара нужна, чтобы избавиться от горизонтального скроллбара.
    Ответ написан
    Комментировать
  • Почему элементы слились в grid'е?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Потому что два элемента по 50%. Как еще вы хотите?

    Нужен промежуток — задайте его:
    .input_boxes_flex {
        display: grid;
    /*    grid-template-columns: 50% 50%; */
        grid-template-columns: 1fr 1fr;
        gap: 10px;
    }
    Ответ написан
    3 комментария
  • Как сделать "раскрывашку"?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Универсальный код для вложенных менюшек на списках.

    const sm = $('.side-menu');
    
    if (!sm.length) return;
    
    sm.on('click', 'button', function () {
        let item = $(this).closest('li');
    
        item.toggleClass('open');
        item.children('ul').slideToggle();
        item.closest('ul').children('li').not(item).find('ul').slideUp();
    });
    
    sm.find('.open').children('ul').show();


    Разметка такого рода:
    <ul class="side-menu">
            <li class="open">
                <span><a href="#">Металлопрокат</a><button><svg class=" i i-angle-left"><use xlink:href="/design/images/sprite.svg#angle-left"></use></svg></button></span>
                <ul class="side-menu__nested">
                    <li class="open">
                        <span><a href="#">Сортовой прокат</a><button><svg class=" i i-angle-left"><use xlink:href="/design/images/sprite.svg#angle-left"></use></svg></button></span>
                        <ul class="side-menu__nested">
                            <li class="">
                                <span><a href="#">Квадратный</a><button><svg class=" i i-angle-left"><use xlink:href="/design/images/sprite.svg#angle-left"></use></svg></button></span>
                                <ul class="side-menu__nested">
                                    <li class=""><span><a href="#">Балка</a></span></li>
                                    <li class=""><span><a href="#">Уголок</a></span></li>
                                    <li class="current"><span><a href="#">Швеллер</a></span></li>
                                    <li class=""><span><a href="#">Арматура</a></span></li>
                                </ul>
                            </li>
                            <li class="">
                                <span><a href="#">Круглый</a><button><svg class=" i i-angle-left"><use xlink:href="/design/images/sprite.svg#angle-left"></use></svg></button></span>
                                <ul class="side-menu__nested">
                                    <li class=""><span><a href="#">Балка</a></span></li>
                                    <li class=""><span><a href="#">Уголок</a></span></li>
                                    <li class="current"><span><a href="#">Швеллер</a></span></li>
                                    <li class=""><span><a href="#">Арматура</a></span></li>
                                </ul>
                            </li>
                            <li class="">
                                <span><a href="#">Шестигранный</a><button><svg class=" i i-angle-left"><use xlink:href="/design/images/sprite.svg#angle-left"></use></svg></button></span>
                                    <ul class="side-menu__nested">
                                        <li class=""><span><a href="#">Балка</a></span></li>
    UPDATE:

    Плюс/минус убирайте из псевдо. Стилизуйте кнопки.

    https://codepen.io/anon/pen/axBBrZ?editors=1010

    Полный пример: https://codepen.io/delphinpro/pen/BEZgwR
    Ответ написан
  • Какие можно задать классы заголовкам, если есть 3 заголовка с разными цветами?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Нужно понять, что означают эти цвета.
    Можно тупо сделать модификаторы, как предложил DanKud:

    <h2 class="heading heading_red">
    ...
    </h2>


    Но это плохо тем, что впоследствии heading_red может стать желтым, или в полоску. И если уж так писать, то лучше использовать param_value модификатор:

    <h2 class="heading heading_theme_red">
    ...
    </h2>


    В общем случае, без оглядки на макет, более правильно будет в названии класса описать его назначение:

    <h2 class="heading heading_primary">...</h2>
    <h2 class="heading heading_secondary">...</h2>
    Ответ написан
    Комментировать
  • Как сделать эквивалентную высоту в таких условиях?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Комментировать
  • Как передать значение js объекта на html страницу?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Это массив, судя по ключам, можно использовать forEach
    Но если все же это объект (ключи не порядковые)
    let data = {...};
    let html = '';
    for (let k in data) {
      if (!data.hasOwnProperty(k)) continue;
      let item = data[k];
      html += '<ul>';
      html += '<li>'+item['category']+'</li>';
      html += '<li>'+item['symbol']+'</li>';
      // ...
      html += '</ul>';
    }
    document.getElementById('differencesDiv').innerHTML = html;
    Ответ написан
    2 комментария
  • Каким HTML online редактором удобно пользоваться?

    delphinpro
    @delphinpro Куратор тега HTML
    frontend developer
    Умеет же

    5c8b132c3b816203063565.png
    Ответ написан
    Комментировать
  • Scrollbar дает свою высоту первому элемету в диве?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    .scroll_bar {
        overflow-y: scroll;
        height: 730px;
        align-content: flex-start; /* fix */
    }

    https://css-live.ru/articles/vizualnoe-rukovodstvo...
    Ответ написан
    Комментировать
  • Как сделать так чтобы в мобильной версии удалялся 1 css класс на JS?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    const navbar = document.querySelector('.navbar');
    matchMedia('(max-width: 700px)').addListener(mq => {
        navbar.classList.toggle('show', mq.matches)
    });
    Ответ написан
    Комментировать
  • Обновление данных без обновления страницы?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    А зачем вы меняете атрибуты?
    Нужно менять данные.

    $('.add_item').data('id', 2);
    $('.add_item').data('title', 'Справка в бассейн (взрослых)-1');

    И, кстати, код можно сократить, используя объекты (в обоих случаях)
    $('.add_item').data({
      id: 2,
      title: 'Справка в бассейн (взрослых)-1'
    });
    Ответ написан
    1 комментарий