Как заставить Firefox печатать стиль фонового цвета?

У меня есть простой CSS:

#someElement {
    background-color:black;
    color:white;
}

В браузере все выглядит нормально, но когда я распечатываю его в Firefox, он выглядит как черный текст на белом фоне. Я предполагаю, что это своего рода функция экономии чернил, но есть ли способ обойти это?


person machineghost    schedule 19.04.2009    source источник
comment
Я предлагаю принять ответ @musa вместо текущего, поскольку он действительно решает проблему.   -  person Namatullah    schedule 24.08.2016
comment
Хммм... ответ Timing пришел почти за два года до ответа mursa, и оба ответа используют один и тот же основной принцип (т.е. используйте что-то кроме background-color для подделки цвета фона). Ответ Timing содержит больше объяснений, но ответ mursa проще ... Я бы хотел, чтобы один из них был явно лучше, но, учитывая все это, я, честно говоря, не уверен, какой из них я должен принять. На данный момент я только что снял галочку с ответа Дэниела А. Уайта (хотя он технически точен, люди на SO ищут решения).   -  person machineghost    schedule 25.08.2016
comment
Firefox теперь распознает свойство color-adjust. 'регулировка цвета: точная'; Ниже приведен ответ, в котором упоминается то, что теперь следует выбрать как правильный ответ.   -  person RustyToms    schedule 08.05.2017


Ответы (8)


Это настройка браузера. Вы ничего не можете сделать в своем CSS. В Windows - File > Page Setup... > Print Background.

person Daniel A. White    schedule 19.04.2009
comment
Есть ли способ с помощью javascript определить, включен этот параметр или нет? - person jdavis; 28.07.2014
comment
@jdavis нет, я так не думаю. - person Daniel A. White; 28.07.2014
comment
Как я уже упоминал в своем ответе, есть лучшее решение для этого. - person Musa Haidari; 24.08.2016
comment
Теперь это прямо в Печать... -> Параметры (вкладка) -> Печать цветов фона. Это кажется мне более универсальным, чем то, что предлагают Муса или время, потому что его можно применять и для веб-страниц, которые вы не можете редактировать (вы не являетесь их владельцем). - person Michal Skop; 23.03.2017
comment
Есть ли способ настроить это, когда я использую onload="window.print();? потому что настройки браузера работают только тогда, когда я использую кнопку печати браузера - person Naxos84; 01.06.2017
comment
@Naxos84 Naxos84 я так не думаю. это все контролируется браузером - person Daniel A. White; 01.06.2017
comment
Это ничего не изменило для меня, к сожалению. - person Euri Pinhollow; 01.07.2018

Я нашел решение, оно немного хакерское, но с помощью псевдоэлементов CSS вы можете создавать фоны, используя толстые границы. Рамки печатаются, даже если «печать фона» отключена, просто сделайте их очень толстыми! Одно замечание: Firefox устанавливает для всех белых цветов шрифта черный цвет, поэтому, когда вы создаете фальшивый черный фон, Firefox по-прежнему делает текст черным, делая текст невидимым. Во всяком случае вот:

HTML:

<div class="redBox">
  <div class="content">Black on red</div>
</div>

CSS:

.redBox {
  /* o no, does not work with print */
  background-color: red;
}

@media print {
  .redBox {
     position: relative;
     overflow: hidden; /* this might not work well in all situations */
  }
  .redBox:before {
     content: '';
     position: absolute;
     top: 0;
     right: 0;
     left: 0;
     bottom: 0;
     /* and here it is, the background color */
     border: 99999px red solid;
     z-index: 0; /* was required in my situation */
  }
  .redBox * {
    /* was required in my situation */
    position: relative;
    z-index: 1;
  }
}
person timing    schedule 25.03.2014
comment
Если вы установите z-index: -1 вместо 0, вы можете сэкономить часть .redBox *. - person kernel; 07.01.2015
comment
@kernel Это сработало для меня, но я думаю, вам также нужно установить фон .redbox прозрачным для печати. - person Blazemonger; 17.04.2015
comment
Я знаю, что это старый ответ, но попробуйте использовать 9999cm вместо px. (Я экспериментировал с этим, и это единственный модуль, который работал. 10000cm не будет работать.) - person Ismael Miguel; 12.05.2015
comment
После некоторого тестирования я обнаружил, что абсолютный максимум (я потратил время, чтобы найти) был 5585.70776367in (~14299.4118749952cm). Вы можете попробовать на jsfiddle.net/67k4Lvn9/2. По крайней мере, работало в Google Chrome 42.0.2311.135 и Firefox 37.0.2. - person Ismael Miguel; 12.05.2015
comment
@timing, хотя ваш метод работает, и фон печатается, содержимое div не отображается, я пытался использовать z-index, но все равно не видно, хотя оно отображается на экране - person John Demetriou; 25.05.2015

Вот как я заставил это работать в моем случае, добавив две строки ниже в конкретный div. «@@supports (-moz-appearance:meterbar)» полезен для добавления стилей, специфичных для Firefox.

-webkit-print-color-adjust: точно; настройка цвета: точная;

@@supports (-moz-appearance:meterbar) {
    .container {
        margin: 0;
        font-size: 0.85em;
        width: 100%;
        -webkit-print-color-adjust: exact;
        color-adjust: exact;
    }
}
person Ricky Boy    schedule 13.04.2017
comment
Это новая функция в Firefox, и теперь это правильный ответ. Использование свойства настройки цвета - person RustyToms; 08.05.2017

Для отображения цветов фона в Firefox и IE

@media print {
  body{
    -webkit-print-color-adjust: exact; /*chrome & webkit browsers*/
    color-adjust: exact; /*firefox & IE */
  } 
}
person DhineshYes    schedule 14.06.2019

Для хрома вы можете использовать это:

-webkit-print-color-adjust:exact;

Или в режиме предварительного просмотра установите флажок Дополнительные настройки->Фоновая графика.

Для Firefox вы не можете включить его с помощью CSS. Вы можете включить его следующим образом (если вы не видите файл, нажмите клавишу Alt один раз).

Файл->Параметры страницы и установите флажок Печать фона (цвет и изображения)

person Saadat    schedule 07.01.2019

Я взломал это, используя элемент SVG

.legendItem {
  position: relative;
}

.legentItemText {
  position: relative;
  z-index: 1;
}

.printBackground {
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  position: absolute;
  z-index: 0;
}
  <div class="legendItem">
    <div class="legentItemText">Some text.....<div>
  <svg class="printBackground">
    <rect width="100%" height="100%" fill="#000" />
  </svg>
</div>

person Kirill    schedule 24.09.2018

Возможно, это не тот ответ, который вы ищете, но вот:

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

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

Чтобы добавить отдельную таблицу стилей печати, добавьте еще одну таблицу стилей в заголовок страницы.

<link rel="stylesheet" href="print.css" type="text/css" media="print">
person Arve Systad    schedule 19.04.2009
comment
Хех, целая страница была бы лишней; Мне нужен был только небольшой участок. - person machineghost; 19.04.2009
comment
Это может быть просто так, но имейте в виду, что это тот же самый механизм, который им управляет. Должен ли браузер обнаруживать область поверхности на веб-сайте, проверять ее на соответствие желаемым настройкам DPI где-нибудь для печати, а ЗАТЕМ решать, применять ли фоновый цвет или нет? ;-) - person Arve Systad; 19.04.2009
comment
как это решает общую проблему с цветом фона? - person Ben Sewards; 17.11.2015

person    schedule
comment
Может не работать во всех браузерах, но исправляет цвета текста FF. - person Poelinca Dorin; 28.06.2016
comment
Работает для фона, не забудьте добавить : после box-shadow в определении стиля - person userlond; 22.08.2016
comment
@userlond Спасибо за исправление. - person Musa Haidari; 23.08.2016
comment
Мне нравится это решение только для CSS, так как мне не нужно изменять DOM. - person leemes; 19.09.2016
comment
Обратите внимание, что в настоящее время это не работает в Chrome (тень блока печатается сплошным черным цветом). - person roflmyeggo; 30.03.2017
comment
На данный момент вы можете обойти эту проблему в Chrome, используя -web-filter: opacity(1), но это приведет к некоторой пикселизации. - person roflmyeggo; 30.03.2017