You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将PHP单列展示的博客文章修改为三列不等量分栏布局

实现方案

你需要先把查询到的已发布文章先统一存入数组,再按位置分配到三列中,配合CSS实现布局效果,修改步骤如下:

步骤1:修改PHP数据读取逻辑

把原来直接循环输出的逻辑改成先归集有效文章:

<?php
$posts = []; // 存储所有有效已发布文章
$query = "SELECT * FROM posts WHERE tag='us' ORDER BY updated_on DESC";
$run_query = mysqli_query($conn, $query) or die(mysqli_error($conn));
if (mysqli_num_rows($run_query) > 0) {
    while ($row = mysqli_fetch_assoc($run_query)) {
        if ($row['status'] === 'published') {
            $posts[] = $row; // 仅存入已发布的文章
        }
    }
}
if (empty($posts)) {
    echo "暂无发布的文章";
}
?>

步骤2:新增CSS布局样式

定义三列网格布局,以及首篇文章的放大样式:

/* 三列容器 */
.post-grid {
    display: grid;
    grid-template-columns: 2fr 1fr 1fr; /* 第一列占比更宽,适配大文章 */
    gap: 2rem;
    width: 100%;
    max-width: 1200px;
    margin: 0 auto;
}
.post-column {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
}
/* 首篇特稿样式 */
.featured-post .post-img img {
    width: 100%;
    height: auto;
    max-height: 400px;
    object-fit: cover;
}
.featured-post .post-title {
    font-size: 2rem;
    margin: 1rem 0;
}
.featured-post .post-excerpt {
    font-size: 1.1rem;
    line-height: 1.6;
}
/* 普通文章样式 */
.normal-post .post-img img {
    width: 100%;
    height: auto;
    max-height: 180px;
    object-fit: cover;
}
.normal-post .post-title {
    font-size: 1.2rem;
    margin: 0.8rem 0;
}
.normal-post .post-excerpt {
    font-size: 0.95rem;
    line-height: 1.5;
}
.post-meta {
    font-size: 0.85rem;
    color: #666;
    margin-top: 0.5rem;
}
.post-meta a {
    color: #333;
    text-decoration: none;
}

步骤3:分列渲染文章

在页面输出位置按列渲染对应文章:

<?php if (!empty($posts)): ?>
<div class="post-grid">
    <!-- 第一列:仅首篇特稿 -->
    <div class="post-column">
        <div class="featured-post">
            <div class="post-img">
                <img src="allpostpics/<?php echo $posts[0]['image']; ?>" alt="<?php echo htmlspecialchars($posts[0]['title']); ?>">
            </div>
            <h3 class="post-title">
                <a href="publicposts.php?post=<?php echo $posts[0]['id']; ?>"><?php echo htmlspecialchars($posts[0]['title']); ?></a>
            </h3>
            <p class="post-excerpt"><?php echo substr(htmlspecialchars($posts[0]['content']), 0, 300) . '.........'; ?></p>
            <div class="post-meta">
                <p>Posted on <?php echo $posts[0]['postdate']; ?></p>
                <p>By <a href="#"><?php echo htmlspecialchars($posts[0]['author']); ?></a></p>
            </div>
        </div>
    </div>

    <!-- 第二列:2篇普通文章 -->
    <div class="post-column">
        <?php for ($i = 1; $i <= 2; $i++): ?>
            <?php if (isset($posts[$i])): ?>
            <div class="normal-post">
                <div class="post-img">
                    <img src="allpostpics/<?php echo $posts[$i]['image']; ?>" alt="<?php echo htmlspecialchars($posts[$i]['title']); ?>">
                </div>
                <h3 class="post-title">
                    <a href="publicposts.php?post=<?php echo $posts[$i]['id']; ?>"><?php echo htmlspecialchars($posts[$i]['title']); ?></a>
                </h3>
                <p class="post-excerpt"><?php echo substr(htmlspecialchars($posts[$i]['content']), 0, 150) . '.........'; ?></p>
                <div class="post-meta">
                    <p>Posted on <?php echo $posts[$i]['postdate']; ?></p>
                    <p>By <a href="#"><?php echo htmlspecialchars($posts[$i]['author']); ?></a></p>
                </div>
            </div>
            <?php endif; ?>
        <?php endfor; ?>
    </div>

    <!-- 第三列:3篇普通文章 -->
    <div class="post-column">
        <?php for ($i = 3; $i <= 5; $i++): ?>
            <?php if (isset($posts[$i])): ?>
            <div class="normal-post">
                <div class="post-img">
                    <img src="allpostpics/<?php echo $posts[$i]['image']; ?>" alt="<?php echo htmlspecialchars($posts[$i]['title']); ?>">
                </div>
                <h3 class="post-title">
                    <a href="publicposts.php?post=<?php echo $posts[$i]['id']; ?>"><?php echo htmlspecialchars($posts[$i]['title']); ?></a>
                </h3>
                <p class="post-excerpt"><?php echo substr(htmlspecialchars($posts[$i]['content']), 0, 120) . '.........'; ?></p>
                <div class="post-meta">
                    <p>Posted on <?php echo $posts[$i]['postdate']; ?></p>
                    <p>By <a href="#"><?php echo htmlspecialchars($posts[$i]['author']); ?></a></p>
                </div>
            </div>
            <?php endif; ?>
        <?php endfor; ?>
    </div>
</div>
<?php endif; ?>

补充说明

  • 代码已修复原代码中多余的</a>闭合标签、重复class属性的问题,同时新增了htmlspecialchars处理输出内容,避免XSS安全风险
  • 若文章数量不足6篇,对应位置会自动留空不会报错,可根据业务需求调整每列展示的文章数量
  • 可自行调整CSS中的列宽比例、字体大小、图片高度等参数匹配站点设计风格

内容的提问来源于stack exchange,提问作者Ethan Denis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 20:27:01