Javascript-форум (https://javascript.ru/forum/)
-   Opera, Safari и др. (https://javascript.ru/forum/css-html-browser/)
-   -   Хром игнорирует обязательность скроллов (https://javascript.ru/forum/css-html-browser/13324-khrom-ignoriruet-obyazatelnost-skrollov.html)

Snipe 26.11.2010 01:41

Хром игнорирует обязательность скроллов
 
Две похожие проблемы, в обоих случаях хром игнорирует параметры, указывающие на обязательность скроллов.

Первый случай, мне нужно померить ширину стандартного скролла браузера (в разных ОС и браузерах эта величина разная!).
var scrW = = (OS.isLinux)? 15: 17; //хак как раз для хрома
var div = document.createElement('div');
    div.setAttribute('style', 'position:absolute; top:-20px; left: -20px; overflow:scroll; background:white');
    document.body.appendChild(div);

    if (div.offsetWidth > 9 && div.offsetWidth < 50) //хак для хрома и старых версий ие
        scrW  = div.offsetWidth;


Как мы видим, у дива используется overflow:scroll, однако див в Хроме создается без скролла.


Второй случай с iframe'ом
У ифрейма есть атрибут scrolling="YES"
Однако если загружаемая страница полностью помещается в iframe, Хром не отображает скролл, несмотря на указанный атрибут.



Кто-нибудь сталкивался с подобными проблемами? Если да, то как решали? Если нет, то какие есть соображения?

Маэстро 26.11.2010 13:06

Не совсем понятно зачем Вам обязательное присутствие скроллера (даже когда он не нужен), но подозреваю, что для однозначного определения размеров внутренней межскрольной области, поэтому:

Цитата:

Сообщение от Snipe (Сообщение 80783)
Как мы видим, у дива используется overflow:scroll, однако див в Хроме создается без скролла.

Некоторые броузеры в некоторых случаях не отображают графический элемент (например, DIV) если в нём нет никакого текста, или отсутствует заданный цвет фона. То есть, надо в него вставить хотя бы 1 пробел. Причём не обычный, а "неразрывный" - это &nbsp; или в UTF-8 код 0A.
Иногда, чтобы быть железно уверенным, что ничто не подпортит результат я ставлю стиль font-size:0px

И не делайте div.setAttribute('style', '...') - в IE с этим проблемы
делайте div.style.cssText = '...'
Цитата:

Сообщение от Snipe (Сообщение 80783)
У ифрейма есть атрибут scrolling="YES"
Однако если загружаемая страница полностью помещается в iframe, Хром не отображает скролл, несмотря на указанный атрибут.

первый вариант:
убираете в фрейме скроллер, вставляете в фрейм DIV со скроллерами, а в этот DIV свою информацию.
<iframe scrolling="NO" src="..." ></iframe>
 
<div style="width:100%; height:100%; overflow:scroll">
данные фрейма...
</div>


второй вариант:
ставите в тело фрейма абсолютно позиционированный DIV с размерами, превышающими на 1 px размеры фрейма.
<iframe scrolling="YES" src="..." style="width:100px; height:100px"></iframe>
 
 
<div style="position:absolute; width:101px;  height:101px">&nbsp;</div>


Возможно, Вам также потребуется обнулить во фрейме margin и border.

Snipe 26.11.2010 14:52

Цитата:

Сообщение от Маэстро (Сообщение 80848)
Некоторые броузеры в некоторых случаях не отображают графический элемент (например, DIV) если в нём нет никакого текста, или отсутствует заданный цвет фона. То есть, надо в него вставить хотя бы 1 пробел. Причём не обычный, а "неразрывный" - это &nbsp; или в UTF-8 код 0A.
Иногда, чтобы быть железно уверенным, что ничто не подпортит результат я ставлю стиль font-size:0px

И не делайте div.setAttribute('style', '...') - в IE с этим проблемы
делайте div.style.cssText = '...'

Сделал:
scrW = (panel.OS.isLinux)? 15: 17;
    var div = document.createElement('div');
    div.innerHTML = '&nbsp;'
    var styles = 'position:absolute; top:-20px; left: -20px; overflow:scroll; background:white;font-size:0';
    if (isIE)
        div.style.cssText = styles;
    else
        div.setAttribute('style', styles);
    document.body.appendChild(div);
    alert(div.offsetWidth+' - '+scrW );
    if (div.offsetWidth > 9)
       scrW  = div.offsetWidth;

Теперь вместо "0" Хром пишет "1". =\
Ну и старые версии IE вместо четырехзначного числа пишут 1.

Цитата:

первый вариант:
убираете в фрейме скроллер, вставляете в фрейм DIV со скроллерами, а в этот DIV свою информацию.

второй вариант:
ставите в тело фрейма абсолютно позиционированный DIV с размерами, превышающими на 1 px размеры фрейма.

Возможно, Вам также потребуется обнулить во фрейме margin и border.
Не имею доступа к ифрейму.

Маэстро 26.11.2010 15:42

Цитата:

Сообщение от Snipe (Сообщение 80783)
мне нужно померить ширину стандартного скролла браузера

Вы так и не сказали, для чего нужно мерять ширину скрола.
Если это нужно, чтобы потом вычислить ширину внутренней области, то есть такой способ:
вставляете DIV
<div id="widthtest" style="width:100%">&nbsp;</div>

затем меряете его ширину:
alert(document.getElementById('widthtest').offsetWidth);

-эта ширина и будет шириной внутренней области, и будет меняться в зависимости от того есть скроллер, или нет.
Но если уж очень надо знать ширину скроллера, то потом можете из ширины родителя этого DIV_a (window,body,...) вычесть offsetWidth этого DIV_a.

Snipe 26.11.2010 16:08

у меня над ифреймом рисуется плашка, которая не должна заезжать на скролл, но должна быть впритык к нему.
Задачу по вычислению ширины скролла уже решил. Просто создал в html див с текстом у которого померил ширину скролла. Не красиво, зато работает.

А вот задача со скроллом в ифрейме пока под вопросом.

Маэстро 26.11.2010 16:31

Цитата:

Сообщение от Snipe (Сообщение 80884)
у меня над ифреймом рисуется плашка, которая не должна заезжать на скролл, но должна быть впритык к нему

это надо видеть... ;))
p.s. что такое плашка?

Snipe 26.11.2010 16:48

Цитата:

Сообщение от Маэстро (Сообщение 80889)
это надо видеть... ;))
p.s. что такое плашка?

Ну панелька, див, как угодно. Как доделаю, покажу - все поймете. )


Часовой пояс GMT +3, время: 05:30.