>  기사  >  웹 프론트엔드  >  uniapp에서 루프를 사용하여 너비를 결정하고 너비를 변경하는 방법

uniapp에서 루프를 사용하여 너비를 결정하고 너비를 변경하는 방법

PHPz
PHPz원래의
2023-04-18 14:09:21818검색

모바일 애플리케이션의 인기로 인해 개발자는 편리한 개발 도구와 프레임워크를 많이 제공했습니다. UniApp은 개발자가 동일한 코드를 사용하여 여러 플랫폼에서 애플리케이션을 구축할 수 있는 크로스 플랫폼 프레임워크입니다. UniApp에서는 일부 레이아웃 및 스타일 문제를 처리해야 하는 경우가 많습니다. 너비를 결정하고 너비를 변경하기 위해 루프를 수행하는 방법은 일반적인 문제 중 하나입니다.

우선, 우리가 달성하고자 하는 것은 모든 하위 요소의 너비의 합이 너비보다 작은 여러 하위 요소를 컨테이너에 배치하는 것입니다. 컨테이너의 경우 하위 요소의 너비를 컨테이너의 너비로 균등하게 나누어야 하며, 각 하위 요소의 너비는 너비의 합이 컨테이너의 너비보다 크면 지정된 값보다 작지 않아야 합니다. 컨테이너에 맞게 각 하위 요소의 너비를 비례적으로 줄여야 합니다.

다음으로 Vue에서 v-for 명령을 사용하여 루프에서 하위 요소를 렌더링하는 동시에 하위 요소의 너비를 저장하는 변수를 정의하고 실제 상황에 따라 그 값을 변경하는 것을 고려할 수 있습니다. 코드는 다음과 같습니다.

<template>
  <view class="container">
    <view class="item"
          v-for="(item, index) in itemList"
          :key="index"
          :style="&#39;width: &#39; + itemWidth[index] + &#39;px;&#39;">
      {{ item }}
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      itemList: ['Apple', 'Banana', 'Cherry', 'Grape', 'Orange'],
      containerWidth: 100, // 容器宽度
      itemWidth: [], // 子元素宽度
      minItemWidth: 30 // 子元素最小宽度
    }
  },
  mounted() {
    this.calculateWidth()
  },
  methods: {
    calculateWidth() {
      const totalWidth = this.itemList.reduce((pre, cur) => {
        return pre + this.calculateTextWidth(cur)
      }, 0)
      if (totalWidth < this.containerWidth) {
        // 宽度不足,均分
        const width = Math.floor(this.containerWidth / this.itemList.length)
        this.itemWidth = this.itemList.map(() => width)
      } else {
        // 宽度过多,按比例缩小
        let availableWidth = this.containerWidth
        const result = this.itemList.reduce((pre, cur) => {
          const curWidth = this.calculateTextWidth(cur)
          const minCurWidth = Math.min(curWidth, this.minItemWidth)
          const ratio = curWidth / minCurWidth
          pre.push({
            originalWidth: curWidth,
            availableWidth: Math.floor(availableWidth / ratio),
            ratio: ratio
          })
          availableWidth -= Math.floor(availableWidth / ratio)
          return pre
        }, [])
        this.itemWidth = result.map(item => {
          return Math.max(item.availableWidth / item.ratio, this.minItemWidth)
        })
      }
    },
    calculateTextWidth(text) {
      // 通过uni.createSelectorQuery获取元素实际宽度
      return uni.createSelectorQuery().select('.text-measure')
        .boundingClientRect(rect => {
          return rect.width
        }).exec()
    }
  }
}
</script>

<style>
.container {
  display: flex;
  flex-wrap: wrap;
}
.item {
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 5px;
}
.text-measure {
  visibility: hidden;
  position: absolute;
  left: -9999px;
}
</style>

위 코드의 구현 아이디어는 먼저 하위 요소의 너비 합과 컨테이너 너비의 관계를 계산한 다음, 필요한지 여부를 판단하는 것입니다. 하위 요소의 너비를 동일하게 하거나 실제 상황에 비례하여 줄인 후 최종적으로 계산된 하위 요소를 사용합니다. 요소 너비는 itemWidth 변수에 할당되고 v- for 지시문은 템플릿에서 하위 요소를 렌더링하는 데 사용됩니다. itemWidth变量,并在模板中使用v-for指令来渲染子元素。

需要注意的是,为了计算文本宽度,我们需要定义一个text-measure类的元素来进行实际测量,同时使用uni.createSelectorQuery

텍스트 너비를 계산하려면 실제 측정을 위해 text-measure 클래스의 요소를 정의하고 uni.createSelectorQuery를 사용해야 한다는 점에 유의하세요. 실제 요소 너비를 얻으려면.

요약하자면 UniApp은 다양한 모바일 애플리케이션 개발 문제를 해결하기 위해 많은 편리한 도구와 구성 요소를 제공하는 강력한 프레임워크입니다. 레이아웃 및 스타일 문제를 다룰 때 루프를 사용하여 너비를 결정하고 너비를 변경하는 것은 원하는 레이아웃 효과를 빠르게 구축하는 데 도움이 될 수 있는 매우 효과적이고 실용적인 방법입니다. 🎜

위 내용은 uniapp에서 루프를 사용하여 너비를 결정하고 너비를 변경하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.