Выпадающее меню выбора TinyMCE отображается за кадром
Это проблема в Firefox и IE до сих пор, что я тестировал; проблема не существует в Chrome.
Я включаю два редактора TinyMCE на странице с одним частично за экраном, чтобы начать. Когда я выбираю вариант раскрывающегося списка color picker
на панели инструментов на первом экземпляре TinyMCE, выпадающее меню появляется там, где должно быть. Но если я прокручу вниз и выберите раскрывающийся список color picker
во втором экземпляре, это выпадающее меню появится ниже редактора и, как правило, на странице.
Вы можете увидеть это в действии здесь: http://jsfiddle.net/nm6wtca3/
Не удаляя CSS html, body
, что я могу сделать, чтобы выбор цвета всегда отображался в правильном положении?
Я проследил проблему до установки CSS в элементах html, body
.
html, body {
width: 100%;
height: 100%;
overflow-x: hidden;
}
В раскрывающемся div применяется CSS, который автоматически вычисляется TinyMCE. Это выглядит примерно так:
z-index: 65535;
left: 641.467px;
top: 633px;
width: 162px;
height: 105px;
Как это выглядит в FF (иногда хуже):
![How it appears in FF]()
Как он появляется в Chrome (как он должен выглядеть):
![How it appears in Chrome (how it should look)]()
Ответы
Ответ 1
Вы сказали, что не хотите удалять CSS из html,body
, но вы ничего не сказали о добавлении к нему! Это решение основано на предположении, что вы можете добавить к html,body
Решение
html, body {
width: 100%;
height: 100%;
overflow-x: hidden;
position: relative; /* Line added */
}
Пример JSFiddle
Надеюсь, это поможет. Во всей реальности вам действительно нужно применить position: relative;
к телу, например, body { position: relative; }
Ответ 2
Я не очень хорошо знаком с tinymce colorpicker, но я вижу эту проблему, и я могу надежно воспроизвести ее: ваша проблема возникает, когда у вас есть сборщик, а затем вы прокручиваете. Я могу воспроизвести это и в хроме. Здесь видео.
Когда я смотрю на DOM, я вижу, что tinyMCE создал два элемента с абсолютным расположением в конце document.body, по одному для каждого сборщика. Когда вы его открываете, их позиция обновляется, чтобы отображать местоположение кнопки панели инструментов в момент ее щелчка, но она никогда не обновляется при прокрутке!
Итак, как это решить? Ну, есть несколько возможностей:
Вариант 1: похоже, что tinyMCE предоставляет метод привязки элемента управления к событию (здесь). При этом вы можете связать обратный вызов с "прокруткой", который переустанавливает поле...
Да, теперь, когда я думаю об этом, вы можете просто закрыть любых открытых colorpickers всякий раз, когда пользователь прокручивает... kinda чувствует себя как копия, но там нет отрицания, что у него есть лучший R.O.I.;) Мы будем называть это Вариантом 2!
Вариант 3: в зависимости от реализации colorpicker вы можете переопределить, где в DOM эти divs будут отображаться. Метод API, который я видел, выглядел наиболее перспективным, здесь. Когда у вас есть div внутри родителя с относительным позиционированием, вам также придется сделать алгоритм позиционирования colorpicker достаточно умным, чтобы выглядеть в нужном месте для смещения x и y... когда я пробовал это, просто перемещая элемент и затирая в некоторых css вручную в chrome-console, алгоритм все еще вычислял смещения x и y на основе doc.body, поэтому в зависимости от того, где вы были прокручены во время щелчка, все было бы не в положении
Похоже, эта проблема может беспокоить и других людей... Возможно, они нашли решение, но ничего не сообщили об этом?
Надеюсь, вам будет достаточно информации, чтобы решить проблему... Сообщите мне, если у вас есть вопросы!
Ответ 3
Похоже, проблема вызвана overflow-x: hidden;
Это может быть не тот ответ, который вы хотите, но удаление этого или перенос его на обертку страницы решит вашу проблему.
Рабочий пример
html, body {
width: 100%;
height: 100%;
padding:0;
margin:0;
}
#pagewrapper{
overflow-x: hidden;
}
Другим вариантом будет принудительное перемещение по прокрутке, но, честно говоря, это перебор... Я настоятельно рекомендую исправлять CSS вместо этого.
Другой рабочий пример
$('body').scroll(posfix); // when the body scrolls
$('#mceu_10').click(posfix); // when you click the top font color button
$('#mceu_35').click(posfix); // when you click the bottom font color button
function posfix() {
setTimeout(function () { // hack way to ensure it fires after the menu is shown
$('#mceu_51').css({
top: $('#mceu_10').offset().top + $('#mceu_10').height(), // set top/left based on button position
left: $('#mceu_10').offset().left + $('#mceu_10').width() / 2
});
$('#mceu_52').css({
top: $('#mceu_35').offset().top + $('#mceu_35').height(),
left: $('#mceu_35').offset().left + $('#mceu_35').width() / 2
});
}, 1);
}
Ответ 4
он работает на firefox и отлично работает в Internet Explorer
![it works on firefox, and Internet Explorer fine]()
просто удалите этот код css
html, body {
width: 100%;
height: 100%;
overflow-x: hidden;
}
Ответ 5
Пожалуйста, взгляните на это:
html,
body {
width: auto;
height: auto;
overflow-x: hidden;
}
Вы можете просто установить ширину и высоту тела на auto
, тогда не будет необходимости использовать позицию, и вам не нужно ничего удалять. Я думаю, вам не нужно использовать height: 100%
, поскольку он будет автоматически вычисляться TinyMCE. я надеюсь, что это помогло.
Обновление
![Error Screen]()
Посмотрите на снимок экрана с хрома и его же в firefox. И я не удалял какой-либо css, а просто изменил... и поставив 100% в css, результат будет таким: -
![Auto Width]()
Пожалуйста, проверьте это с авто, но не на 100%.. спасибо