Эти вещи о макете веб-мобильной версии

внешний интерфейс JavaScript CSS

Оригинальный адрес:GitHub.com/hu J IA oh J/ Первоначально…

Макет веб-мобильного терминала очень широк, и есть несколько основных тем:

  • Адаптация мобильного терминала
  • 1px border
  • Базовая компоновка

Эта статья в основном посвящена этим трем темам.

1. Адаптация мобильного терминала

Когда дело доходит до адаптации мобильного терминала, все думают об этомrem,flexible.js, схема, которой мы будем делиться в этой статье,vw + rem

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

что такое вв?

vw — это единица длины, основанная на виде (видовом экране), и четыре единицы, относящиеся к видовому экрану:

  • vw: сокращение для ширины области просмотра, 1vw равно 1% от window.innerWidth.
  • vh: сокращение для высоты области просмотра, 1vh равно 1% от window.innerHeight.
  • vmin: меньшее из текущих vw и vh
  • vmax: большее из текущих vw и vh

Обычная схема адаптации rem (в том числе гибкая) на самом деле предназначена для имитации эффекта vw посредством динамического расчета js.Основная причина использования этой схемы в прошлом заключается в том, что vw имеет определенные проблемы с совместимостью, но на данный момент vw может в основном удовлетворять требованиям для Совместимость

Видно, что поддерживаются Android 4.4 и выше и IOS 8.0 и выше, так что теперь мы можем напрямую использовать vw для мобильной адаптации.

vw + рем схема

1. Установите размер шрифта html на 10vw
html {
    font-size: 10vw;
}
2. Возьмите карту 750ui в качестве примера. В CSS используйте значение длины на карте пользовательского интерфейса напрямую, и устройство установлено на PX.
.head {
    width: 750px;
}
3. Представьтеpostcss-pxtoremПлагин настроен следующим образом:
require('postcss-pxtorem')({
    rootValue: 75,
    unitPrecision: 5,
    propList: ['*'],
    selectorBlackList: [],
    replace: true,
    mediaQuery: false,
    minPixelValue: 0
})

Выше вы можете использовать решение vw + rem для достижения мобильной адаптации.

4. Представьтеviewport-units-polyfillИсправить проблемы совместимости

Чтобы обеспечить нормальное отображение страницы на моделях с низкими версиями, можно ввести viewport-units-polyfill для решения проблем совместимости с vw.

viewport-units-polyfill на самом делеviewport-units-buggyfillупрощенная версия.

Краткое введение в реализацию viewport-units-buggyfill: вводя js, для версии с проблемами совместимости пройтись по всему CSS на странице, найти CSS, который использует единицу Viewport, вычислить единицу Viewport как единицу px. , и преобразовать новые правила css вставляются в заголовок или тело.

viewport-units-polyfill основан на viewport-units-buggyfill и вносит некоторые изменения, в основном для удаления большого объема работы по обходу и обработки совместимости только для размера шрифта html (эта схема адаптации используется только в размере шрифта html для вв). Удаление работы обхода значительно оптимизирует производительность.

Использование: поместите этот js-скрипт прямо в заголовок страницы.

2. граница 1px

В Интернете есть много решений проблемы с границей 1px, вы можете посмотреть:Поговорим о решении 1px под Retina

Решение, представленное в этой статье, заключается в использовании масштаба области просмотра для решения проблемы с границей в 1 пиксель на основе решения адаптации vw + rem.

выполнить

(function () {
    var dpr = window.devicePixelRatio;
    var scale = 1 / dpr;

    var metaEl = document.querySelector('meta[name="viewport"]') || document.createElement('meta');
    metaEl.setAttribute('name', 'viewport');
    metaEl.setAttribute('content', 'width=device-width, initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no, viewport-fit=cover');

    if (document.documentElement.firstElementChild) {
        document.documentElement.firstElementChild.appendChild(metaEl);
    } else {
        var wrap = document.createElement('div');
        wrap.appendChild(metaEl);
        document.write(wrap.innerHTML);
    }
})();

Идея очень проста, то есть масштаб Viewport устанавливается равным 1/dpr (соотношение пикселей устройства), чтобы решить проблему границы в 1 пиксель.

Примечание: Этот сценарий является простой версией. После тестирования различных марок и моделей было обнаружено, что это решение в основном работает хорошо. Только для нескольких мобильных телефонов Meizu будет проблема слишком тонких рамок. Основная причина в том, что dpr мобильного телефона Meizu равен 3, но реальное разрешение экрана невысокое (мое личное понимание не подтверждено данными, и заинтересованные друзья могут это проверить), поэтому вид слишком увеличен. много, что приводит к границе. Если это слишком подробно, решение состоит в том, чтобы использовать взлом (я пока не придумал лучшего, и друзья, у которых есть другие методы, могут комментировать и обмениваться ~)

(function () {
    // 1px
    var dpr = window.devicePixelRatio;
    var isIPhone = window.navigator.appVersion.match(/iphone/gi);
    var UA = window.navigator.userAgent;
    // 对 meizu 某型号进行hack,主要原因是 dpr为3,但是手机屏幕分辨率不够,会出现 1px border 过细的问题,这种问题主要出现在部分魅族手机上
    var hacks = ['m1 note'];
    var flag = false;
    hacks.forEach(function (item) {
        if (UA.indexOf(item) >= 0) {
            flag = true;
            return;
        }
    });
    if (!isIPhone && flag) {
        dpr = dpr >= 2 ? 2 : dpr;
    }
    var scale = 1 / dpr;
    var metaEl = document.querySelector('meta[name="viewport"]') || document.createElement('meta');
    metaEl.setAttribute('name', 'viewport');
    metaEl.setAttribute('content', 'width=device-width, initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no, viewport-fit=cover');

    if (document.documentElement.firstElementChild) {
        document.documentElement.firstElementChild.appendChild(metaEl);
    } else {
        var wrap = document.createElement('div');
        wrap.appendChild(metaEl);
        document.write(wrap.innerHTML);
    }
})();

Поместите приведенный выше скрипт в шапку страницы, при разработке границы 1px это может быть прямо следующим образом:

.border {
    border-bottom: 1PX solid #eee;
}

Примечание: если вы используете такой плагин, как postcss-pxtorem, вам нужно быть осторожным, чтобы вы не могли преобразовать эту единицу 1px в rem.Метод, который я использую, заключается в использовании PX в верхнем регистре для px, которые не нужно преобразовывать, так что postcss- pxtorem не будет преобразован.

3. Базовая компоновка

Базовая компоновка на самом деле охватывает многие аспекты, такие как:

  • Общий вид страницы
  • Копирайтинг и иконка
    • Различное выравнивание по центру (вертикальное, горизонтальное)
    • Текст выровнен со значком (значок должен использовать шрифт значка вместо изображения)
  • расслоение по z-индексу

1. Общий вид страницы

Более распространенная компоновка страниц H5 состоит в том, что страница разделена на три части: заголовок, основная часть и нижняя часть. Головная и нижняя части будут иметь эффект всасывания сверху и снизу. Есть некоторые проблемы с обычным фиксированным макетом. рекомендуется использовать гибкий макет в целом. , голова и нога фиксированы, а тело можно прокручивать, как показано ниже:

<div id="page">
    <div id="hd">
        <!-- head -->
    </div>
    <div id="bd">
        <!-- body -->
    </div>
    <div id="ft">
        <!-- foot -->
    </div>
</div>
#page {
    display: flex;
    flex-direction: column;
    position: relative;
    height: 100%;
    overflow: hidden;
}
#hd {
    z-index: 999;
}
#bd {
    flex-grow: 1;
    overflow-y: scroll;
    -webkit-overflow-scrolling: touch;
    &::-webkit-scrollbar {
        display: none;
    }
}

2. Копирайтинг и иконка

использовать иконочный шрифт

www.iconfont.cn/

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

Центрировать по вертикали и горизонтали

Существует множество реализаций:CSS-tricks.com/centering — Из…

Текст выровнен со значком
<div class="box">
    <span>文案与icon垂直居中,水平对齐</span>
    <span class="icon-span">
        <i class="icons">&#xe625;</i>
    </span>
</div>
.box {
    height: 92px;
    font-size: 32px;
    line-height: 1;
    padding: 0 20px;
    display: flex;
    align-items: center;
    .icon-span {
        font-size: 24px;
        line-height: 1;
        .icons {
            color: red;
            margin-left: 8px;
        }
    }
}

3. Наслоение z-индекса

Стандартизируйте использование z-index, чтобы предотвратить проблемы с отображением на странице из-за злоупотреблений, и используйте его в слоях:

$z-layers: ( 
    'below': -1,
    'default': 1,
    'content': (
        'base': 100
    ),
    'fixed': 990,
    'mask': 1000,
    'modal': 1020,
    'toast': 1040
);

Для простоты использования используйте следующие методы scss:

$z-layers: ( 
    'below': -1,
    'default': 1,
    'content': (
        'base': 100
    ),
    'fixed': 990,
    'mask': 1000,
    'modal': 1020,
    'toast': 1040
);
@function map-has-nested-keys($map, $keys...) {
    @each $key in $keys {
        @if not map-has-key($map, $key) {
            @return false;
        }
        $map: map-get($map, $key);
    }
    @return true;
}

@function map-deep-get($map, $keys...) {
    @each $key in $keys {
        $map: map-get($map, $key);
    }
    @return $map;
}

@function z($layers...) {
    @if not map-has-nested-keys($z-layers, $layers...) {
        @warn "No layer found for `#{inspect($layers...)}` in $z-layers map. Property omitted.";
    }
    @return map-deep-get($z-layers, $layers...);
}

Конкретное использование заключается в следующем:

.head {
    z-index: z('fixed');
}

Макет, упомянутый выше, вы можете перейти кДЕМО-страницаСмотри, QR-код:

Код:GitHub.com/hu J IA oh J/ также 5…

Я протестировал вышеуказанные решения на нескольких популярных мобильных телефонах, и в основном они работают хорошо.

напиши в конце

Все решения, представленные в этой статье, используются в моей повседневной работе, и я надеюсь быть полезным для тех, кто в этом нуждается~~~

Если вам понравилась моя статья, вы можете перейтимой личный блогнажмите звездочку ⭐️