Высота TinyMCE 4 и 100% внутри содержа элемент

Я нахожусь в процессе миграции из TinyMCE 3 в 4.

однако я застрял в том, чтобы TinyMCE заполнял свой контейнер высоты 100% (он работает с TinyMCE 3).

обратите внимание на эту скрипку:http://jsfiddle.net/MLJaN/

я использовал CSS ниже, чтобы попытаться установить iframe и всех его родителей на 100% - высоту. Я согласен, что это не выглядит идеальным, но я бы подумал, что это должно работать таким образом.

 body, html, .mce-tinymce, .mce-edit-area.mce-container, iframe, .mce-container-body.mce-stack-layout
 {
     height: 100% !important;
 }

Как вы можете смотрите в live-fiddle, это точно количество пикселей панели инструментов "слишком высокий": т. е. это 34px слишком высокий (высота панели инструментов).

это работает, но он не автоматически изменяет размер с браузером, и он использует calc (), который сейчас поддерживается только на 79%:http://jsfiddle.net/MLJaN/2/

теперь я ищу чистое решение CSS (без функции calc ()), чтобы весь редактор заполнял свой контейнер и был плавно изменяемый.

любые указатели были бы очень признательны.

7 ответов


когда ты молоток, каждая проблема выглядит как гвоздь. Для этого нет необходимости в javascript или jquery, поскольку теги существуют для работы. Все, что нужно, это настроить поле на #mcu_31 для настройки высоты панели инструментов и нижнего колонтитула. Следующие наборы tinymce, чтобы быть отзывчивым в его содержащем элементе.

/*Container, container body, iframe*/
.mce-tinymce, .mce-container-body, #code_ifr {
    min-height: 100% !important;
}
/*Container body*/
.mce-container-body {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
}
/*Editing area*/
.mce-container-body .mce-edit-area {
    position: absolute;
    top: 69px;
    bottom: 37px;
    left: 0;
    right: 0;
}
/*Footer*/
.mce-tinymce .mce-statusbar {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
}

исправлено, потому что TinyMCE изменяет id с добавлениями меню / панели инструментов или удалениями. Это работает независимо от того, что вы с ним делаете.


вместо того, чтобы делать вычисления в CSS, я переместил их в JS. это означает, что высота меню будет автоматически рассчитываться и не должна регулироваться вручную. Это также делает это решение совместимым с любым браузером даже без поддержки css calc ().

function resize() {
    setTimeout(function () {
        // Main container
        var max = $('.mce-tinymce')
              .css('border', 'none')
              .parent().outerHeight();

        // Menubar
        max += -$('.mce-menubar.mce-toolbar').outerHeight(); 

        // Toolbar
        max -= $('.mce-toolbar-grp').outerHeight(); 

        // Random fix lawl - why 1px? no one knows
        max -= 1;

        // Set the new height
        $('.mce-edit-area').height(max);
    }, 200); 
} 

$(window).on('resize', function () { resize(); });

но не верьте мне на слово.

попробуйте на jsBin:http://jsbin.com/dibug/2/edit

для хорошей справки я также создаю суть.


Я решил эту проблему с помощью pure в CSS С помощью flex-коробки.

<style>
  #article, .mce-tinymce,.mce-stack-layout, .mce-edit-area{
    display: flex;
    flex-direction: column;
    flex: 1;
  }
   .mce-tinymce iframe{
    flex: 1;
  }
</style>

таким образом, вам не нужно заботиться о размерах строки меню и других элементов.

JSFiddle демо: https://jsfiddle.net/hk5a53d8/


для тех из вас, кто не использует jQuery, вот чистый код javascript, который работает:

function doresize(){
    var ht = window.innerHeight;
    console.log("ht = " + ht);

    if (document.getElementsByClassName('mce-toolbar-grp')){
        ht += -document.getElementsByClassName('mce-toolbar-grp')[0].offsetHeight;
        ht += -document.getElementsByClassName('mce-toolbar-grp')[0].offsetTop;
        console.log("ht = " + ht);
    }
    if (document.getElementsByClassName('mce-statusbar')){
        ht += -document.getElementsByClassName('mce-statusbar')[0].offsetHeight;
        console.log("ht = " + ht);
    }

    ht += -3; // magic value that changes depending on your html and body margins

    if (document.getElementsByClassName('mce-edit-area')){
        document.getElementsByClassName('mce-edit-area')[0].style.height = ht + "px";
        console.log("ht = " + ht);
    }

}

window.onresize=doresize;
window.onload=doresize;

в угловом фиксируется только это,

@Component({
  selector: 'serta-tinymce',
  template: `<textarea **style="min-height:500px"** id="store-description"></textarea>`,
  styles: []
})

никто не исправил мою проблему так хорошо, как этот. Это комбинация пары ответов сверху.

$(window).on('resize', function () {
    setTimeout(function () {
        var max = $('.mce-tinymce').css('border', 'none').parent().height();
        max -= $('.mce-menubar.mce-toolbar').outerHeight(); 
        max -= $('.mce-toolbar-grp').outerHeight(); 
        max -= $('.mce-edit-area').outerHeight() - $('.mce-edit-area').height();
        $('.mce-edit-area').height(max);
    }, 100); 
});

и добавьте триггер изменения размера в init:

tinymce.init({
    selector: '#tinymce',
    height: "100%",
    branding: false,
    statusbar: false,
    setup: function (ed) {
        ed.on('init', function(args) {
            $(window).trigger('resize');
        });
    }
});

Я в порядке, используя CSS calc для работы. Это сработало для меня:

.mce-tinymce, .mce-edit-area.mce-container, .mce-container-body.mce-stack-layout
{
    height: 100% !important;
}

.mce-edit-area.mce-container {
    height: calc(100% - 88px) !important;
    overflow-y: scroll;
}

Примечание valud из 88px представляет общая высота headerbar и StatusBar.