Печать разрывов макета начальной загрузки - PullRequest
0 голосов
/ 29 июня 2018

У меня есть следующая страница:

<html>
<head>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
</head>
<body>
  <div class="container">
      <div class="row">
          <div class="col-xs-12 col-sm-6">
              <p>Column 1,1 in small row 1 in xs</p>
          </div>
          <div class="col-xs-12 col-sm-6">
              <p>Column 1,2 in small row 2 in xs</p>
          </div>
          <div class="col-xs-12 col-sm-6">
              <p>Column 2,1 in small row 3 in xs</p>
          </div>
          <div class="col-xs-12 col-sm-6">
              <p>Column 2,2 in small row 4 in xs</p>
          </div>
      </div>
    </div>
  </body>
</html>

Эта страница выглядит ожидаемой при просмотре (т. Е. Есть 2 столбца и 2 строки на маленьких экранах + и 4 строки на мобильном устройстве), однако проблема заключается в попытке печати. ​​

Когда я выполняю CTRL + P в Chrome, я получаю следующий предварительный просмотр:

enter image description here

Размер страницы установлен на А4. Эта проблема не возникает в Firefox (но также возникает в IE и Edge)

Есть идеи, как заставить представление для печати отображать небольшой (или средний) макет вместо мобильного представления?

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Демо

https://so51099397.surge.sh/

(мне кажется, что исправление, которое я реализовал, слишком много, но я не думаю, что есть какой-то другой способ решить проблему)

(Если вам интересно, почему я разместил сайт вместо чего-то вроде SO snippet или jsfiddle, я объяснил в комментарии)

Объяснение

Почему я получаю "мобильный" вид в печати?

  1. width of A4 = 210mm ≈ 8.27 in ≈ 595 px (72 dpi)
  2. xs применяется, когда width < 768px
  3. Технически то, что делает Chrome, правильно, а то, что делают другие браузеры, неверно

Как это исправить?

  1. Bootstrap написан в мобильном шаблоне.
  2. Значение таблицы стилей выглядит примерно так:
    .col-xs-12 {
        width: 100%;
    }
    @media (min-width: 768px){
        .col-sm-6 {
            width: 50%;
        }
    }
  1. Теперь каким-то образом, если я разверну правила внутри @media (min-width: 768px) только во время печати, моя проблема будет решена.
  2. Чтобы реализовать это, мы получим все правила внутри @media (min-width: 768px) с использованием document.styleSheets (не забудьте добавить crossorigin="anonymous" в начальной загрузке <link>, иначе вы получите ошибку при доступе к таблице стилей)
  3. Как только у нас будут все эти стили, мы обернем их в <style> и добавим в <head> в beforeprint событие
  4. В случае afterprint мы удалим это <style>

Код (как в демоверсии):

window.addEventListener("beforeprint", function(){
    let printStyleSheet = document.createElement("style");
    printStyleSheet.classList.add("print-stylesheet");
    document.head.appendChild(printStyleSheet)

    let printRulesText = "";
    Array.from(document.styleSheets).forEach(styleSheet => {
        Array.from(styleSheet.cssRules)
        .filter(rule => rule.media && /(min-width: 768px)/g.test(rule.media.mediaText))
        .forEach(rule => {
            Array.from(rule.cssRules).forEach(rule => printRulesText += rule.cssText)
        })
    })
    printStyleSheet.innerHTML = printRulesText;
})
window.addEventListener("afterprint", function(){
    Array.from(document.querySelectorAll(".print-stylesheet")).forEach(style => style.remove())
})

Примечание: Это даст вам представление планшета (см), если вы хотите средний рабочий стол (md), вам придется развернуть оба, min-width: 768px, а также min-width: 992px аналогично для большой рабочий стол (LG) также

Будет ли это работать?

  1. Работает для кода в вопросе
  2. Должно работать и для других компонентов.

Можно ли это исправить, применив html, body { width: 769px } во время печати? (как 769> 768)

  1. Нет, это не будет работать, потому что медиа-запросы работают на viewport, а не на ширину html или body

Хорошо, могу ли я добавить <meta name="viewport" content="width=769"> и удалить другие мета области просмотра во время печати? (как 769> 768)

  1. Умм ... Нет. Это не работает. (Я думаю, что это должно быть, но как-то не работает)

Есть ли другие исправления?

  1. Переопределить вручную xs стили, такие как @Arex did
  2. Получите исходный код начальной загрузки css и измените его с помощью print медиа-запросов примерно так:

    .col-xs-12 {
        width: 100%;
    }
    @media (min-width: 768px){
        .col-sm-6 {
            width: 50%;
        }
    }
    
    /* add such rules everywhere */
    @media print{
        .col-sm-6 {
            width: 50%;
        }
    }
    
  3. Поместите все содержимое текущей страницы в iframe с width: 100%; height: 100%; border: none; и сделайте все остальное display: none;. Но я чувствую, что это не сработает, потому что если iframe получит полосу прокрутки, содержимое из вида не будет напечатано. Также выглядит гораздо более хакерски

PS: Это довольно очевидно, но позвольте мне прямо сказать это ... Реализованное исправление (как видно из демонстрации) не исправляет только систему координат или фрагмент в вопросе ... Но исправляет поведение ВСЕ компоненты (кнопка, таблица, входы, сетка и т. д.) путем имитации медиазапроса min-width: 768px. Это то, что хочет ОП. Индивидуальная фиксация компонентов

0 голосов
/ 05 июля 2018

Используйте @media print, чтобы исправить это. Если вы печатаете предварительный просмотр, он показывает макет для см.

Вот рабочий код:

<html>
<head>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
</head>
<body>
    <style>
        @media print
        {
            .col-xs-12
            {
                width:50%;
                float:left;
            }
        }
        
    </style>
  <div class="container">
      <div class="row">
          <div class="col-xs-12 col-sm-6">
              <p>Column 1,1 in small row 1 in xs</p>
          </div>
          <div class="col-xs-12 col-sm-6">
              <p>Column 1,2 in small row 2 in xs</p>
          </div>
          <div class="col-xs-12 col-sm-6">
              <p>Column 2,1 in small row 3 in xs</p>
          </div>
          <div class="col-xs-12 col-sm-6">
              <p>Column 2,2 in small row 4 in xs</p>
          </div>
      </div>
    </div>
  </body>
</html>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...