提问人:Gordon Copestake 提问时间:3/5/2014 更新时间:4/21/2022 访问量:118386
用于打印的 Bootstrap 网格
Bootstrap grid for printing
问:
我想设计一个具有不同布局的报表页,以便打印到移动设备。我正在使用 bootstrap v3。网格似乎无法区分两者,因为打印的断点与移动设备的断点 (xs) 相同
例如:在下面的测试html中,我的打印页面(或打印预览)并排显示xs6列,但sm6列堆叠。xs 和 sm 之间没有断点。
当然,我的打印页面比我的移动视口宽,所以它不应该使用 sm 布局吗?
是我做错了什么,还是事实就是这样?是否有定义的打印视口宽度?
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-xs-6">
xs6
</div>
<div class="col-xs-6">
xs6
</div>
</div>
<div class="row">
<div class="col-sm-6">
sm6
</div>
<div class="col-sm-6">
sm6
</div>
</div>
</div>
</body>
</html>
答:
您的开关样式如下所示
<div class="row">
<div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
<div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
<div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
</div>
看
#grid-example-mixed 或 #grid-example-mixed-complete
并且您可能需要清除修复
<!-- Add the extra clearfix for only the required viewport -->
<div class="clearfix visible-xs"></div>
编辑: 04/2019
从 Bootstrap 4.x 开始,有一些新的类可用于设置打印时的显示行为。请参阅 4.3 文档
评论
也许你可以使用 Bootstrap 2。如果您熟悉 Bootstrap 2,那么您可以将其用作替代方案,因为它提供了非响应式 CSS。Bootstrap 2 不是首先移动的,您必须添加额外的样式表才能使您的网页具有响应性。
或者,您可以为移动部件添加清除修复。查看 http://getbootstrap.com/css/#grid-responsive-resets
评论
我有一个类似的问题,对我来说,最简单的解决方案是手动修改我希望在打印时以不同方式显示的元素的宽度(我添加了一个特定的类 - 在我的情况下:title-container,details-container,沿着col-xs-6等)。
例如:
<div class="jumbotron">
<div class="container">
<div class="row">
<div class="col-xs-12 col-ms-3 col-sm-6 col-md-6 title-container">
Some stuff
</div>
<div class="col-xs-12 col-ms-9 col-sm-6 col-md-6 details-container">
Some more stuff
</div>
</div>
</div>
</div>
@media print {
.title-container {
width: 360px;
float: left;
}
.details-container {
width: 300px;
float: right;
}
}
就我而言,我需要在右边浮动一列,在左边浮动一列,因此浮动...... 您也可以在自定义 css 中为 .col-xs-6 等设置宽度,这只是一个快速而肮脏的解决方案,但是为我需要这个的页面做了工作......
评论
我所做的是在我的打印 css 中手动重新创建这些列类。
.col-print-1 {width:8%; float:left;}
.col-print-2 {width:16%; float:left;}
.col-print-3 {width:25%; float:left;}
.col-print-4 {width:33%; float:left;}
.col-print-5 {width:42%; float:left;}
.col-print-6 {width:50%; float:left;}
.col-print-7 {width:58%; float:left;}
.col-print-8 {width:66%; float:left;}
.col-print-9 {width:75%; float:left;}
.col-print-10{width:83%; float:left;}
.col-print-11{width:92%; float:left;}
.col-print-12{width:100%; float:left;}
然后我就使用这些类,就像我使用 bootstrap 类来制作仅用于打印的列一样。我还仅在打印版本中创建并隐藏/显示元素。.visible-print
.hidden-print
它仍然需要一些工作,但那个快速补丁对我帮助很大。
评论
max-width
width
Fredy31 解决方案的 Sass 版本:
@for $i from 1 through 12 {
.col-print-#{$i} {
width: #{percentage(round($i*8.33)/100)};
float: left;
}
}
评论
以下方法非常适合创建特定于印刷媒体的网格元素。使用 Bootstrap 3。
@media print {
.make-grid(print);
}
然后,您可以将所有网格 col 元素与关键字一起使用。例如:等。print
col-print-6
col-print-offset-2
如果您想要 Bootstrap 的网格,请不要使用 col-xs(移动设置)打印,并希望使用 col-sm-??取而代之的是,基于 Fredy31 的答案,你甚至不需要定义 col-print-??.只需重写所有 col-md-??里面的CSS类定义: @media print { /* copy and paste from bootstrap.css*/ } 像这样:
@media print {
.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
float: left;
}
.col-sm-12 {
width: 100%;
}
.col-sm-11 {
width: 91.66666667%;
}
.col-sm-10 {
width: 83.33333333%;
}
.col-sm-9 {
width: 75%;
}
.col-sm-8 {
width: 66.66666667%;
}
.col-sm-7 {
width: 58.33333333%;
}
.col-sm-6 {
width: 50%;
}
.col-sm-5 {
width: 41.66666667%;
}
.col-sm-4 {
width: 33.33333333%;
}
.col-sm-3 {
width: 25%;
}
.col-sm-2 {
width: 16.66666667%;
}
.col-sm-1 {
width: 8.33333333%;
}
}
评论
以及 Ehsan Abidi 的答案的 SASS 版本,使用了 MiCc83 的答案:
@for $i from 1 through 12 {
.col-sm-#{$i} {
width: #{percentage(round($i*8.33)/100)};
float: left;
}
}
我更喜欢这个,因为我总是指定“sm”大小,并且它最接近我的应用程序中的打印页面。然后,我只需要在遇到异常值条件时添加一些专门用于打印的内容。
如果你只有 2 列,你可以尝试一下。我用下面的代码修复了它。
<div class="row">
<div class="w-50 p-3 float-left">
</div>
<div class="w-50 p-3 float-right">
</div>
</div>
对于 Bootstrap 4(使用 SASS)
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
@for $i from 1 through $grid-columns {
@media print {
.col-print#{$infix}-#{$i} {
@include make-col($i, $grid-columns);
}
}
}
}
}
将创建
@media print {
.col-print-1 {
flex: 0 0 8.33333%;
max-width: 8.33333%; } }
@media print {
.col-print-2 {
flex: 0 0 16.66667%;
max-width: 16.66667%; } }
@media print {
.col-print-3 {
flex: 0 0 25%;
max-width: 25%; } }
@media print {
.col-print-4 {
flex: 0 0 33.33333%;
max-width: 33.33333%; } }
@media print {
.col-print-5 {
flex: 0 0 41.66667%;
max-width: 41.66667%; } }
@media print {
.col-print-6 {
flex: 0 0 50%;
max-width: 50%; } }
@media print {
.col-print-7 {
flex: 0 0 58.33333%;
max-width: 58.33333%; } }
@media print {
.col-print-8 {
flex: 0 0 66.66667%;
max-width: 66.66667%; } }
@media print {
.col-print-9 {
flex: 0 0 75%;
max-width: 75%; } }
@media print {
.col-print-10 {
flex: 0 0 83.33333%;
max-width: 83.33333%; } }
@media print {
.col-print-11 {
flex: 0 0 91.66667%;
max-width: 91.66667%; } }
@media print {
.col-print-12 {
flex: 0 0 100%;
max-width: 100%; } }
而不是使用新的列名(如 .col-print-1 , .col-print-2 )重新创建,而是编写将在打印文档时启用的媒体查询。
@media print {
.col-md-1,.col-md-2,.col-md-3,.col-md-4,
.col-md-5,.col-md-6,.col-md-7,.col-md-8,
.col-md-9,.col-md-10,.col-md-11,.col-md-12 {
float: left;
}
.col-md-1 {
width: 8%;
}
.col-md-2 {
width: 16%;
}
.col-md-3 {
width: 25%;
}
.col-md-4 {
width: 33%;
}
.col-md-5 {
width: 42%;
}
.col-md-6 {
width: 50%;
}
.col-md-7 {
width: 58%;
}
.col-md-8 {
width: 66%;
}
.col-md-9 {
width: 75%;
}
.col-md-10 {
width: 83%;
}
.col-md-11 {
width: 92%;
}
.col-md-12 {
width: 100%;
}
}
因此,通过这种方式,我们可以直接应用打印css样式,而无需更改列名。
评论
如果它只是两列中的一行文本,您可以在此处使用可接受的答案。
对于 Bootstrap 4 sass,以下是我在多个项目中应用的一些片段。这些正在对以下方面进行调整:
- 网格(遵循 LG 断点)
- 垫片(重写LG边距/填充下方的所有内容)
- 按钮(由于背景色在打印预览中不起作用,因此将填充按钮切换为轮廓)
- 显示(重写LG显示器下方的所有显示器)
- 文本对齐方式(重写 LG 断点下方的所有内容)
@media print {
$grid-breakpoints-print: (lg: 992px); // keep breakpoint that you would like to apply for print
/* Rewrite margins, padding, display & alignment to keep the LG and not the mobile ones */
@each $breakpoint in map-keys($grid-breakpoints-print) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints-print);
// rewrite all displays for your print breakpoint
@each $value in $displays {
.d#{$infix}-#{$value} {
display: $value !important;
@each $v in $displays {
&.d-#{$v} {
display: $value !important;
&.d-print-none,
&.table__sort {
display: none !important;
}
}
}
&.d-print-none {
display: none !important;
}
}
}
// rewrite all spacings for your print breakpoint
@each $prop, $abbrev in (margin: m, padding: p) {
@each $size, $length in $spacers {
.#{$abbrev}#{$infix}-#{$size} {
#{$prop}: $length !important;
@each $s, $l in $spacers {
&.#{$abbrev}-#{$s},
&.#{$abbrev}-auto {
#{$prop}: $length !important;
}
}
}
.#{$abbrev}t#{$infix}-#{$size},
.#{$abbrev}y#{$infix}-#{$size} {
#{$prop}-top: $length !important;
@each $s, $l in $spacers {
&.#{$abbrev}t-#{$s},
&.#{$abbrev}y-#{$s},
&.#{$abbrev}t-auto,
&.#{$abbrev}y-auto {
#{$prop}-top: $length !important;
}
}
}
.#{$abbrev}r#{$infix}-#{$size},
.#{$abbrev}x#{$infix}-#{$size} {
#{$prop}-right: $length !important;
@each $s, $l in $spacers {
&.#{$abbrev}r-#{$s},
&.#{$abbrev}x-#{$s},
&.#{$abbrev}r-auto,
&.#{$abbrev}x-auto {
#{$prop}-right: $length !important;
}
}
}
.#{$abbrev}b#{$infix}-#{$size},
.#{$abbrev}y#{$infix}-#{$size} {
#{$prop}-bottom: $length !important;
@each $s, $l in $spacers {
&.#{$abbrev}b-#{$s},
&.#{$abbrev}y-#{$s},
&.#{$abbrev}b-auto,
&.#{$abbrev}y-auto {
#{$prop}-bottom: $length !important;
}
}
}
.#{$abbrev}l#{$infix}-#{$size},
.#{$abbrev}x#{$infix}-#{$size} {
#{$prop}-left: $length !important;
@each $s, $l in $spacers {
&.#{$abbrev}l-#{$s},
&.#{$abbrev}x-#{$s},
&.#{$abbrev}l-auto,
&.#{$abbrev}x-auto {
#{$prop}-left: $length !important;
}
}
}
}
}
// rewrite all text alignments for your print breakpoint
.text#{$infix}-left {
text-align: left !important;
&.text-left,
&.text-right,
&.text-center {
text-align: left !important;
}
}
.text#{$infix}-right {
text-align: right !important;
&.text-left,
&.text-right,
&.text-center {
text-align: right !important;
}
}
.text#{$infix}-center {
text-align: center !important;
&.text-left,
&.text-right,
&.text-center {
text-align: center !important;
}
}
}
/* Rewrite grid to keep the LG and discard the mobile */
@for $i from 1 through 12 {
.col-lg-#{$i} {
flex: 0 0 #{percentage(round($i*8.33)/100)} !important;
max-width: #{percentage(round($i*8.33)/100)} !important;
@for $k from 1 through 12 {
&.col-xs-#{$k},
&.col-sm-#{$k},
&.col-md-#{$k},
&.col-#{$k} {
flex: 0 0 #{percentage(round($i*8.33)/100)} !important;
max-width: #{percentage(round($i*8.33)/100)} !important;
}
}
}
}
/* Since the print will not fill background-colors you need to transform filled buttons into outline */
@each $color, $value in $theme-colors {
.btn-#{$color} {
color: $value !important;
background-color: $white !important;
}
}
}
这是一个正在工作的小提琴。请记住,在小提琴示例中,只有@media打印 { ... } 很重要。变量从一开始就被复制到有一个工作的小提琴。
基于 Fredy31 的回答,使用 Bootstrap 的精确宽度并删除重复的浮点数。
[class^="col-print"] {float:left;}
.col-print-1 {width:8.33333333%;}
.col-print-2 {width:16.66666667%;}
.col-print-3 {width:25%;}
.col-print-4 {width:33.33333333%;}
.col-print-5 {width:41.66666667%;}
.col-print-6 {width:50%;}
.col-print-7 {width:58.33333333%;}
.col-print-8 {width:66.66666667%;}
.col-print-9 {width:75%;}
.col-print-10{width:83.33333333%;}
.col-print-11{width:91.66666667;}
.col-print-12{width:100%;}
评论