Чистый CSS использует единицы измерения окна просмотра vw и vh для отзывчивости.

CSS

Примечание редактора: в мобильном терминале rem используется для изменения относительно корневого HTML. После периода JS мобильный терминал становится адаптивным. В этой статье для самоадаптации используются чистые блоки окна просмотра CSS, хотя текущая совместимость не Это можно принять, но это не мешает вам осознать силу vw и vh.

Реализация адаптивного макета зависит от медиазапросов.Выбор ширины и размера основных устройств в качестве контрольных точек для написания дополнительных стилей для адаптации, но это будет более проблематично, и его можно использовать только на нескольких выбранных основных размерах устройств.Идеально подходит ниже.

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

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

Распознавать единицы просмотра

Во-первых, нам нужно понять, что такое окно просмотра.

В отрасли очень уважаемой теорией является объяснение области просмотра, предложенное Питером-Полем Кохом (называемым «Богом PPK» в реках и озерах). браузер на десктопной стороне; на мобильной стороне все сложнее, он включает в себя три окна просмотра, а именно:Окно просмотра макета,Визуальное окно просмотра,Ideal Viewport

«Вьюпорт» в блоке вьюпорта на десктопной стороне, несомненно, относится к видимой области браузера, но на мобильной стороне он относится к трем вьюпортам.Layout Viewport.

согласно сcss спецификация, единица области просмотра в основном включает следующие 4 элемента:

  • vw: 1vw равно 1% ширины области просмотра
  • vh: 1vh равен 1% высоты области просмотра
  • vmin: выберите vw и vh наименьшее из
  • vmax: выберите наибольшее из vw и vh

Единица области просмотра отличается от единицы %, единица измерения области просмотраЗависит от размера области просмотра, который определяется как процент от размера области просмотра; единица измерения % зависит от предков элемента.

Измеряется в единицах области просмотра, ширина области просмотра составляет 100vw, а высота — 100vh (левая сторона в книжной ориентации, правая — в альбомной).

Например, если размер области просмотра настольного браузера составляет 650 пикселей, то 1vw = 650 * 1% = 6,5 пикселей (это теоретический расчет, если браузер не поддерживает 0,5 пикселей, фактический результат рендеринга может быть 7 пикселей).

совместимость

Как показано на фиг.1, известно, что есть совместимость: мобильная сторона поддерживает ios8 выше, Android 4.4 и выше, а также идеальная поддержка полнобуквенного микроядра x5.

Скриншот изCan I Use

Используйте единицы области просмотра, чтобы соответствовать размеру страницы

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

Что касается основного адаптивного макета и гибкого макета, макет, реализованный Media Queries, требует настройки нескольких адаптивных точек останова, и этот опыт также очень неудобен для пользователей: макет поддерживается с разрешением в пределах диапазона адаптивных точек останова. остается неизменным, но в момент реакции на переключение точки останова раскладка вызывает сбоеподобное изменение, подобно тому, как кассетный проигрыватель «щелкает» снова и снова.

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

Есть ли способ решить такую ​​проблему?

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

Практика 1: Используйте только vw в качестве модуля css

В соответствии с практикой использования только vw в качестве единственной единицы CSS мы придерживаемся:

  1. Для преобразования размера эскиза проекта в единицы vw мы используем функцию Sass для компиляции
// iPhone 6 尺寸作为设计稿基准
$vw_base: 375px;
@function vw($px) {
    @return ($px / $vw_base) * 100vw;
}
  1. Используйте vw в качестве единицы CSS как для текста, так и для ширины макета, интервалов и т. д.
.mod_nav {
    background-color: #fff;
    &_list {
        display: flex;
        padding: vw(15) vw(10) vw(10); // 内间距
        &_item {
            flex: 1;
            text-align: center;
            font-size: vw(10); // 字体大小
            &_logo {
                display: block;
                margin: 0 auto;
                width: vw(40); // 宽度
                height: vw(40); //高度
                img {
                    display: block;
                    margin: 0 auto;
                    max-width: 100%;
                }
            }
            &_name {
                margin-top: vm(2);
            }
        }
    }
}
  1. Линия физического пикселя в 1 пиксель (то есть 1 пиксель на обычном экране и 0,5 пикселя на экране с высоким разрешением) реализована с использованием шкалы атрибута преобразования.
.mod_grid {
    position: relative;
    &::after {
        // 实现1px的下边框线
        content: '';
        position: absolute;
        z-index: 1;
        pointer-events: none;
        background-color: #ddd;
        height: 1px;
        left: 0;
        right: 0;
        top: 0;
        @media only screen and ()
    }
}
  1. Для графиков, которые должны поддерживать соотношение сторон, вместо этого следует использовать padding-top.
.mod_banner {
    position: relative;
    padding-top: percentage(100/700); // 使用padding-top
    height: 0;
    overflow: hidden;
    img {
        width: 100%;
        height: auto;
        position: absolute;
        left: 0;
        top: 0;
    }
}

Исходя из этого, мы можем добиться эффекта страницы общего макета следующим образом:

Адрес опытакликните сюда

Практика 2: с vw и rem компоновка более оптимизирована

Хотя такая страница выглядит хорошо, вы обнаружите, что, поскольку она использует единицы области просмотра для достижения макета, она автоматически масштабируется в зависимости от размера области просмотра.Независимо от того, слишком велика или слишком мала область просмотра, она также масштабируется вместе с областью просмотра. Если он слишком велик или слишком мал, он теряет ограничение максимальной и минимальной ширины.

Конечно, вас не волнует такой маленький недружественный пользовательский опыт, но давайте попробуем исправить такой маленький недостаток.

Итак, я думаю, что лучше объединить блок rem для реализации макета? Суть rem elastic layout заключается в динамическом изменении размера корневого элемента, после чего мы можем пройти:

  1. Установите размер корневого элемента в блоках VW, которые изменяются с помощью просмотра, чтобы он мог динамически изменить его размер.
  2. Ограничьте максимальный и минимальный размер шрифта корневого элемента, с телом плюс максимальная ширина и минимальная ширина

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

// rem 单位换算: 定位75px 只是方便运算, 750-75px、 640-64px、 1080-108px, 如此类推
$vw_fontsize: 75; // iPhone6 尺寸的根元素大于基准值
@function rem($px) {
    @return ($px / $vm_fontsize) * 1rem;
}
// 根元素大小使用vw单位
html {
    font-size: ($vm_fontsize / ($vm_design / 2)) * 100vw;
    // 同时,通过Media Queries 限制根元素最大值,最小值
    @media screen and (max-width: 320px) {
        font-size: 64px;
    }
    @media screen and (min-width:540px) {
        font-size: 108px;
    }
}

// body 也增加最大最小宽度限制,避免默认100%宽度的block元素跟随body而过大过小
body {
    max-width: 540px;
    min-width: 320px;
}

Скриншоты здесь не приводятся, но вы можетеЩелкните здесь для онлайн-адресаопыт.

резюме

По сравнению с первым методом я лично предпочитаю второй метод по следующим двум причинам:

Во-первых, на практике 2 визуальный опыт пользователя относительно лучше, а ограничения максимальной и минимальной ширины увеличены;

Во-вторых, что более важно, если в качестве метода адаптации страниц для разработки проекта выбран основной метод гибкой верстки rem, то второй метод больше подходит для перехода от модулей rem к модулям vw в более поздних проектах. Просто изменив метод расчета размера корневого элемента, вы можете плавно перейти к другому блоку CSS без какой-либо другой обработки, не говоря уже о том, что использование блока vw неизбежно станет лучшим методом адаптации. В настоящее время он широко не используется. из-за поддержки совместимости.

послесловие

Это я случайно прочитал[Перевод] Настоящая плавная типографика с VH и VWМысли и результаты, полученные из этой статьи, я также надеюсь, что эта статья также вдохновит читателей и предложит несколько советов по использованию устройств vw для общения~:)

Эта статья воспроизводится. Оригинал: Bump LabBump.IO/notes/2017/…