如何改变 select 元素的高度

博客介绍了用CSS美化Select元素的难题,因各浏览器效果不一致且内部结构复杂。还提到Select元素的size属性可控制显示行数,给出用size属性设置option显示个数及用其他元素替代select模拟选择两种方法,并给出在线示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mozilla 对于美化 select 元素的样式有这样一段描述(用 CSS 美化 Select 元素):

众所周知,select 元素很难用 CSS 进行高效的设计。你可以影响任何元素的某些方面 - 例如,操纵框模型,显示的字体等,你可以使用 appearance 属性来删除默认的系统外观。
但是,这些属性不会在浏览器之间产生一致的结果,并且很难在列中将不同类型的表单元素相互排列。 select 元素的内部结构复杂,难以控制。 如果你想获得完全控制,你应该考虑使用一个具有良好设施的库来构建窗体小部件(例如jQuery UI),或者尝试使用非语义元素,JavaScript 和 WAI-ARIA 滚动自己的下拉菜单来提供语义。

Firefox 浏览器 select 原样式如下,当 option 超出 20 个元素时,展示 20 个元素,产生竖向滚动条:
Firefox 浏览器 select 原样式

不过 select 元素提供了 size 属性,来控制控件中显示的行数 —— option 元素的个数

size属性

如果控件显示为滚动列表框,则此属性表示为控件中同时可见的行数。浏览器不需要将选择元素呈现为滚动列表框。默认值为0

  1. 方法一:用 size 属性来设置 option 元素显示的个数
  • 当 option 的个数超出 5 个时,设置 select 的 size 为 6;
  • 当失去焦点时,设置 select 的 size 为默认值 0;
  • 当改变选择后,设置 select 的 size 为默认值 0。

改变后的样式如下:
Firefox 浏览器 select 高度改变

使用 size 属性改变 select 元素的高度 codepen 在线示例

  1. 方法二: 使用其他元素替代 select 元素,模拟 select 选择
  • 增加 input 元素提供选择域,以及显示选择的值;
  • 用 ul li 替代 select option 选择;
  • 当选择了某一 li,或者点击了空白区域,ul 隐藏;
  • 当点击了 input 后,ul 显示或隐藏。

改变后的样式如下:
使用其他元素替代 select 元素,模拟 select 选择
使用其他元素替代 select 元素,模拟 select 选择 codepen 在线示例(js 中需引入 jquery 库,效果才会生效)

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>

转载于:https://www.cnblogs.com/xinjie-just/p/11058327.html

在 UniApp 中实现点击事件修改元素高度的动态样式化,可以通过结合 `data` 属性、`methods` 方法以及 `uni.createSelectorQuery()` 来完成。基本思路是通过点击事件触发方法,更新数据状态,并根据新的状态值动态计算和设置目标元素高度。 ### 实现步骤 1. **定义数据状态**:在 `data` 中定义一个量来表示当前的高度或者控制展开/收起的状态。 2. **绑定点击事件**:为按钮或触发器绑定点击事件,用于切换状态。 3. **监听状态化并更新样式**:使用 `watch` 或直接在方法中调用 `uni.createSelectorQuery()` 获取实际高度,并更新对应的数据属性。 4. **动态绑定样式**:将最终的高度值绑定到视图层的内联样式上。 ### 示例代码 #### 模板部分(`.vue` 文件) ```html <template> <view class="container"> <!-- 可高度的内容区域 --> <view :style="{ height: contentHeight + 'px' }" class="content-box" ref="contentBox" > {{ longText }} </view> <!-- 点击按钮切换高度 --> <button @click="toggleHeight">切换高度</button> </view> </template> ``` #### 脚本逻辑部分 ```javascript <script> export default { data() { return { longText: '这是一个很长的产品描述文本...(此处可以放置任意长度的文本)', isExpanded: false, // 控制是否展开 contentHeight: 0, // 动态计算内容高度 maxHeight: 100 // 默认最大高度为 100px }; }, methods: { toggleHeight() { this.isExpanded = !this.isExpanded; if (this.isExpanded) { // 展开时获取真实高度 const query = uni.createSelectorQuery().in(this).select('.content-box'); query.boundingClientRect(res => { if (res) { this.contentHeight = res.height; // 设置为实际内容高度 } }).exec(); } else { this.contentHeight = this.maxHeight; // 收起时恢复默认最大高度 } } }, mounted() { // 初始化时设置默认高度 this.toggleHeight(); } }; </script> ``` #### 样式部分 ```css <style scoped> .container { padding: 20rpx; } .content-box { max-height: 100px; overflow: hidden; transition: height 0.3s ease-in-out; } </style> ``` ### 关键点说明 - 使用 `uni.createSelectorQuery()` 来获取 DOM 元素的实际高度,确保能够正确读取到渲染后的文本内容高度[^3]。 - 利用 `isExpanded` 控制展开与收起的状态,从而决定显示的高度值[^2]。 - 通过 `transition` 添加动画效果提升用户体验,使高度化更平滑。 - 如果内容特别长,也可以考虑结合 `@line-clamp` 或者 CSS 多行省略方案进行优化。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值