- Оригинальный адрес:Common CSS Issues For Front-End Projects
- Оригинальный автор: Ахмад Шадид
- Переводчик: Чор
Краткое резюме: в последние годы рендеринг и взаимодействие между браузерами стали более согласованными. Тем не менее, это не совсем последовательно, и есть много мелочей, которые могут ввести вас в заблуждение. В дополнение к этим проблемам существуют также неопределенности, такие как разные размеры экрана, языковые предпочтения и очевидная человеческая ошибка, и мы обнаружили множество мелких проблем, которые могут привести к ошибкам разработчиков.
При реализации пользовательского интерфейса в браузере лучше всегоСведите к минимуму эти несоответствия и проблемы, чтобы пользовательский интерфейс выглядел предсказуемым. Запоминать все эти различия может быть сложно, поэтому я составил список общих проблем и решений. Используйте его в качестве удобного справочного руководства при работе над новым проектом.
Давайте начнем.
1. Сбросbutton
а такжеinput
элемент фона
При добавлении кнопки сбросьте ее фон, иначе в разных браузерах она будет отображаться по-разному. В примерах ниже показана одна и та же кнопка в Chrome и Safari, соответственно последний будет иметь серый фон по умолчанию.
(Предварительный просмотр большого изображения)
Сброс фона решает проблему:
button {
appearance: none;
background: transparent;
/* 其它样式 */
}
Посмотреть Ахмад Шадид (@shadeed)существуетCodepenкод наКнопки и поля ввода.
2. Overflow: scroll
а такжеauto
Чтобы ограничить высоту элемента и позволить пользователю прокручивать его, добавьтеoverflow: scroll-y
. В Chrome под macOS это выглядит хорошо, но в Chrome для Windows полоса прокрутки присутствует всегда (даже если содержимое короткое). Это потому чтоscroll-y
Будет игнорировать содержимое, всегда показывать полосы прокрутки. а такжеoverflow: auto
Полосы прокрутки отображаются только при необходимости.
Слева: Chrome под MacOS. Справа: Chrome для Windows (Предварительный просмотр большого изображения)
.element {
height: 300px;
overflow-y: auto;
}
Посмотреть Ахмад Шадид (@shadeed)существуетCodepenкод наoverflow-y.
3. Добавитьflex-wrap
Чтобы элемент вел себя как гибкий контейнер, просто добавьтеdisplay: flex
. Однако, если вы не добавитеflex-wrap
, то при уменьшении размера экрана появится горизонтальная полоса прокрутки.
<div class="wrapper">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
.wrapper {
display: flex;
}
.item {
flex: 0 0 120px;
height: 100px;
}
Приведенный выше пример отлично работает на большом экране. На мобильных устройствах в браузере появится горизонтальная полоса прокрутки.
Слева: появляется горизонтальная полоса прокрутки, и элементы не переносятся. Справа: элемент переносится и отображается в две строки. (Предварительный просмотр большого изображения)
Решение простое. Обертка должна оборачивать элементы, когда места не хватает.
.wrapper {
display: flex;
flex-wrap: wrap;
}
Посмотреть Ахмад Шадид (@shadeed)существуетCodepenкод наflex-wrap.
4. Не используйте, когда количество гибких элементов варьируетсяjustify-content: space-between
Нанесите на эластичный контейнерjustify-content: space-between
, он выделяет пространство для элементов так, чтобы они были равноудалены друг от друга. В нашем примере у нас есть 8 элементов карт, что выглядит нормально. Что делать, если по какой-то причине количество элементов равно 7? Элементы во второй строке будут выглядеть иначе, чем в первой строке.
обертка с 8 предметами (Предварительный просмотр большого изображения)
обертка из 7 предметов (Предварительный просмотр большого изображения)
Посмотреть Ахмад Шадид (@shadeed)существуетCodepenкод наflex-wrap.
В этом случае использование CSS Grid будет более подходящим.
5. Длинные слова и ссылки
При просмотре статей на экране мобильного устройства длинное слово или встроенная ссылка могут привести к появлению на странице горизонтальной полосы прокрутки. с помощью CSSword-break
Эту проблему можно предотвратить.
(Предварительный просмотр большого изображения)
.article-content p {
word-break: break-all;
}
(Предварительный просмотр большого изображения)
6. Прозрачный градиент
При добавлении градиента с прозрачными начальной и конечной точками в Safari он становится черным как смоль. Это потому, что Safari не распознает ключевые словаtransparent
. используяrgba(0, 0, 0, 0)
Чтобы заменить его, мы можем добиться желаемого эффекта. Обратите внимание на скриншот ниже:
Верх: Хром 70. Внизу: Сафари 12(Предварительный просмотр большого изображения)
.section-hero {
background: linear-gradient(transparent, #d7e0ef), #527ee0;
/* 其它样式 */
}
следует заменить на:
.section-hero {
background: linear-gradient(rgba(0, 0, 0,0), #d7e0ef), #527ee0;
/* 其它样式 */
}
7. О макете сетки CSSauto-fit
а такжеauto-fill
непонимание разницы
В макете сетки CSSrepeat
Функции для создания адаптивных макетов столбцов без использования медиа-запросов. Для этого вы можете использоватьauto-fill
илиauto-fit
.
.wrapper {
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
}
(Предварительный просмотр большого изображения)
вкратце,auto-fill
расположит их, не увеличивая ширину столбца, аauto-fit
Свернут его ширину до 0, когда есть пустые столбцы. Сара Суаидан писалхорошая статьяобсуждали этот вопрос.
8. Фиксируйте элементы в верхней части экрана, когда высота области просмотра недостаточна.
Что произойдет, если вы привяжете элемент к верхней части экрана, когда область просмотра недостаточно высока? Просто: он займет место на экране и в конечном итоге превратится в небольшую неудобную вертикальную область для навигации пользователей по сайту, что повлияет на их опыт.
@media (min-height: 500px) {
.site-header {
position: sticky;
top: 0;
/* 其它样式 */
}
}
В вышеупомянутом коде мы заставляем браузер исправить верхнюю часть только тогда, когда высота ViewStort равна или больше 500 пикселей.
Еще один важный момент: используйтеposition: sticky
, если не указаноtop
свойство, иначе оно не вступит в силу.
(Предварительный просмотр большого изображения)
Посмотреть Ахмад Шадид (@shadeed)существуетCodepenкод наВертикальные медиа-запросы: фиксированный верх.
9. Настройка для фотографийmax-width
При добавлении изображения определитеmax-width: 100%
, поэтому размер изображения изменится, когда экран станет меньше. В противном случае браузер отобразит горизонтальную полосу прокрутки.
img {
max-width: 100%;
}
10. Используйте определения сетки CSSmain
а такжеaside
элемент
CSS Grid можно использовать для определенияmain
часть иaside
раздел, который отлично подходит для сеток CSS. Проблема в том, что даже еслиaside
пуст, его высота будет такой же, какmain
высоты равны.
Чтобы исправить это, пустьaside
Элемент выравнивается по начальной точке своего родителя, чтобы его высота не увеличивалась.
.wrapper {
display: grid;
grid-template-columns: repeat(12, minmax(0, 1fr));
grid-gap: 20px;
}
// align-self 将会让 aside 元素与其父元素的起点对齐。
aside {
grid-column: 1 / 4;
grid-row: 1;
align-self: start;
}
main {
grid-column: 4 / 13;
}
(Предварительный просмотр большого изображения)
Посмотреть Ахмад Шадид (@shadeed)существуетCodepenкод наглавный и побочный.
11. Добавьте в SVGfill
При использовании SVG, если вы добавите внутри SVGfill
, иногда это может работать не так, как ожидалось. Чтобы это исправить, либо удалите собственный SVGfill
свойство или переопределитьfill: color
.
Например:
.some-icon {
fill: #137cbf;
}
Этот код не будет работать, если SVG имеет встроенную заливку. следует заменить на:
.some-icon path {
fill: #137cbf;
}
12. Используйте псевдоэлементы
Всякий раз, когда мне нравится использовать псевдоэлементы. Псевдоэлементы дают нам возможность создавать поддельные элементы, в основном для украшения, не добавляя их в HTML.
При их использовании разработчики могут забыть сделать следующее:
- Добавить к
content: ""
Атрибуты, - в неопределенном
display
свойства без их установкиwidth
а такжеheight
В приведенном ниже примере у нас есть заголовок, разметка которого является псевдоэлементом. необходимо добавить к элементуcontent: ""
Свойство, но и установить егоdisplay: inline-block
,так чтоwidth
а такжеheight
Работает как положено.
(Предварительный просмотр большого изображения)
13. Использованиеdisplay: inline-block
странный разрыв
набор для двух и более элементовdisplay: inline-block
илиdisplay: inline
, вызовет крошечный зазор между ними. Причина в том, что браузеры интерпретируют элементы как слова, добавляя пробел в один символ между каждым элементом.
В приведенном ниже примере справа от каждого элемента есть8px
, но использоватьdisplay: inline-block
и образовавшиеся небольшие пустоты сделают его12px
, а это не то, что мы хотим.
li:not(:last-child) {
margin-right: 8px;
}
(Предварительный просмотр большого изображения)
Установите его в родительский элементfont-size: 0
Эту проблему можно решить просто.
ul {
font-size: 0;
}
li {
font-size: 16px; /* 应该在这里重新设置字体大小,因为它会从父元素继承 `font-size: 0`。*/
}
(Предварительный просмотр большого изображения)
Посмотреть Ахмад Шадид (@shadeed)существуетCodepenкод наВстроенные блочные пустоты.
14. При назначении элемента метки в поле ввода добавьтеfor="ID"
При использовании элементов формы убедитесь, что всеlabel
Элементам присваивается идентификатор. Это улучшит их доступность, а при нажатии соответствующее поле ввода получит фокус.
<label for="emailAddress">Email address:</label>
<input type="email" id="emailAddress">
(Предварительный просмотр большого изображения)
15. Шрифты для интерактивных HTML-элементов не действуют
При установке шрифта для всего документа шрифт не применяется к таким вещам, какinput
,button
select
а такжеtextarea
на эти элементы. По умолчанию они не наследуют шрифт документа, поскольку браузер применяет к ним системный шрифт.
Чтобы исправить это, установите свойства шрифта напрямую:
input, button, select, textarea {
font-family: your-awesome-font-name;
}
16. Горизонтальная полоса прокрутки
Ширина некоторых элементов может привести к появлению горизонтальной полосы прокрутки.
Самый простой способ найти источник проблемы — использовать схему CSS. Эдди Османи написала удобныйсценарий. Добавьте его в консоль браузера, и отобразятся контуры всех элементов на странице.
[].forEach.call(?("*"), function(a) {
a.style.outline =
"1px solid #" + (~~(Math.random() * (1 << 24))).toString(16);
});
(Предварительный просмотр большого изображения)
17. Сжимайте или растягивайте изображения
При изменении размера изображения с помощью CSS, если соотношение сторон изображения по ширине и высоте непоследовательно, изображение сжимается или растягивается.
Решение простое: используйте CSSobject-fit
. Его функции и установка фонового изображенияbackground-size: cover
аналогичный.
img {
object-fit: cover;
}
(Предварительный просмотр большого изображения)
object-fit
Это не сто попыток. Некоторые изображения должны отображаться без обрезки или изменения размера, а некоторые платформы заставляют пользователей обрезать или загружать изображения определенных размеров. Например, Dribbble указывает размер миниатюры загрузки 800 x 600 пикселей.
18. Дляinput
добавить правильныйtype
дляinput
использовать правильныйtype
. Это улучшит пользовательский опыт на мобильных устройствах и сделает его более доступным для пользователей.
Вот часть HTML:
<form action="">
<p>
<label for="name">Full name</label>
<input type="text" id="name">
</p>
<p>
<label for="email">Email</label>
<input type="email" id="email">
</p>
<p>
<label for="phone">Phone</label>
<input type="tel" id="phone">
</p>
</form>
Когда каждое поле ввода получает фокус отдельно, это выглядит так:
(Предварительный просмотр большого изображения)
19. Мобильный номер в RTL-раскладке
В макете справа налево добавьте что-то вроде+ 972-123555777
, знак плюс будет в конце числа. Чтобы это исправить, направление мобильного номера можно перенаправить.
p {
direction: ltr;
}
(Предварительный просмотр большого изображения)
В заключение
Все проблемы, упомянутые здесь, — это те, с которыми я чаще всего сталкиваюсь в своей работе по фронтенд-разработке. Моя цель — регулярно проверять этот список при разработке веб-проекта.
Часто ли вы сталкиваетесь с проблемами при работе с CSS? Добро пожаловать, чтобы поделиться в области комментариев!