CSS布局中如何让绝对定位可点击的点的位置不随屏幕大小变化而变化?

<template>
  <view class="station">
    <!-- <collect></collect> -->
    <view class="container">
      <div style="text-align: center;">点击地图上站点可跳转至站点详情</div>
      <u-image src="/static/images/db.jpg" width="100%" height="auto" mode="widthFix" class="map">
      </u-image>
      <!-- 站点模拟点击区域 -->
      <view class="mzl" @click="test"></view>
      <view class="changchun" @click="goStation('长春')"></view>
      <view class="atl" @click="goStation('阿勒泰')"></view>
      <view class="yl" @click="goStation('伊犁')"></view>
      <view class="wlmq" @click="goStation('乌鲁木齐')"></view>
      <view class="ks" @click="goStation('喀什')"></view>
      <view class="bj" @click="goStation('北京')"></view>
      <view class="qd" @click="goStation('青岛')"></view>
      <view class="ls" @click="goStation('拉萨')"></view>
      <view class="sz" @click="goStation('苏州')"></view>
      <view class="xm" @click="goStation('厦门')"></view>
      <view class="xx" @click="goStation('新乡')"></view>
      <view class="xian" @click="goStation('西安')"></view>
      <view class="lz" @click="goStation('兰州')"></view>
      <view class="cq" @click="goStation('重庆')"></view>
      <view class="gz" @click="goStation('广州')"></view>
      <view class="gl" @click="goStation('桂林')"></view>
      <view class="km" @click="goStation('昆明')"></view>
      <view class="hk" @click="goStation('海口')"></view>
    </view>

    
    
  </view>
</template>

<script>
import collect from "@/components/collect/index.vue"
export default {
  components: {
    collect
  },
  data() {
    return {
      siteList: []
    };
  },
  created() {
    this.getStation()
  },

  methods: {
    test() {
      console.log('点击')
    },
    goStation(val) {
      console.log(val, '点击')
      let obj = this.siteList.find((item) => item.siteName === val);
      uni.navigateTo({
        url: `/pages/richText/station?id=${obj.siteId}&type=${obj.hjType}`,
      })

    },

  },

};
</script>

<style lang="scss" scoped>
.container {
  position: relative;
  width: 100%;
  height: auto;
}

.point {
  position: absolute;
  width: 20px;
  height: 20px;
  z-index: 2;
  background-color: red;
}

.text {
  text-indent: 20px;
  line-height: 35px;
}

.map {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  z-index: 1;
}

以上页面中 在地图上模拟了很多可以点击的点,但是随着设备屏幕大小变化之后 所有点的位置发生改变,想要把这些点的位置固定 不随着屏幕大小变化而变化 要怎么做

.station {
  padding: 10px;
}

.st {
  margin: 20px 0;

  span {
    display: inline-block;
    margin: 5px 10px;
  }

}

.mzl {
  @extend .point;
  top: 181rpx;
  right: 194rpx;
}

.changchun {
  @extend .point;
  top: 243rpx;
  right: 125rpx;
}

.atl {
  @extend .point;
  top: 203rpx;
  right: 466rpx;

}

.yl {
  @extend .point;
  top: 236rpx;
  right: 513rpx;
}

.wlmq {
  @extend .point;
  top: 278rpx;
  right: 472rpx;
  width: 30px;
  height: 10px
}

.ks {
  @extend .point;
  top: 267rpx;
  right: 588rpx;
}

.bj {
  @extend .point;
  top: 331rpx;
  right: 28%;
}

.qd {
  @extend .point;
  top: 370rpx;
  right: 14%;
  width: 40px;
  height: 10px;
}

.ls {
  @extend .point;
  top: 436rpx;
  width: 20px;
  right: 65%;
}

.sz {
  @extend .point;
  top: 436rpx;
  right: 160rpx;
}

.xm {
  @extend .point;
  top: 476rpx;
  right: 169rpx;
}

.xx {
  @extend .point;
  top: 380rpx;
  right: 230rpx;
}

.xian {
  @extend .point;
  top: 393rpx;
  right: 275rpx;
}

.lz {
  @extend .point;
  top: 370rpx;
  right: 326rpx;
}

.cq {
  @extend .point;
  top: 452rpx;
  right: 40%;
}

.gz {
  @extend .point;
  top: 513rpx;
  right: 223rpx
}

.gl {
  @extend .point;
  top: 513rpx;
  right: 272rpx
}

.km {
  @extend .point;
  top: 513rpx;
  right: 342rpx
}

.hk {
  @extend .point;
  top: 581rpx;
  right: 35%;
}
</style>
阅读 1.6k
avatarAI BotBETA

要让绝对定位的可点击点的位置不随屏幕大小变化而变化,你需要确保这些点的定位是相对于一个固定大小的容器进行的。在你的代码中,虽然你已经使用了 position: relative;.container 上,但是部分点的定位使用了百分比(如 .bj, .ls, .cq, .hk)和 rpx(如 .mzl, .changchun, .atl 等),这些单位会根据屏幕大小变化。

解决方案

  1. 使用固定的像素值:将所有定位点改为使用固定的像素值(px),这样它们的位置就不会随屏幕大小变化。
  2. 确保容器大小固定:确保 .container 有一个固定的大小,这样即使屏幕大小变化,容器的大小和内部元素的定位也不会改变。
  3. 调整布局以适应不同屏幕:如果必须使用响应式设计,考虑使用媒体查询(media queries)来调整不同屏幕尺寸下的布局,但确保每个屏幕尺寸下点的位置是固定的。

修改后的 CSS 示例(只展示部分点的修改):

<style lang="scss" scoped>
.container {
  position: relative;
  width: 100%; /* 可以考虑设置一个具体的像素值,如 800px,如果需要固定大小 */
  height: auto; /* 或者一个具体的像素值,如 600px */
  max-width: 800px; /* 限制最大宽度 */
  margin: 0 auto; /* 居中 */
}

.point {
  position: absolute;
  width: 20px;
  height: 20px;
  z-index: 2;
  background-color: red;
}

/* 其他样式... */

.mzl {
  @extend .point;
  top: 50px; /* 使用固定的像素值 */
  right: 50px; /* 使用固定的像素值 */
}

.changchun {
  @extend .point;
  top: 70px; /* 使用固定的像素值 */
  right: 35px; /* 使用固定的像素值 */
}

/* 对于需要响应式设计的部分,可以使用媒体查询 */
@media (max-width: 600px) {
  .container {
    width: 100%; /* 或者一个更小的固定值 */
  }
  
  .mzl {
    top: 40px; /* 调整以适应小屏幕 */
    right: 40px; /* 调整以适应小屏幕 */
  }
  
  .changchun {
    top: 60px; /* 调整以适应小屏幕 */
    right: 30px; /* 调整以适应小屏幕 */
  }
  
  /* 其他点的调整... */
}
</style>

注意:如果你使用的是 rpx 单位(这通常是在微信小程序中使用的),它本身就是一种响应式单位,会根据屏幕宽度进行缩放。在这种情况下,你需要改用 px 或其他非响应式单位来确保位置固定。如果你的应用是微信小程序,并且你希望保持响应式设计,那么你可能需要重新考虑布局策略,或者接受这些点会随屏幕大小变化。

2 个回答

你的需求应该是在地图上覆盖一层可点击的区域,所以可点击区域应该始终和图片位置保持一致,需要将可点击区域和图片包裹一层父级 container , 两者相对于 container 定位

<div class="container">
    <image class="image"/>
    <view class="click-area-1 click-area">点击区域</view>
    <view class="click-area-2 click-area">点击区域</view>
</div>

<style>
.container {
    position: relative;
    width: 500px;
    height: 500px;
}
.image{
    width: 100%;
    height: 100%;
}

.click-area{
     position: absolute;
     z-index: 1
}
// 单独控制每个区域的具体位置
.click-area-1{
    top: xxpx
    left: xxpx
}
.click-area-2{
    top: xxpx
    left: xxpx
}



</style>

你把“rpx”换成百分比,然后用宽、高的百分比来控制地图的比例不变,再把点的大小调成相对值就行。

.container {
  position: relative;
  width: 100%;
  // 设一个固定的宽高比,比如地图的比例是 16:9。
  padding-bottom: 56.25%; // 16:9 = 56.25%
  height: 0;
  overflow: hidden;
}

.map {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
}

.point {
  position: absolute;
  width: 2%; // 相对宽度
  height: 2%;
  z-index: 2;
  background-color: red;
}

.mzl {
  @extend .point;
  top: 25%;
  right: 27%;
}

.changchun {
  @extend .point;
  top: 33%;
  right: 17%;
}

.atl {
  @extend .point;
  top: 28%;
  right: 65%;
}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题