能否用CSS实现文本在多张图片的上下侧环绕排版?
需求:重现杂志风格文本环绕排版
我想要重现这类杂志风格的排版效果:
尝试过程中遇到的问题:
- 使用
float属性时,只能实现文本在图片下方环绕的效果,达不到目标样式 - 使用
shape-outside属性时,单个文本div只能应用一个形状,无法实现多形状适配 - 尝试用CSS Grid实现单图上下侧文本环绕,代码如下:
尝试的CSS代码
.mygrid { display: grid; grid-template-rows: 150px 150px 150px; grid-template-columns: 150px 150px; grid-template-areas: "para para" "image para" "para para"; } .lorem { background-color: red; grid-area: para; } .image { background-color: blue; grid-area: image; }
尝试的HTML代码
<div class="mygrid"> <div class="lorem">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Soluta ipsam, iure facilis optio eum dignissimos. Quis aliquam inventore a sit quo est ut voluptas nesciunt iure, veniam consequuntur! Error, recusandae!</div> <div class="im">I'm the image!</div> </div>
解决方案
方法1:结合shape-outside与伪元素实现自动环绕
shape-outside本身仅支持单个形状,但可以给图片容器添加伪元素,分别在图片上下区域生成占位形状,实现文本在图片上下两侧的自动环绕:
.magazine-wrap { width: 600px; margin: 0 auto; } .img-box { float: left; width: 150px; height: 300px; position: relative; margin: 10px 15px; } .img-box img { width: 100%; height: 100%; object-fit: cover; } /* 图片上方占位形状 */ .img-box::before { content: ""; position: absolute; top: -10px; left: 0; width: 100%; height: 150px; shape-outside: polygon(0 0, 100% 0, 100% 100%, 0 100%); float: left; } /* 图片下方占位形状 */ .img-box::after { content: ""; position: absolute; bottom: -10px; left: 0; width: 100%; height: 150px; shape-outside: polygon(0 0, 100% 0, 100% 100%, 0 100%); float: left; } .content-text { text-align: justify; line-height: 1.6; }
<div class="magazine-wrap"> <div class="img-box"> <img src="你的图片路径" alt="杂志配图"> </div> <div class="content-text"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptates, quibusdam. Quasi, voluptate? Quisquam, voluptates. Quasi, voluptate? Quisquam, voluptates. Quasi, voluptate? Quisquam, voluptates.(替换为长文本内容) </div> </div>
方法2:CSS Grid拆分文本实现精准排版
如果需要严格控制文本段落的位置,可以把文本拆分为上、中、下三个区块,通过Grid布局对应图片的位置:
.grid-magazine { display: grid; grid-template-columns: 150px 1fr; grid-template-rows: auto 300px auto; gap: 10px; width: 600px; margin: 0 auto; } .text-top { grid-column: 1 / -1; } .img-block { grid-row: 2 / 3; grid-column: 1 / 2; background-color: #ccc; /* 替换为图片 */ } .text-middle { grid-row: 2 / 3; grid-column: 2 / -1; } .text-bottom { grid-column: 1 / -1; }
<div class="grid-magazine"> <div class="text-top">Lorem ipsum dolor sit amet consectetur...</div> <div class="img-block"></div> <div class="text-middle">Adipisicing elit. Voluptates, quibusdam...</div> <div class="text-bottom">Sit amet consectetur adipisicing elit...</div> </div>
选型建议
- 方法1适合长文本自动适配,无需拆分内容,还可通过
circle()/ellipse()等函数实现不规则环绕效果 - 方法2适合需要精准控制文本段落位置的场景,排版稳定性更高
内容的提问来源于stack exchange,提问作者Mar
相关产品推荐
相关产品推荐

