Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Opera и toFixed()
 
 автор: DJ Paltus   (18.10.2009 в 01:30)   письмо автору
 
 

Что я делаю не так?
Я задаю ширину элемента с помощбю JS:

if (L <= bwidth - 200 && L >= 300) //L - это позиция разделителя, точка отсчета.
    {
    wleft = ((L - 1) / bwidth) * 100; // превращаю пикселы в проценты
    wleft = wleft.toFixed(3); // 3 после запятой. А сколько вообще можно? 
    wright = 100 - wleft; // для правого блока
    d.getElementById ('lefter').style.width = wleft  + '%';
    d.getElementById ('righter').style.width = wright + '%';
    }

И всё выглядит натуралистично в ИЕ, Мозилле и Хроме, но не в Опере.
Тут если я задаю ширину всё же настоящими пикселями (что для поставленной задачи недопустимо), отображается корректно. А с процентами - при перемещении разделителя (мышью) левый блок (id=lefter) "отскакивает" примерно на 1 процент ширины.
Скрипт в работе: http://mumm-36.narod.ru/chru/

Где ошибка, кто подскажет?

  Ответить  
 
 автор: АЯ   (18.10.2009 в 02:48)   письмо автору
 
   для: DJ Paltus   (18.10.2009 в 01:30)
 

Во-первых, второе значение (для ширины правого дива) вы получаете не "с точностью до 3-х знаков".
Разберите пример и, надеюсь, поймёте:
<script>
var pi = Math.PI;
var bad = 10 - pi.toFixed (3);    //Сколько знаков после запятой? Неужели три?
var good = (10 - pi).toFixed (3); //А вот здесь точно ТРИ знака.

//Посмотрите в алерте.
alert (bad + '\n' + good);
</script>


Во-вторых:
>"если я задаю ширину всё же настоящими пикселями (что для поставленной задачи недопустимо)"

Наоборот, для этой задачи задание ширины в процентах является недопустимым.

Вы вполне можете дать ширине значение в процентах с ЛЮБЫМ количеством знаков после запятой.
Но браузер перед отображением всё-равно переводит ваши проценты в пиксели.
Причём правила округления у браузеров разные. У Opera - всегда по типу Math.floor (), т.е. выдаст он на выходе наименьшее целое пикселов для каждого из дивов.
Отсюда вы практически всегда будете "терять" один, а иногда даже два пиксела (в сумме для ширин обоих дивов).

Задача ваша решается в режиме реального времени при движении нажатой мыши.
Т.е. изменение размеров окна по ширине в процессе работы скрипта произойти не может в принципе - нечем пользователю "цепляться" за край окна (или нажимать кнопки "Свернуть/Развернуть"), ведь мышь его занята.
Вам надо вычислить точное значение ширин обоих дивов в пикселах перед началом движения (СУММА), затем получить ЦЕЛОЕ значение ширины для левого дива в пикселах (ЛЕФТЕР), затем отнять этот ЛЕФТЕР от СУММЫ и получить ЦЕЛОЕ значение ширины для правого дива в пикселах.

  Ответить  
 
 автор: DJ Paltus   (18.10.2009 в 03:35)   письмо автору
 
   для: АЯ   (18.10.2009 в 02:48)
 

Когда значение дано в пихелях, при изменении размеров окна браузера получается неприятный эффект - размер дивов же фиксируется, и они радостно разъезжаются. Это если сначала пошевелить сплиттер, а потом подергать окно. Именно поэтому я стал запариваться с процентажом.
Теперь же полагаю просто округлять положение сплиттера до целого процента, специально для разного рода опер... (

  Ответить  
 
 автор: АЯ   (18.10.2009 в 07:47)   письмо автору
 
   для: DJ Paltus   (18.10.2009 в 03:35)
 

>"полагаю просто округлять положение сплиттера до целого процента"

Полагаю, что не поможет.
Пусть получите 30% и 70% - оба целых.
Положим, клиентская ширина окна в пикселях - 1017.
В целых пикселях браузер OPERA получит - 305 и 711.
Складываем и получаем один потерянный пиксель.

Видимо, вам надо делать всё же в пикселях, и дополнительно "вешать" на окно функцию на событие onresize для "подгонки".

  Ответить  
 
 автор: DJ Paltus   (18.10.2009 в 13:20)   письмо автору
 
   для: АЯ   (18.10.2009 в 07:47)
 

>Полагаю, что не поможет.

практика показывает, что помогло. сплиттер двигается мелкими рывками, особенно заметно на широком мониторе, зато ширина всегда остается гибкой.

см.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования