• Как сделать исчезающее меню при клике на кнопку меню в случае с функцией resize?

    HelenStar
    @HelenStar Автор вопроса
    Антон Спирин,

    А в чем принципиальная разница между ними? fadeIn по сути добавляет display: block и заданную скорость появления. То же, что я бы прописала в этом классе active. Разве что появление через opacity будет более плавным. Можно и изменить. Но также можно и через .css это делать, меняя opacity. В чем принципиальное отличие между изменением свойств и добавлением классов? Я имею ввиду, чем добавление/удаление лучше, чем изменение свойств.


    В общем-то, загуглила этот вопрос, не дожидаясь ответа, и нашла хорошую статью. Да... не задумывалась как-то о том, что все эти методы вписывают все стили в атрибут style у элемента. Обращала внимание, но не задумывалась о последствиях этого, хотя сама бы ни за что не стала в html файле руками прописывать стили подобным образом, особенно со скрытым во вкладках контентом, который, получается, не будет индексироваться поисковиками, раз он всегда скрыт по умолчанию, а это плохо.

    В общем, теперь буду использовать классы, как вы предложили, с теми же свойствами display: none, block и т.д. :-)
  • Как сделать исчезающее меню при клике на кнопку меню в случае с функцией resize?

    HelenStar
    @HelenStar Автор вопроса
    Антон Спирин, посмотрите код css, там итак оно все формируется в медиазапросе из декстопной версии с помощью flexbox свойств. И там не одно меню участвует, там вся шапка полностью переформируется в этих стилях в новое меню и в новую шапку, ибо в мобильной версии совершенно иное расположение этих же элементов в шапке, чем в декстопе. Часть уходит в меню, часть остается в шапке. И попросили не создавать второе меню для мобилы в html коде (что было бы проще), чтобы не дублировать код, а реализовать все через css, и также не добавлять его через js (имеется ввиду через append новое меню, удаляя при этом старое через remove).

    И как сделать через css выпадающее меню при клике по кнопке, которое еще и представляет собой полностью переформированную всю шапку сайта, и у которого только отдельные блоки должны быть видимы при клике и невидимы в остальное время? Тут вся задница именно в структуре меню. Это не просто список в шапке, который в мобиле там надо скрыть, а в выпадающем меню добавить.

    У вас сейчас при ресайзе до 450px каждый раз overlay добавляется, их так можно и 100000 наплодить.

    Ну так при ресайзе обратно в > 450 оверлей удаляется обратно. Хотя это действительно лишняя манипуляция. Можно и оставить пустой блок с оверлеем в коде, но это уже к вопросу наличия лишних пустых блоков в коде и т.д. А так обычно я всегда делаю пустой блок с классом overlay в начале или в конце body с "display: none" для этой цели, потому что это проще и удобнее.

    fadeIn и fadeOut можно реализовать с помощью transition: opacity 0.2s;
    и в js только добавлять и убирать классы вроде .is-active { display: block; opacity: 1; }

    А в чем принципиальная разница между ними? fadeIn по сути добавляет display: block и заданную скорость появления. То же, что я бы прописала в этом классе active. Разве что появление через opacity будет более плавным. Можно и изменить. Но также можно и через .css это делать, меняя opacity. В чем принципиальное отличие между изменением свойств и добавлением классов? Я имею ввиду, чем добавление/удаление лучше, чем изменение свойств.

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

    Я бы полностью выпилил resize, отказался от fadeIn fadeOut и использования функции css()

    Так вот без него после поворота экрана или изменения размера окна в браузере меню не появляется обратно. Оно исчезает полностью из-за того, что мы убираем его при клике на кнопку, фон, ссылку и т.д. То есть в мобиле меню принимает "display: none", при клике оно появляется, но после клика по кнопке, фону или ссылке снова исчезает. Скрипт, как говорится, свою работу сделал. В результате после поворота экрана (где уже снова отображается декстопная версия сайта) или ресайза в режиме разработчика меню остается скрытым.

    Поэтому я и заморочилась с этим ресайзом, добавившим столько проблем.

    Конечно, проще, когда можно в html сделать отдельно мобильное меню и просто сделать его появление/исчезновение с помощью пары строк кода jquery, а не воротить все операции со свойствами, классами и т.д.
  • Как сделать исчезающее меню при клике на кнопку меню в случае с функцией resize?

    HelenStar
    @HelenStar Автор вопроса
    Антон Спирин, и как же? Напишите тогда свой вариант. Я затем и задаю здесь вопросы, чтобы найти более правильное простое и короткое решение, а не просто ответ, что можно сделать иначе. :-)

    Ошибку выдает, потому что там нет кавычек в скобках у триггера. Это опечатка моя))) resize должно быть в кавычках.

    На серваке можно не смотреть уже. Там теперь рабочий вариант. По-другому переписала код. Вот так:

    $(window).bind('resize', function(){ 
        if ($(window).width() < 450) { 
            $('.header').removeClass('flex');
            $('body').append('<div class="overlay"></div>');
            $('.nav').css('z-index','9');   
            $('.logo, .contacts, .nav').addClass('fadeout');
            $('.fadeout').css('display','none');
        } 
        else { 
            if ($(window).width() > 450) {         
                $('.header').addClass('flex');
                $('.overlay').remove();
                $('.nav').css('z-index','11');
                $('.logo, .contacts').css('display','block'); 
                $('.nav').css('display','flex');
                $('.logo, .contacts, .nav').removeClass('fadeout');
                }
            }
      
    }).trigger('resize');
    
        $('.btn-nav').on('click', function() {
            if ($('.fadeout, .overlay').css("display") == "none") {
                $('.fadeout').fadeIn(200);
                $('.overlay').fadeIn(200);
                $('.btn-nav').css('background','url(img/btn-nav-active.png) top left no-repeat');
            }
            else {
                    $('.overlay').fadeOut(200);
                    $('.fadeout').fadeOut(200);
                    $('.btn-nav').css('background','url(img/btn-nav.png) top left no-repeat');
                }
        });  
        
        $(('a.nav-link')).on('click touch', function() { 
            $('.overlay, .fadeout').fadeOut();
            $('.btn-nav').css('background','url(img/btn-nav.png) top left no-repeat'); 
        }); 
        
        $('body').on('click', '.overlay', function(event) {
        event.preventDefault();
            $('.overlay, .fadeout').fadeOut(200);
            $('.btn-nav').css('background','url(img/btn-nav.png) top left no-repeat');
        });


    То есть в ресайз ушли только манипуляции с классами и свойствами, ведь кнопки мобильного меню в любом случае нет в декстопной версии.

    Тут единственный минус разве что в том, что при клике по ссылке скрипт будет отрабатывать, вот только классов, которые должны исчезать при этом, тут нет. Но эту часть тоже можно вынести в resize.
  • Как во флексах задать ширину колонки по размерам контейнера флекса?

    HelenStar
    @HelenStar
    raulvodov, попробовала с вашим кодом в jsfield сделать. Посмотрите. Так нужно?
    Только я не понимаю, почему именно такая разметка страницы? Заголовок проще было сделать у общего блока, содержащего контентную часть, а уже под ним обернуть все колонки в один контейнер со свойством display: flex, flex-wrap: wrap, тогда бы они колонками выстраивались сами, заполняя контейнер.

    Что-то вроде:

    <div class="container">
      <div class="background">
    
        <div class="column sidebar">
          <header class="widget header_widget">
            <p>Widget</p>
            <p>left</p>
          </header>
        </div>
    <div class="wrap-content"> 
    <p>Interviewing</p>
    <div class="wrap-column">
    Здесь все колонки
    </div>
    </div>
    </div>
    </div>

    Клик на живой пример с вашим кодом.
  • Как во флексах задать ширину колонки по размерам контейнера флекса?

    HelenStar
    @HelenStar
    Ankhena, а, ну да. Точно. Ступила немного. Спасибо за правку. Еще хотела проверить в своем же примере, задав 100%) Но в любом случае это должно работать, и странно, что не получилось.
  • Как во флексах задать ширину колонки по размерам контейнера флекса?

    HelenStar
    @HelenStar
    raulvodov, со 100% шириной тоже работает в этом примере, не посмотрела.

    Так вам флексы нужны только для этого?
    А стандартные text-align: center у блока с заголовком не пробовали?
    Во флексах центрирование по горизонтали для содержимого делается через justify-content: center;
  • Как во флексах задать ширину колонки по размерам контейнера флекса?

    HelenStar
    @HelenStar
    В каком блоке все должно происходить? background? Если да, то у него выставлено width: 100%; Нужно, чтобы была фиксированная ширина, чтобы работало свойство flex-wrap.

    Если нужно, чтобы было width: 100% именно, тогда оберните второй и третий блоки, которые вы хотите, чтобы были колонками под первым блоком, в еще один блок. И тогда блоку контейнеру задайте flex-direction: column, а блоку-обертке тех двух блоков просто свойство display: flex.

    Клик
  • Как лучше интегрировать верстку Landing Page на Modx?

    HelenStar
    @HelenStar Автор вопроса
    Спасибо большое за развернутый ответ!

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

    Например, в одном экране есть 7 элементов (картинка + ссылка), к ним идет 7 описаний соответственно, и все описания открываются в модальных окнах, текста на каждое описание по объему как на целую страницу. Сами элементы экрана (картинка + ссылка на окно) я сделала через доп. поля для главной страницы (1 элемент - 1 доп. поле Migx), чтобы клиент мог в два клика эти элементы добавлять. Также у меня сделаны модальные окна с описаниями - 1 окно - 1 доп. поле, чтобы клиент мог также в два клика создать целое окно с контентом по шаблону из чанка. И все бы хорошо, но при загрузке страницы (если шаблоны окон в чанках, а доп. поля сделаны для главной страницы) в нее генерируются также все окна (а их с таким большим контентом 12, и будут потом клиентом еще добавляться). Также через доп поля сделала слайды для слайдеров (там слайды с контентом, не с картинками). И все это, конечно, влияет на загрузку страницы. Поэтому я и задалась вопросом насчет того, как их лучше выводить, потому что прежде не приходилось делать ленды на модексе, да еще и с контентом в модалках вместо отдельных страниц (что на мой взгляд совсем неудобно).

    ClientConfig приглянулся чисто удобством для км, который будет менять информацию на сайте, и потому что в самих экранах (не окнах) менять по сути то нечего, картинка и текст. Но вы правы, в этом случае и через доп. поля Migx можно, тут генерировать нечего и вложенности в чанках никакой нет, можно даже не создавать чанки-шаблоны для полей, а просто сам код вставлять при вызове.
    Если не задействовать ClientConfig, тогда повторяющиеся элементы (а их всего 2 - телефоны и адрес) можно также через доп. поля сделать. Нет смысла использовать его только ради двух элементов. Есть смысл только, если вместо доп. полей использовать его для редактирования всего контента в экранах. Но, если с ним неудобнее в плане реализации, то тогда фиг с ним. Времени лишнего на лишние действия тоже, увы, нет. А в него сейчас все упирается.

    Все поп-апы можно вызывать аяксом, что бы они не грузили страницу (куча готовых библиотек).

    Можете что-то конкретное посоветовать? Желательно то, с чем просто и быстро разобраться (сейчас просто времени нет).

    А если убрать все модалки в ресурсы и вызывать их через pdoResource или pdoPage?
    Также же знаю, что с помощью Fancybox можно выводить содержимое ресурсов в модальные окна. Но не с Fancybox у меня что-то не получилось вывести в том виде, в котором нужно.
  • Как сделать выполнение скрипта только при определенном разрешении?

    HelenStar
    @HelenStar Автор вопроса
    Ankhena, в общем, пробовала разные способы. Этот помог, но не так, как надо:

    $(window).resize(function() {
      if(document.documentElement.clientWidth < 451) {
        $(('a[name=link]')).on('click', function() {
                $('.main-nav').fadeOut();
                $('.overlay-3').fadeOut();
        });
      }
      else {
         if(document.documentElement.clientWidth > 451) {
                $('.main-nav').css('display','block');
         } 
      }
    });


    В общем, при ресайзе удается свернутое меню вернуть обратно через display: block, но при клике, не смотря на то, что разрешение экрана уже больше 450, меню при клике все равно скрывается.

    jsfiddle что-то недоступен пока.(
  • Как сделать отображение модального окна посередине видимой области экрана?

    HelenStar
    @HelenStar Автор вопроса
    Stalker_RED, спасибо. Обычно на него и вешаю. Сейчас просто подумала, что может на картинку придется повесить клик, но наверное не стану. Все равно под ней ссылка идет.
    А как тогда лучше делать навигацию по секциям в ленде, если используются якори? У меня был сайт один на редактировании, там было так:
    <section 1>
    <a name="1></a>
    ................
    </section>

    Я так понимаю, раз name уже устарел, то вместо таких якорей лучше просто вешать нужный id на section (ну или любой другой родительский блок для секции)? Собственно, так я, правило, всегда так и поступаю - просто переход по id. Но сейчас задумалась, как сделать в этот раз лучше.
  • Как сделать отображение модального окна посередине видимой области экрана?

    HelenStar
    @HelenStar Автор вопроса
    Stalker_RED, х - это еще с экспериментов она осталась. Я пробовала через offset () вычислить координаты кнопки, по которой был клик, и присвоить их с нужным позиционированием моему окну модальному. Но это геморно вышло. Переменная х оттуда осталась, забыла стереть. Из этого экспериментального скрипта мне все равно нужна только строчка $(id).css('top', window.scrollY + 50 + 'px'), остальное все тоже останется.

    The name attribute is not supported in HTML5. Use the...

    Спасибо. Не знала об этом. Хотя валидатор на этот атрибут у меня никогда не ругался. Тогда через клик по классу или onclick лучше сделать?
  • Как сделать отображение модального окна посередине видимой области экрана?

    HelenStar
    @HelenStar Автор вопроса
    Все. Разобралась, как сделать для своего примера. Как-то так:

    $(document).ready(function() {   
        $(('a[name=modal]')).click(function(e) {
        e.preventDefault();
        var id = $(this).attr('href');
        var x = $(this).offset();
        $(id).fadeIn(100);
        $(id).css('top', window.scrollY + 50 + 'px');
        }); 
    })


    jsfiddle.net
  • Как сделать отображение модального окна посередине видимой области экрана?

    HelenStar
    @HelenStar Автор вопроса
    Спасибо огромное! Вы меня спасли! А если на jquery? Надо, чтобы применялось ко всем окнам с классом modal и собственным id, вызываемым по a[name=modal] (то, что выше написала).
  • Как сделать выполнение скрипта только при определенном разрешении?

    HelenStar
    @HelenStar Автор вопроса
    Ankhena, сейчас по новой все буду пробовать и выложу все результаты, если снова не получится. А так не сохранила ничего.
  • Как сделать выполнение скрипта только при определенном разрешении?

    HelenStar
    @HelenStar Автор вопроса
    mrxakerrus, спасибо за развернутый ответ. Попробую. Через checkbox не хотелось бы. Есть еще идея вынести скрипт к меню в отдельный файл, а уж его подключать через скрипт в head только на разрешениях меньше 450 px, потому что все, что с ресайзом и прописыванием условий для разрешений не работает при возвращении к исходному размеру экрана хоть через поворот экрана на смартфоне, хоть через ресайз окна браузера.

    Через дописывание свойства или класса с display: none меню при клике по ссылке тоже пробовала. Также обратно не возвращается на свои места после ресайза. Так то само скрытие отлично работает, но не получается сделать его рабочим только и только при этом разрешении и никак иначе.
  • Как сделать выполнение скрипта только при определенном разрешении?

    HelenStar
    @HelenStar Автор вопроса
    Пробовала. При повороте экрана так и не возвращается на место меню. Исчезает и дальше только перезагружать страницу.
  • Как правильно интегрировать верстку главной страницы сайта типа landing page в cmf modx revolution?

    HelenStar
    @HelenStar
    Sanes, согласна, что лучше заливать на хостинг в обычном html, или можно, как часто встречаю, сделать на yii, но такая же ситуация, и клиент тоже просит, чтобы редактировать прям каждый элемент через админку, как в редакторе. Так что тоже задалась теперь таким же вопросом, как автор поста.
  • Как натянуть Landing Page на MODx?

    HelenStar
    @HelenStar
    А если совместить вариант с ClientConfig для статичных элементов в секциях, типа текста и картинок, а добавляемые элементы организовать через поля MigX?

    И как лучше выводить в таком случае модальные окна, если каждое из них содержит контент на целую страницу сайта? Создавать каждое окно с общим для окон шаблоном с TV в ресурсах и вызывать в шаблоне главной через getResource? Или по ссылке при клике.