неправильная ширина границ в браузере Android

На устройствах Android с экранами высокой плотности (devicePixelRatio 1,5) границы html-элементов имеют неправильную ширину.

Два поля здесь: пример jsbin, правильно отображаются на рабочем столе.

а вот на андроиде - и в хроме и в браузере стека - они выглядят так:

введите здесь описание изображения

теперь я понимаю, почему они так выглядят, но я не могу найти никакого решения CSS - только js.

решение js состояло бы в том, чтобы изменить ширину и высоту элементов на нечетные, а также свойства top/left.


person memical    schedule 18.11.2013    source источник
comment
setUseWideViewPort - тоже не сработало   -  person memical    schedule 18.11.2013
comment
используйте 0.1em вместо 1px, возможно, это сработает   -  person reza jafari    schedule 18.11.2013
comment
нет, это тоже не работает.   -  person memical    schedule 19.11.2013
comment
Каков ваш ожидаемый результат?   -  person Uooo    schedule 21.11.2013
comment
чтобы все границы были 1px   -  person memical    schedule 25.11.2013
comment
химический, любое решение? Я столкнулся с той же проблемой.   -  person Martin van Haeften    schedule 08.08.2014
comment
мы пошли с границами 2px :)   -  person memical    schedule 11.08.2014


Ответы (4)


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

  • сделать цвет границ слегка прозрачным, т.е. с альфа ‹= 0,5. Например, border-color: rgba(169, 0, 52, 0.5) я тестировал это в браузерах Android 4.4.2 Chrome и Yabrowser. Работает отлично!;
  • сделать ширину/высоту граничного элемента нечетной и сместить позицию элемента. Тут нужно экспериментировать и использовать JS, говоря типа:

    $('div.elemWithBadBorders').each(function(){
        var $el = $(this);
        var width = $el.width();
        if(width % 2 == 0){
            $el.css('width', (width+1)+'px');
        }
    });
    


  • Отключите границы, если они отображаются на дисплеях Retina или других экранах для найма. Вам нужно использовать медиа-запрос в css следующим образом:

     @media (-webkit-min-device-pixel-ratio: 1.5) {
        div.elemWithBadBorders {
            border: none;
        }
     }
    

    где 1.5 — плотность пикселей. На дисплеях Retina отображается как 2

person Yan Pak    schedule 14.07.2016

Похоже, вы хотите применить медиа-запрос на основе соотношения пикселей. Попробуйте следующее чистое решение CSS:

@media only screen and (min--moz-device-pixel-ratio: 1.5),
       only screen and (-webkit-min-device-pixel-ratio: 1.5), 
       only screen and (min-device-pixel-ratio: 1.5),
       only screen and (min-resolution: 1.5dppx),
       only screen and (min-resolution: 240dpi) {
          /* High density screen fixes go here */
       }

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

Надеюсь это поможет!

person Eric Tjossem    schedule 20.11.2013
comment
конечно, но какой css показывал бы границы с 1px. проблема заключалась не в том, чтобы использовать медиа-запросы, а в том, чтобы получить какой-нибудь css, который бы показывал границу в 1px на 1,5 устройствах. - person memical; 26.11.2013

Ответ находится рядом с width=device-width строкой. Удалите его, и я думаю, все будет в порядке.

Теоретически:

Например, вы используете Samsung Galaxy S или S2 с областью просмотра от 480 до 800 пикселей (пиксели css) и параметром devicePixelRatio, равным 1,5. Но ширина устройства 480/1,5 = 320 (высота 800/1,5 = 533).

Затем вы говорите браузеру Samsung Galaxy S «Нарисуй мне 1 пиксель в строке пикселей CSS», затем включается строка width=device-width - ты говоришь ему «Нарисуй мне 1 пиксель в пикселях устройства». И с width=device-width строкой пиксель устройства равен 1,5 пикселям css. И затем вы рисуете строки высотой 1,5 пикселя (например), браузер использует сглаживание для нецелочисленных значений, а затем начинается с нецелочисленных координат. Это означает, что линия высотой 1,5 пикселя от 1,5 пикселя до 3 пикселей по вертикали может быть нарисована как высота 2 пикселя (или высота 1 пиксель).

person Pinal    schedule 26.11.2013
comment
@memical: я написал удалить строку. Я знаю, что это в исходном коде jsbin - person Pinal; 26.11.2013
comment
без ширины устройства страница получает ширину 980 пикселей. пользователю потребуется увеличить масштаб, чтобы просмотреть содержимое. - person memical; 26.11.2013

Используйте <meta name="viewport" content="initial-scale=1.0,width=device-width"> вместо <meta name="viewport" content="width=device-width">

person Alex Guerrero    schedule 27.11.2013
comment
Извините, у меня нет телефона Android с высоким разрешением - person Alex Guerrero; 28.11.2013