2023-02-06 【踩坑】解决flex布局下ul的子元素不能水平居中的问题:改用div

在商品列表布局中遇到ul子元素(img和span)无法通过flex居中的问题,尝试修改ul宽度及设置flex布局无效。最终采用div替代ul成功实现子元素居中显示,分析了ul布局的潜在问题。
问题描述

在做商品列表时,发现div下的所有商品(ul)已经按照flex+换行成功布局,但是ul中的两个子元素:img图片标签和span文本标签不能正常居中显示
在这里插入图片描述
在这里插入图片描述

做过的尝试

尝试修改ul的宽度让它和子元素的图片一样宽,但是设置失败,加上!important也没有效果
尝试给ul也设置flex布局,主轴方向为垂直方向,然后设置居中,也不行

问题解决

使用div,不用ul(使用ul的失败原因仍未知)

完整代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    ul,
    li {
      list-style-type: none;
    }

    img {
      width: 50px;
      height: 50px;
      border-radius: 50%;
    }

    #container {
      width: 800px;
      height: 450px;
      background-color: bisque;

    }

    .one,
    .two {
      border: 1px solid blue;
      display: flex;
      justify-content: space-evenly;
    }

    .goods {
      width: 150px;
      height: 100px;
      border:1px solid red;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
    }
  </style>
</head>
<body>
  <div id="container">
  
    <div class="one">
      <ul class="goods">
        <img src="./img/1.png" alt="">
        <div class="text">天猫</div>
      </ul>
      <ul class="goods">
        <img src="./img/1.png" alt="">
        <div class="text">天猫</div>
      </ul>
      <ul class="goods">
        <img src="./img/1.png" alt="">
        <div class="text">天猫</div>
      </ul>
      <ul class="goods">
        <img src="./img/1.png" alt="">
        <div class="text">天猫</div>
      </ul>
      <ul class="goods">
        <img src="./img/1.png" alt="">
        <div class="text">天猫</div>
      </ul>
    </div>
    
    <div class="two">
      <div class="goods">
        <img src="./img/1.png" alt="">
        <div class="text">天猫</div>
      </div>
      <div class="goods">
        <img src="./img/1.png" alt="">
        <div class="text">天猫</div>
      </div>
      <div class="goods">
        <img src="./img/1.png" alt="">
        <div class="text">天猫</div>
      </div>
      <div class="goods">
        <img src="./img/1.png" alt="">
        <div class="text">天猫</div>
      </div>
      <div class="goods">
        <img src="./img/1.png" alt="">
        <div class="text">天猫</div>
      </div>
    </div>
  </div>
</body>
</html>
结果分析

在这里插入图片描述
上图中的one是用ul来布局的,two是用div来写的,它们都设置了类名class=“goods’”,和宽高,但是ul仍有自己的宽高,其子元素也不能成功居中
所以有更好的解决方法之前,商品列表尽量用div来布局

请帮我完善该vue项目下的响应式,使其网页设计的可以像香格里拉酒店官网一样简洁美观,<template> <!-- 体验页面 --> <div class="experience"> <!-- 顶部导航栏 --> <NavBar /> <div class="container"> <!-- 首图内容区域 --> <div class="content-banner"></div> <div class="content-wrapper"> <!-- 商务之旅 --> <div class="business margin-top-50"> <div class="img-box"> <responsive-image class="hd01" :small-image="hd01.smallImage1" :medium-image="hd01.mediumImage1" :large-image="hd01.largeImage1" alt-text="Description of image" /> <!-- <img src="../../assets/experience/hd-01.png" alt="" /> --> </div> <div class="text-box"> <p class="title-zh text-center" :class="{ textEn: $i18n.locale === &#39;en&#39; }"> {{ $t(&#39;Business&#39;) }}</p> <p class="content margin-top-20" :class="{ textEn: $i18n.locale === &#39;en&#39; }"> {{ $t(&#39;text7&#39;) }} </p> <p class="more" :class="{ textEn: $i18n.locale === &#39;en&#39; }"> {{ $t("more14") }} </p> </div> </div> <!-- 旅游度假 --> <div class="tourism margin-top-50"> <div class="text-box"> <p class="title-zh text-center" :class="{ textEn: $i18n.locale === &#39;en&#39; }">{{ $t(&#39;trip&#39;) }}</p> <p class="content margin-top-20" :class="{ textEn: $i18n.locale === &#39;en&#39; }"> {{ $t(&#39;text8&#39;) }} </p> <p class="more" :class="{ textEn: $i18n.locale === &#39;en&#39; }"> {{ $t("more15") }} </p> </div> <div class="img-box"> <responsive-image class="hd02" :small-image="hd02.smallImage2" :medium-image="hd02.mediumImage2" :large-image="hd02.largeImage2" alt-text="Description of image" /> <!-- <img src="../../assets/experience/hd-02.png" alt="" /> --> </div> </div> </div> <!-- 查看客房 --> <div class="content-swiper"> <div class="content-kefang"> <p class="title-zh text-center" :class="{ textEn: $i18n.locale === &#39;en&#39; }">{{ $t(&#39;Guest&#39;) }}</p> <!-- 轮播图 --> <div class="foot-swiper-box margin-top-50"> <RoomSwiper :bannerList="roomBannerList" /> </div> </div> <div class="content-kefang"> <p class="title-zh text-center" :class="{ textEn: $i18n.locale === &#39;en&#39; }">{{ $t(&#39;Apartment&#39;) }}</p> <!-- 轮播图 --> <div class="foot-swiper-box margin-top-50"> <RoomSwiper :bannerList="apartBannerList" /> </div> </div> <div class="device"> <p class="title-zh text-center" :class="{ textEn: $i18n.locale === &#39;en&#39; }">{{ $t(&#39;Facilities&#39;) }}</p> <div class="device-content margin-top-50"> <div class="img-box"> <img src="../../assets/experience/hd-01.png" alt="" /> </div> <div class="text-box"> <ul class="device-list"> <li class="text" :class="{ textEn: $i18n.locale === &#39;en&#39; }">{{ $t(&#39;WiFi&#39;) }}</li> <li class="text" :class="{ textEn: $i18n.locale === &#39;en&#39; }">{{ $t(&#39;individually&#39;) }}</li> <li class="text" :class="{ textEn: $i18n.locale === &#39;en&#39; }">{{ $t(&#39;TV&#39;) }}</li> <li class="text" :class="{ textEn: $i18n.locale === &#39;en&#39; }">{{ $t(&#39;laundry&#39;) }}</li> <li class="text" :class="{ textEn: $i18n.locale === &#39;en&#39; }">{{ $t(&#39;safes&#39;) }}</li> <li class="text" :class="{ textEn: $i18n.locale === &#39;en&#39; }">{{ $t(&#39;coffee&#39;) }}</li> <li class="text" :class="{ textEn: $i18n.locale === &#39;en&#39; }">{{ $t(&#39;Minibar&#39;) }}</li> </ul> </div> </div> </div> </div> </div> <!-- 滚动宣传图文本页面 --> <!-- <div v-for="item in roomBannerList" :key="item.id"> <h2>{{ $t(item.titleKey) }}</h2> <p>{{ $t(item.promptKey) }}</p> </div> --> <!-- 底部导航栏 --> <Footer /> </div> </template> <script> import RoomSwiper from "@/components/swiper/RoomSwiper.vue"; export default { name: "experience", components: { RoomSwiper, }, data() { return { msg: "Welcome to Your Vue.js App", // 响应式图片数据 hd01: { smallImage1: require("../../assets/experience/hd-01-mobile.jpg"), mediumImage1: require("../../assets/experience/hd-01.png"), largeImage1: require("../../assets/experience/hd-01.png"), }, hd02: { smallImage2: require("../../assets/experience/hd-02-mobile.jpg"), mediumImage2: require("../../assets/experience/hd-02.png"), largeImage2: require("../../assets/experience/hd-02.png"), }, roomBannerList: [ { id: 1, imgUrl: require("../../assets/room/room-01.png"), title: "豪华套房", prompt: "尊享私人空间,尽享奢华体验", }, { id: 2, imgUrl: require("../../assets/room/room-02.png"), title: "豪华楼层/豪华雅致大床房", prompt: "面积约为42平方米,装饰现代,舒适典雅。卧室和大理石浴室设气派的落地窗玻璃,可以俯瞰草原城市胜景或乌兰木伦湖滨美景。", }, { id: 3, imgUrl: require("../../assets/room/room-03.png"), title: "豪华双床房", prompt: "面积约为42平方米,装饰现代,舒适典雅。卧室和大理石浴室设气派的落地窗玻璃,可以俯瞰草原城市胜景或乌兰木伦湖滨美景。", }, ], apartBannerList: [ { id: 1, imgUrl: require("../../assets/room/room-01.png"), title: "豪华套房", prompt: "尊享私人空间,尽享奢华体验", }, { id: 2, imgUrl: require("../../assets/room/room-02.png"), title: "豪华楼层/豪华雅致大床房", prompt: "面积约为42平方米,装饰现代,舒适典雅。卧室和大理石浴室设气派的落地窗玻璃,可以俯瞰草原城市胜景或乌兰木伦湖滨美景。", }, { id: 3, imgUrl: require("../../assets/room/room-03.png"), title: "豪华双床房", prompt: "面积约为42平方米,装饰现代,舒适典雅。卧室和大理石浴室设气派的落地窗玻璃,可以俯瞰草原城市胜景或乌兰木伦湖滨美景。", }, ], }; }, }; </script> <style scoped> .content-banner { width: 100vw; height: 72rem; background-image: url("../../assets/banner/banner-02.png"); background-size: 100% 100%; } .business { width: 130rem; margin: 0 auto; display: flex; justify-content: space-between; margin-bottom:10rem; } .title-en, .title-zh { font-size: 3.6rem; color: rgb(202, 171, 98); text-align: left; } .content { width: 60rem; font-size: 2rem; line-height: 2; font-family: "Fangsong"; text-align: justify; } .img-box { width: 50rem; height: 30rem; } .more { width: 15rem; font-size: 2rem; line-height: 2em; color: rgb(202, 171, 98); text-align: center; cursor: pointer; background-color: rgb(238, 235, 235); } /* 通用属性 */ /* 文本居中 */ .text-center { text-align: center; } /* div居中 */ .div-center { margin: 2rem auto; } /* 上外边距2rem */ .margin-top-20 { margin-top: 2rem; } /* 上外边距5rem */ .margin-top-50 { margin-top: 5rem; } /* 下外边距2rem */ .margin-bottom-20 { margin-bottom: 2rem; } /* 度假旅行 */ .tourism { width: 120rem; margin: 0 auto; display: flex; justify-content: space-between; margin-bottom: 10rem; } /* 查看客房 */ .content-kefang { width: 100vw; height: 85rem; } /* 客房设施 */ .device-content { width: 100rem; margin: 10rem auto; display: flex; margin-bottom: 1rem; } .device-list { margin-left: 2rem; font-size: 2rem; text-align: left; line-height: 2em; font-family: &#39;FangSong&#39;; } .device { width: 100rem; margin: 0 auto; display: flex; flex-direction: column; align-items: center; justify-content: center; margin-bottom: 10rem; } .textEn { font-family: "Times New Roman", Times, serif !important; } /* 1024px以下 */ @media screen and (max-width: 1024px) { .content-banner { height: 70rem; } .business { flex-direction: column; align-items: center; } .tourism { flex-direction: column; align-items: center; } .content-wrapper { width: 160rem; } .title-en { font-size: 4.8rem; } .title-zh { font-size: 5.6rem; } .content { width: 74rem; font-size: 3rem; } .img-box{ width: 74rem; height: 42rem; } .more { width: 20rem; font-size: 2.4rem; } } .device-content { width: 100rem; margin: 10rem auto; display: flex; margin-bottom: 1rem; } .device-list { margin-left: 2rem; font-size: 2rem; text-align: left; line-height: 2em; font-family: &#39;FangSong&#39;; } .device { width: 100rem; margin: 0 auto; display: flex; flex-direction: column; align-items: center; justify-content: center; margin-bottom: 10rem; } @media screen and (max-width: 768px) { .content-banner { height: 82rem; background-image: url("../../assets/banner/banner-02-mobile.jpg"); } .business { flex-direction: column; align-items: center; } .tourism { flex-direction: column; align-items: center; } .content-wrapper { width: 190rem; } .img-box { order: 2; } .text-box { order: 1; } .title-en { font-size: 6rem; } .title-zh { font-size: 6.2rem; } .content { width: 160rem; font-size: 4rem; } .img-box { width: 110rem; height: 60rem; } .more { width: 30rem; font-size: 3.2rem; margin-bottom: 5rem; margin-left: 80rem; } } .device-content { width: 120rem; margin: 10rem auto; display: flex; margin-bottom: 1rem; flex-direction: row; margin-right: 10rem; } .device-list { margin-left: 10rem; font-size: 2rem; text-align: left; line-height: 2em; font-family: &#39;FangSong&#39;; margin-right: 10rem; } .device { width: 150rem; margin: 0 auto; display: flex; flex-direction: column; align-items: center; justify-content: center; margin-bottom: 10rem; margin-right: 10rem; } </style>
06-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端OnTheRun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值