Проблема с отображением CSS единиц просмотра - PullRequest
0 голосов
/ 17 марта 2020

Я работаю над дочерней темой WP's Twentyseventeen, в которой используется VH для регулировки определенных высот, например, часть заголовка. В заголовке все, что я действительно хочу изменить, это добавить своего рода наклонный разделитель, чтобы сделать его более "стилусом sh", но независимо от того, что я делаю, в некоторых дисплеях я получаю следующую проблему:

Screenshot of issue

Как видите, под делителем отображается 1 пиксель фона. (Кстати, это происходит не только на мобильных дисплеях, и это происходит в нескольких браузерах.)

Теперь вот мой код, относящийся к этой части (а также код 2017 года, который я Я знаю, что 2017 год как-то связан с этим разделом, но я не могу быть уверен, что в теме нет кода или сценария, влияющего на это поведение):

HTML:

<div class="custom-header">

    <div class="custom-header-media">
        <?php the_custom_header_markup(); ?>
    </div>

    <?php get_template_part( 'template-parts/header/site', 'branding' ); ?>

    <div class="custom-header-bottom-divider">
        <svg id="divider-bottom" xmlns="http://www.w3.org/2000/svg" version="1.1" width="100%" height="100" viewBox="0 0 100 100" preserveAspectRatio="none"><path d="M0 100 L100 0 L100 100 Z"></path></svg>
    </div>

</div><!-- .custom-header -->

CSS:

.custom-header {
    position: relative;
    overflow: hidden;
}

.has-header-image.twentyseventeen-front-page .custom-header,
.has-header-video.twentyseventeen-front-page .custom-header,
.has-header-image.home.blog .custom-header,
.has-header-video.home.blog .custom-header {
    display: table;
    height: 300px;
    height: 75vh;
    width: 100%;
}

.custom-header-media {
    bottom: 0;
    left: 0;
    overflow: hidden;
    position: absolute;
    right: 0;
    top: 0;
    width: 100%;
}

.custom-header-media:before {
    /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#000000+0,000000+100&0+0,0.3+75 */
    background: -moz-linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 75%, rgba(0, 0, 0, 0.3) 100%); /* FF3.6-15 */
    background: -webkit-linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 75%, rgba(0, 0, 0, 0.3) 100%); /* Chrome10-25,Safari5.1-6 */
    background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 75%, rgba(0, 0, 0, 0.3) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000", endColorstr="#4d000000", GradientType=0); /* IE6-9 */
    bottom: 0;
    content: "";
    display: block;
    height: 100%;
    left: 0;
    position: absolute;
    right: 0;
    z-index: 2;
}

.has-header-image .custom-header-media img,
.has-header-video .custom-header-media video,
.has-header-video .custom-header-media iframe {
    position: fixed;
    height: auto;
    left: 50%;
    max-width: 1000%;
    min-height: 100%;
    min-width: 100%;
    min-width: 100vw; /* vw prevents 1px gap on left that 100% has */
    width: auto;
    top: 50%;
    padding-bottom: 1px; /* Prevent header from extending beyond the footer */
    -ms-transform: translateX(-50%) translateY(-50%);
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}

.custom-header-bottom-divider {
    position: absolute;
    bottom: 0;
    left: 50%;
    width: 100%;
    min-width: 1000px;
    text-align: center;
    line-height: 1;
    transform: translateX(-50%);
    -webkit-transform: translateX(-50%);
    -moz-transform: translateX(-50%);
    -o-transform: translateX(-50%);
    -ms-transform: translateX(-50%);
    z-index: 2;
}

.custom-header-bottom-divider svg {
    display: block;
    fill: #fff;
}

Я на 99% уверен, что это связано с тем, что 2017 год использует VH для установления sh высота заголовка. Т.е. это означает, что часто результат в пикселях будет не целым числом, а скорее чем-то вроде 932.45. Теперь я думаю, что теоретически браузер не может позиционировать объект между двумя пикселями, но если он округляется вверх или вниз, то я думаю, что по какой-то причине может быть несоответствие между пикселем, которое требуется для 0 для bottom: 0 и фактического пикселя, который требуется, чтобы быть нижней границей заголовка, таким образом, помещая дочерний элемент на 1 пиксель выше фактического основания.

Temp Solution / обходной путь:

Так что это не так Это реальное решение, по крайней мере, не так, как мне кажется. Это просто временное исправление, пока я не смогу понять, что происходит и как действительно решить это. Это должно быть довольно просто: если вы устанавливаете высоту элемента через CSS, соответствующую области просмотра, дочерний элемент, установленный в bottom: 0, должен фактически располагаться в абсолютном низу. Но это не происходит по какой-то причине. Возможно, это известная проблема с модулями области просмотра, или, возможно, тема 2017 года имеет какой-то другой сценарий кода os, над которым мы работаем. Во всяком случае, теперь я использую JS для решения проблемы:

var headerHeight = $customHeader.innerHeight(); 
$customHeader.animate({height: headerHeight});

Я подтвердил, что innerHeight фактически получает высоту, как показано, то есть в полных пикселях - целочисленных значениях - как Поза до точной высоты, которая задается через vh, которая имеет тенденцию иметь десятичные дроби.

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

Я полагаю, что проблема в том, что по какой-то причине рост родителя и положение ребенка разделяются при округлении; или положение ребенка устанавливается до того, как рост родителей будет округлен. В любом случае, я почти уверен, что этот разрыв в 1px связан с тем фактом, что нецелые значения участвуют в CSS.

1 Ответ

2 голосов
/ 17 марта 2020

Вы можете попробовать изменить нижний атрибут для делителя, изменив его на -1px

.custom-header-bottom-divider {
    position: absolute;
    bottom: -1px;
    left: 50%;
    width: 100%;
    min-width: 1000px;
    text-align: center;
    line-height: 1;
    transform: translateX(-50%);
    -webkit-transform: translateX(-50%);
    -moz-transform: translateX(-50%);
    -o-transform: translateX(-50%);
    -ms-transform: translateX(-50%);
    z-index: 2;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...