2016-01-08 10 views
11

Цель:

я работаю на код, подобный этому, чтобы создать компонент, где поле ввода имеет встроенную кнопку:субпикселей, вычисляется и оказывается по-разному в разных браузерах

http://codepen.io/anon/pen/pgwbWG?editors=110

Как вы можете видеть, кнопка расположена абсолютно с top и bottom установлена ​​на 0, для достижения элемента высоты 100%.

Кроме того, следует отметить, что граница ввода текста должна оставаться видимой, а также обернуть кнопки. Для этого я добавил margin: 1px в кнопку так, чтобы было (должно быть) пространство для отображения окружающего текста текстовый ввод красная рамка (обычно, когда содержимое поля ввода недействительно).

Проблема:

является то, что на Firefox это (в основном) оказывается правильно, в то время как на Chrome (и, видимо, по новейшим Safari) он будет иметь 1px разрыв в нижней части кнопки ,

CSS выглядит нормально, но, похоже, это проблема вычисления/округления в рендеринге, где нижнее или верхнее поле кнопки на самом деле не 1px (можно увидеть, как он проверяет элемент). И, как кажется, влияние на вход влияет.

На разных трансфокации-ставок будет добавить или удалить 1px маржи в верхней или нижней части кнопки, в результате чего 1px зазор или в покрытом-граница.

Как я установил кнопку маржу 0px то нижнее поле фиксируется, но я освобождаю запас 1px сверху, отделка, чтобы покрыть красную границу ввода текста.

Примеры:

Вероятно, я не ясно, или слишком многословен в объяснении его, так вот некоторые скриншоты ошибки, из разных зумирований на Chrome (обратите внимание на CSS всегда одинаков):

enter image description here enter image description here enter image description here enter image description here

решение:

Я не смог найти кросс-браузерное решение . Как с этим справиться и получить согласованный компонент? (без Javascript пожалуйста)

+0

Можно ли установить границу на обертке? – vals

+0

На самом деле нет, потому что стиль (границы и другие правила) зависят от: действительного состояния, поступающего из API проверки подлинности браузера и выполняемого на содержащем * входе *. И пока не существует родительского селектора CSS4 ('' '' '' '), я не могу создать оболочку. Также мне интересно узнать, как справляться с субпикселем также в других случаях. – Kamafeather

ответ

5

Как вы уже знаете, проблема возникает из другого подхода к субпикселному исчислению между браузерами

В Chrome, например, границы могут иметь дробный размер, но поля обрабатываются разные (как целые числа).

У меня нет документов об этом от команды Chrome, но это то, что можно увидеть в Дев инструментов:

dev tools capture

AFAIK, не существует способа, чтобы изменить это.

Вместо этого вы можете перенести использование поля в кнопку на границу.

Поскольку вам нужно получить место для 1px границы ввода, сделайте то же самое в кнопке, установите границу 1px (вместо поля) и установите ее прозрачно.

Оставшаяся Хитрость заключается в том, чтобы установить свойство фона-клип для заполнения поля, так что эта прозрачность не влияют на фоне

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

Поскольку мы используем кнопку границы, чтобы получить размер в порядке, мы можем использовать границу, используя вместо этого вставку.

* { 
 
    margin: 0; padding: 0; box-sizing: border-box; 
 
} 
 
button, input, wrapper { 
 
    display: inline-block; border-radius: 3px; 
 
} 
 

 
.wrapper { 
 
    position: relative; 
 
    
 
    width: 60%; 
 
    margin: 1em; 
 
    background-color: #ccc; 
 
} 
 

 
input { 
 
    border: 1px solid red; 
 
    width: 100%; 
 
    
 
    background-color: limegreen; 
 
    line-height: 3em; 
 
/* padding: 0.75em; */ 
 
    padding: 10px; 
 
} 
 

 
button { 
 
    position: absolute; 
 
    right: 0; 
 
    top: 0; 
 
    bottom: 0; 
 
    border: 1px solid transparent; 
 
    width: 7em; 
 
    margin: 0px; 
 
    background-clip: padding-box; 
 
    box-shadow: inset 0px 0px 0px 2px black; 
 
}
<div class="wrapper"> 
 
    <input type="text"> 
 
    <button>Test</button> 
 
</div>

Другой пример, где кнопка имеет границы. Но нам нужна обертка вокруг, чтобы получить размеры в порядке.

* { 
 
    margin: 0; padding: 0; box-sizing: border-box; 
 
} 
 
button, input, wrapper { 
 
    display: inline-block; border-radius: 3px; 
 
} 
 

 
.wrapper { 
 
    position: relative; 
 
    
 
    width: 60%; 
 
    margin: 1em; 
 
    background-color: #ccc; 
 
} 
 

 
input { 
 
    border: 1px solid red; 
 
    width: 100%; 
 
    
 
    background-color: limegreen; 
 
    line-height: 3em; 
 
/* padding: 0.75em; */ 
 
    padding: 10px; 
 
} 
 

 
.buttonwrap { 
 
    position: absolute; 
 
    right: 0; 
 
    top: 0; 
 
    bottom: 0; 
 
    border: 1px solid transparent; 
 
    width: 7em; 
 
    margin: 0px; 
 
    background-clip: padding-box; 
 
} 
 
button { 
 
    position: absolute; 
 
    right: 0px; 
 
    top: 0; 
 
    bottom: 0; 
 
    width: 100%; 
 
    border: 2px solid blue; 
 
    margin: 0px; 
 
}
<div class="wrapper"> 
 
    <input type="text"> 
 
    <div class="buttonwrap"> 
 
     <button>Test</button> 
 
    </div> 
 
</div>

+0

Спасибо за предложения! Я думал о том, чтобы играть с ** границей **, но, к сожалению, это уже используется для стилизации (извините за то, что я не понял этого). В любом случае интересно узнать, что вычисления дробей и целых чисел обрабатываются по-разному для ** border ** и ** margin ** (у вас есть ссылка на это?). Кроме того, к сожалению, работая с вашим фрагментом на Chrome 47, он все еще имеет нижнее нежелательное расстояние между пикселями. – Kamafeather

+0

OMG! Есть и другая ошибка. Я изменил фрагменты, чтобы решить эту проблему (дополнение). И я добавил два способа получить стиль кнопки. – vals

+0

Да, я также обнаружил, что заполнение создавало половину проблем; изменение этого на * px * очень помогло. Хорошее обходное решение для использования границы '' 'box-shadow''' (даже если я наследую стиль границы кнопки из SASS mixin и пытаюсь не указывать его, но я предполагаю, что этот случай должен быть исключение). Btw было бы замечательно, если бы вы могли ссылаться на статью/ссылку/ссылку с объяснением разницы в ** ** ** и ** margin ** вычислении (я не могу найти); в основном для будущего и ссылки на сообщества. Однако спасибо за решение, и наслаждайтесь своей щедростью :) – Kamafeather

1

Используйте http://autoprefixer.github.io/, чтобы получить поддержку кросс-браузер, что нужно для отображения: сгибать;

button, input, wrapper { 
    display: inline-block; <----- Remove "display: inline-block;" 
    border-radius: 3px; 
} 

.wrapper { 
    position: relative; 
    display: -webkit-box;<----- Add "display: flex;" 
    display: -webkit-flex;<----- Add "display: flex;" 
    display: -ms-flexbox;<----- Add "display: flex;" 
    display: flex;<----- Add "display: flex;" 
    width: 60%; 
    margin: 1em; 
    background-color: #ccc; 
} 

Внеклассное чтение и изучение материала:

https://css-tricks.com/snippets/css/a-guide-to-flexbox/

http://flexbox.io/#/

https://philipwalton.github.io/solved-by-flexbox/demos/holy-grail/

http://www.sketchingwithcss.com/samplechapter/cheatsheet.html

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

.item { 
    flex: 0 0 300px; 
} 

/* overide for some reason */ 

.item { 
    flex: 1 0 300px; 
} 

/* NOT */ 

.item { 
    flex-grow: 1; 
} 

вам может понадобиться, чтобы сделать более-поездки для ie11:

.ie11std .wrapper { 
    display:table; 
} 

.ie11std .item { 
    display:table-cell; 
} 

хотя это не будет реагировать.

+0

Благодарим вас за все советы Flexbox! Но ответ не ясен; не могли бы вы дать больше информации о том, почему это решило бы мою проблему с рендерингом? – Kamafeather

+0

Кроме того, попытка внесения изменений в мой фрагмент, к сожалению, не улучшает отображение подпикселей. У вас есть рабочий пример, который устраняет нежелательный интервал? – Kamafeather

+0

Можете ли вы создать код? http://codepen.io/pen/ @Kamophather –