Print HTML table background color with Bootstrap
Bootstrap explicitly sets the background to white for printing--this is in their CSS:
@media print {
.table td, .table th {
background-color: #fff !important;
}
}
Write your override like theirs and you should be good to go.
Background color not showing in print preview
The Chrome CSS property -webkit-print-color-adjust: exact;
works appropriately.
However, making sure you have the correct CSS for printing can often be tricky. Several things can be done to avoid the difficulties you are having. First, separate all your print CSS from your screen CSS. This is done via the @media print
and @media screen
.
Often times just setting up some extra @media print
CSS is not enough because you still have all your other CSS included when printing as well. In these cases you just need to be aware of CSS specificity as the print rules don't automatically win against non-print CSS rules.
In your case, the -webkit-print-color-adjust: exact
is working. However, your background-color
and color definitions are being beaten out by other CSS with higher specificity.
While I do not endorse using !important
in nearly any circumstance, the following definitions work properly and expose the problem:
@media print {
tr.vendorListHeading {
background-color: #1a4567 !important;
-webkit-print-color-adjust: exact;
}
}
@media print {
.vendorListHeading th {
color: white !important;
}
}
Here is the fiddle (and embedded for ease of print previewing).
CSS @media print issues with background-color;
IF a user has "Print Background colours and images" turned off in their print settings, no CSS will override that, so always account for that. This is a default setting.
Once that is set so it will print background colours and images, what you have there will work.
It is found in different spots.
In IE9beta it's found in Print->Page Options under Paper options
In FireFox it's in Page Setup -> [Format & Options] Tab under Options.
How to avoid HTML table background color from spanning across pages on print?
Found the answer myself, documenting it here for anyone facing this problem in the future.
Simply color the table by row in the css. ie.
tr{
background-color:#E2EFD9; //whatever color you want
}
Stylesheet for printing, background-color ignored
By default, most browsers ignore CSS background colours and images when printing. This can only be overridden by changing the setting in the browser, if the browser even has such an option (some don't, as Quentin points out).
Bootstrap print CSS removes background color
Unfortunately there is not a good answer to your question - but maybe if you understand the why's then you can choose a way forward.
Why?
It's true that Bootstrap uses the @media print { * { color: $fff; background: transparent; }}
-- but there is a very solid reason. This bit of code is actually derived from the normalizer.css project (by a then college of @mdo 's, @necolas) - it's intent is to make all browsers behave the same. These guys chose to "normalise" the css for a very good reason:
With most browsers one can choose to include or exclude background color, so the behaviour is not standard across even the same browser. Imagine for a sec a website with very dark background with white text - when printing with backgrounds off, it will look like you're printing nothing - when actually you're printing white text on no (white) background.
There was no way to account for all the different uses of color, so they choose to go black (font) and white (background, actually 'transparent'). Even the choice of black was well thought of -- its a better print solution, as most color printers have more black "ink/toner" (more economical) and they don't need to mix color to make black (so faster).
Remember that Bootstrap is also a "framework" - so a starting point if you will - and kudos to @mdo and @necolas for having the foresight to think of this in terms of establishing a predictable baseline. (No, I don't know them.)
Nope...
So the thinking here is: "what if we could 'go back' and unset this. Unfortunately CSS does not work like that - yes browsers load the CSS declarations in a "queue" where the last declaration wins (LIFO, or last-in-first-out), but I'm not aware of a way to remove this stack. So CSS developers just add more to the end...
So one would assume that we can go back that way --- add a * { background-color: inherit }
. Problem is that inherit
reverts to the parent property, but *
is the root, so it has nothing to revert to. Same goes for initial
!
Maybe!
So we're left with 4 options, none of them is what you where hoping for, but it is what it is. In order of difficulty:
- Download the BS (less or sass) source, edit the offending code, and then compile it. (You need to use a local copy, CDN's will not work.)
- Download the CSS variant of your choice, search and delete the offending code. (No CDN's again.)
- Use getbootstrap.com/customize to create a new variant - exclude "Print media styles" under "Common CSS". (Again, no CDN's)
- Override the specific items who's color you want to print: e.g.
@media print {
.alert-danger {
color: yellow !important;
background-color: red !important;
}
}
CDN's copies of BS will now work, but then you have the problem of the user possibly not printing backgrounds and having the output white (yellow in the e.g.) on white!
Finally
Well I hope learning the why's was at the very least a way of you thinking of a workaround. General rule of thumb I follow is that when printing, the background is (should be) always white. When constrained that way you start thinking of novel ideas, like exclamation icons around the text that only "print" (@media only screen { .hidden-screen { display: none; }}
)
How do I stop bootstraps table background color setting for print media over riding my class setting
Oh yeah, just noticed something...
CSS has this pain-in-the-butt preference thing where the larger your selection tree, the more priority it has.
For example,table > td
takes priority over just td
In Bootstrap's CSS, the td
is selected as .table td
, but your selector is just .bg-color1
or .bg-color2
There are two ways to fix this.
- Remove the
!important
from Bootstrap's CSS and keep the!important
in your CSS - Increase the length of your selector, something like
.table .bg-color1
I have no evidence to prove this, but this is what I've noticed.
background color disappears when printing using window.print()
Adding -webkit-print-color-adjust: exact;
to css page solved the problem in chrom , and color-adjust: exact;
to solve the problem in mozilla firefox !
Related Topics
How to Create a Responsive Checkerboard Background in CSS
Downloaded Font Won't Display Properly
CSS Nth-Child Apply Odd-Even Rule But Switch Every 4 Items
What CSS3 Features Still Need Vendor Prefixes
What Does Unset Value Mean in CSS
How to Create Custom Scrollbar for Mozilla Firefox with CSS
Default Textbox Border-Style and Width
When Does Flex-Grow Switch to Flex-Shrink, and Vice-Versa
How to Style Anonymous Flex Items Explicitly
Are CSS Stylesheets Loaded Asynchronously
Why Is This Non-Float Margin Collapsing with a Float
CSS Animation on "Content:" Doesn't Work on Safari and Firefox
My Z-Index Property Is Not Getting Set
Why Is the Use of '!Important' Discouraged
CSS Drop Shadow for CSS Drawn Arrow
What Are Differences Between Rgb VS Rgba Other Than 'Opacity'