uni-app弹出层uni-popup使用及修改默认样式的方法实例

uni-popup官方文档

我这里的背景是弹出一个选择规格的菜单。使用vue3+ts,使用组合式api

首先看看在vue3+ts+setup下的使用:

<template>
    <!-- 定义一个按钮,用于打开弹出层 -->
    <view style="width: 200px">
        <button @click="openSpecs">弹出</button>
    </view>
    <!-- 弹出层视图,注意这里的ref="popup",这里背景特意标红了,方便看到效果 -->
    <uni-popup class="updatePopup" background-color="red" ref="popup" type="center"> 你好 </uni-popup>
</template>

<script setup lang="ts">
    import { ref } from "vue";

    // 这里的这个变量名,必须和上面的ref="popup"的变量名相同,这样就相当于绑定了这个元素了
    const popup = ref(null);

    // 按钮调用该方法打开弹出层
    function openSpecs() {
        popup.value.open();
    }
</script>

<style>
</style>

从这里可以看出来,弹出层的整体是透明的,而主界面是随着内部的元素大小自适应的。

现在在弹出层中编写复杂的效果

我新建了一个selectSpecs.vue:

<template>
    <view class="background">
        <!-- 标题 -->
        <view style="text-align: center">
            <text class="title">{{ title }}</text>
        </view>
        <!-- 区域滚动视图 -->
        <scroll-view scroll-y="true" :style="'height:' + scrollH + 'px'">
            <!-- 结合分组和数据选择器展示数据,不是本文的重点 -->
            <uni-group mode="card" top="0" v-for="item in specsList" :key="item.key" :title="item.text"  id="group">
                <uni-data-checkbox mode="tag" :v-model="item.value" :localdata="item.option"></uni-data-checkbox>
            </uni-group>
        </scroll-view>
    </view>
</template>
<script setup lang="ts">
    import { onMounted, ref } from "vue";

    // 下面都是一些生成数据的逻辑,可以不关心。
    let title = "标题测试";

    interface iOption {
        key: number;
        text: string;
        disable: boolean;
        value: number;
    }

    interface iSpecs {
        key: number;
        text: string;
        value: number;
        option: iOption[];
    }

    const specsList: iSpecs[] = new Array<iSpecs>(3);
    for (let i = 0; i < 10; i++) {
        const optionList: iOption[] = new Array<iOption>(i + 1);
        for (let j = 0; j < i + 1; j++) {
            optionList[j] = {
                key: j,
                text: "属性" + j,
                disable: false,
                value: j,
            };
        }
        specsList[i] = {
            key: i,
            text: "规格" + i,
            value: i,
            option: optionList,
        };
    }

    // 这里是为了确定滚动区域的高度,不给高度不滚动的,这里的效果或许还有点问题。
    const scrollH = ref(0);
    onMounted(() => {
        let group = uni.createSelectorQuery().select("#group"); //根据id获取一个规格组的高度
        // prettier-ignore
        group.boundingClientRect((data) => {
            //计算高度:高度控制在3个规格组的高度以内,即3个组以内不需要滚动,+10是因为实测获取的高度比真实高度少一点,不加的话就会需要小范围的滚动一下
            if (specsList.length<3){
                scrollH.value=(data.height+10)* specsList.length
            }else{
                scrollH.value=(data.height+10)*3
            }
            }).exec();
    });
</script>
<style>
    .background {
        background-color: white;
        border-radius: 10px;
    }
    .title {
        font-size: x-large;
        font-family: "Times New Roman", Times, Cursive;
        text-align: center;
    }
</style>

这里内容看似很长,其实都是为了展示效果,可以不看细节。可以看看我对滚动区域的高度的设置方法。

引入的方式是将上面“你好”改为如下:

<uni-popup background-color="red" ref="popup" type="center">
     <SelectSpecs></SelectSpecs>
</uni-popup>

当然组件也是要import的:

<script setup lang="ts">
    import { ref } from "vue";
    import SelectSpecs from "../goods/view/selectSpecs.vue"; //导入组件
	.......
</script>

当我数据小的时候,他的效果是这样的:

那个四个红角就是背景的颜色。这个效果还可以

当我数据多了之后:

因为宽度自适应,所以宽度是占满了整个屏幕的宽度。你看属性9都换行了。而我希望我的弹出层上下左右都留出一点空间,这样才好看。

我首先想到的是,给这个宽度限制一个最大百分比,用max-width: 80%;,加在background 样式的里面,因为这是整个背景的视图嘛,结果效果是这样的:

红色背景依然是整个屏幕的宽度,但内容跑左边去了,这不是我想要的效果。再看看数据量小的效果:

这看起来是白色框框占红色背景的80%呀,并不是内容占屏幕的80%呀。还不会居中了。

看来是我的样式加的位置不对,但是uni-popup也没提供这个参数。在uni-popup嵌套一层 view来控制样式:

<template>
    <!-- 定义一个按钮,用于打开弹出层 -->
    <view style="width: 200px">
        <button @click="openSpecs">弹出</button>
    </view>
    <!-- 弹出层视图,注意这里的ref="popup",这里背景特意标红了,方便看到效果 -->
    <view style="max-width: 80%">
        <uni-popup background-color="red" ref="popup" type="center">
            <SelectSpecs></SelectSpecs>
        </uni-popup>
    </view>
</template>

这样也没效果。

于是debug发现,真正控制弹出层主窗体大小的样式是“.uni-popup__wrapper”,难道我要去修改源代码吗?这样不太好,不利于代码移植。

于是就想着有没有办法从子组件修改父组件的样式的方法,结果没找到,倒是找到了父组件修改子组件的样式的方法,于是代码稍微修改一下:

    <uni-popup class="updatePopup" background-color="red" ref="popup" type="center">
        <SelectSpecs></SelectSpecs>
    </uni-popup>

增加了一个样式:

<style scoped>
    .updatePopup :deep(.uni-popup__wrapper) {
        max-width: 80%;
    }
</style>

这里注意.vue文件允许有多组<style>,我这里就是新建的一个<style scoped>,然后用深度选择器去修改子组件的样式。

其实父组件与.uni-popup__wrapper中间还隔着一两层view节点,但是:deep也是可以找到这个样式去修改的。

最后效果是这样的:

即使数据多的时候,它也不会把屏幕宽度占满。

其实也是学会了一招修改子组件的样式。

补充:uniapp uni-popup弹出层组件 弹窗 无法弹出 自定义样式问题

之前用到弹出层组件时发现弹出时会有一层灰色的遮罩,后来调试了几次发现是因为没有自定义给弹出层宽高,尝试了几次终于做到自己想要的效果,话不多说,直接附上完整代码:

效果图:

<template>
	<view>
		<view class="sign_text" @tap="toggle('center')">
			<text style="line-height: 60px;margin-top: 12px;">点击弹出</text>
		</view>
		<!-- 普通弹窗 -->
		<uni-popup ref="popup" background-color="#fff">
			<view class="popup-content" :class="{ 'popup-height': type === 'left' || type === 'right' }">
				<view style="color: green;">
					这是一个弹窗
				</view>
				<view style="color: red;" @click="close()">
					关闭弹窗
				</view>
			</view>
		</uni-popup>
	</view>
</template>

<script>
	export default {
		data() {
			return {

			}
		},
		methods: {
			//弹窗开启
			toggle(type) {
				this.type = type
				this.$refs.popup.open(type)
			},
			//弹窗关闭
			close() {
				this.$refs.popup.close()
			},

		}
	}
</script>

<style>
	.popup-content {
		display: flex;
		flex-direction: row;
		align-items: center;
		justify-content: center;
		padding: 15px;
		height: 200px;
		width: 280px;
		background-color: #fff;
		border-radius: 10px;
	}

</style>

下面教一下不会灵活使用的同学这个组件应该怎么用

一、uni-popup弹出层

官网组件地址:https://ext.dcloud.net.cn/pluginid=329

可以先翻看一下官网的介绍,很有用。

二、使用步骤

.首先要去官网把这个组件导入到项目中或者下载到本地,常规放在components文件目录下:

最好是这三个都要一起下载,这样用的时候比较方便,使用的时候按需引入,自定义组件样式就好了

总结

到此这篇关于uni-app弹出层uni-popup使用及修改默认样式的文章就介绍到这了,更多相关uni-app弹出层uni-popup使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用uni-app打包H5的图文教程

    1. 找到项目中 manifest.json --- H5 配置---运行时的基础路径, 将路径修改为 相对路径(./ ) 2. 修改完后,点击工具栏 --- 发行 --- 网站pc web或手机 h5 3. 弹出弹窗,修改网站标题与网站域名(网站域名取对应项目的域名,一般为https/http开头)填完后直接点击发行. 4. 点击发行后如图 5. 发行成功后,找到 unpackage --- dist --- build --- h5 文件夹, 在外部资源中打开,将 h5 文件夹打包成 zip

  • uni-app禁用返回按钮/返回键的具体实现

    目录 前言 实现 具体演示代码 附:uni-app H5的返回拦截经验分享 总结 前言 使用uni-app开发原生应用时,遇到需求: 需要禁用物理返回按钮.手势返回. uni.navigateBack仍可使用. 实现 当前页面的onBackPress()中,禁用物理返回 pages.json中,去除当前页面的返回按钮 当前页面的mounted()中,隐藏当前页面的返回按钮(针对pages.json中设置无效的情况) 具体演示代码 1.当前页面中,在onBackPress()控制是否禁用返回按钮.

  • uni-app动态修改主题色的方法详解

    目录 前言 一.uni.scss 使用方式 二.暗黑主题 三.自定义主题配置 1.在根目录下新建 theme 文件夹 css-theme uni.scss中引入 css-variate cue-theme main.js 导入 system-theme 2.vuex 配置 index.js 全局导出 main.js中导入 3.页面中使用 四.黑夜 白天主题展示 总结 前言 老是碰到初版制作完成没多久,就整一出说什么要更改整个项目的色彩体系.真的是宝宝心里苦啊! 起初都是通过uni项目自带的uni

  • uni-app使用swiper实现轮播图的方法

    目录 uni-app轮播图实现之swiper 补充:uniapp swiper 自定义轮播图指示点 总结 uni-app轮播图实现之swiper 首先在data中定义一个图片数据的对象数组 data() { return { rotation: [ { id: 1, url: 'https://imgcps.jd.com/ling4/100035927374/5Lqs6YCJ5aW96LSn/5L2g5YC85b6X5oul5pyJ/p-5bd8253082acdd181d02fa42/60f0

  • uni-app路由配置文件pages.json平台化拆分

    目录 对uni-app路由配置文件pages.json进行平台化拆分 例子: 优化思路: 过程: 对uni-app路由配置文件pages.json进行平台化拆分 背景:公司打造小程序矩阵化,以uni-app作为技术栈生成不同平台的小程序代码.小程序项目包含5个平台的代码,虽然是一份代码运行5个平台,但是各个平台又有差异,在代码里面需要做很多条件编译进行兼容处理.随着项目的壮大与页面的增多,控制路由的pages.json已经异常庞大且代码可读性差(想找一个页面需要找到上下文切换,浪费时间并且可能误

  • uni-app多环境部署解决方案详解

    目录 前言 尝试几种方式 解决方案 部署方式 获取接口 部署路径 命令行 其他 总结 前言 最近几周都在处理公司的移动业务,而为在后期能统一多端,解放自己,迎合公司的技术栈:选用了 uni-app 来开发.开发前期重新对公司移动业务做深入了解,重构大部分业务逻辑,也抽离出基础组件:但实际到部署的时候,出现来问题:由于现在只考虑 H5 端,部署和测试会出现多环境配置,但是我使用的 HBuilderX 工具创建的工程,所以只存在开发环境:development 和生产环境:production. 尝

  • Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法

    这两天要用到正好练练手,比想象中碰到的问题要多,比如: ie6背景透明 ie6居中显示 还有对js对象的理解 openID=显示按钮,conID=需要显示的div,closeID=关闭按钮 解决了: 1.可以遮挡ie6下的select元素 但是在ie6下div没有透明度 2.弹出的div可以一直在浏览器屏幕中间显示 问题: 1.目前不支持.class 只支持#id 2.需要显示的div需要自己设置css 3.在ie6下需要设置css 例如div {_position: absolute;_top

  • vue-cli脚手架引入弹出层layer插件的几种方法

    1.如何引入 在vue-cli里,引入文件有几钟方法 一种是用npm或者cnpm指令去下载对应的插件,然后在main.js里用import方法引入,这里不讨论这种方法 我比较喜欢采用的是直接下载对应的js,然后引入到vue项目中去 问题来了,如何引入呢 方法如下: 下载对应的js文件或者css文件,一般下载插件相关联的都会在一起 进入vue-cli项目工程里的index.html文件,分别引入css文件和js文件 在这里,分别是 <link rel="stylesheet" hr

  • js与css实现弹出层覆盖整个页面的方法

    本文实例讲述了js与css实现弹出层覆盖整个页面的方法.分享给大家供大家参考.具体实现方法如下: 弹出层透明背景加框的常用样式和结构如下: 复制代码 代码如下: .alertMessageBg{ position:fixed; _position:absolute; width:100%; height:100%; left:0; top:0; background:#000; opacity:0.5; -moz-opacity:0.5; filter:alpha(opacity=50); z-

  • 基于jquery的blockui插件显示弹出层

    blockui可以在你发送ajax请求的时候,显示一个遮罩层禁止用户对页面进行操作并显示提示信息:或者用来显示一个登陆窗口,也可用来显示图片等. blockui插件主要使用blockUI和unblockUI两个方法来控制弹出层的显示或者隐藏,可以在blockUI方法中指定一些参数,来控制弹出层显示的内容,大小,位置等.blockUI方法的常用的参数有:message,css,overlayCSS,showOverlay. message:主要用来设置要显示的内容,可以直接设置为一段文字,html

  • 在vant中使用时间选择器和popup弹出层的操作

    我就废话不多说了,大家还是直接看代码吧~ <template> <div class="page"> <van-cell-group> <van-cell title="选择日期" :value="datetime" arrow @click="showDatePicker = !showDatePicker" ></van-cell> </van-cell-g

  • uniapp组件uni-popup弹出层的使用

    目录 一.基本用法 二.自定义弹出层(dialog + message) 示例 三.提交信息 (input + 延迟关闭) 四.底部分享示例 官方示例:uni-popup 弹出层 - DCloud 插件市场 弹出层组件用于弹出一个覆盖到页面上的内容,使用场景如:底部弹出分享弹窗.页面插屏广告等 一.基本用法 <template> <view> <button type="primary" @click="toggle('top')"&g

  • vue3弹出层V3Popup实例详解

    Vue3-Popup 基于vue3构建的手机端自定义弹层组件. 一款集合了msg.alert.dialog.modal.actionSheet.toast等多种效果的Vue3自定义弹层组件.支持上下左右弹出.圆角.自定义弹层样式.多按钮及长按/右键功能. 引入v3popup // 在main.js中全局引入 import { createApp } from 'vue' import App from './App.vue' // 引入弹窗组件v3popup import V3Popup fro

  • jQuery弹出层始终垂直居中相对于屏幕或当前窗口

    弹出层永远是一个前端必须搞定的东西,一般情况下,如果弹出层有固定的高和宽,用样式即可搞定,但是如果碰到没有固定高或者固定宽或者固定高和宽的时候,我们就需要用JS去处理,去动态获取当前窗口高或者宽:今天弄了2种情况,一个是相对于屏幕窗体,一个是相对于当前的窗口,看代码,或许对你有用: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR

  • JQuery弹出层示例可自定义

    1.创建一个jsp页面,内容如下,js和css根据自己的实际情况而定 复制代码 代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http

  • 详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】

    目录 一.AJAX示例 1.1.优点 1.2.缺点 1.3.jQuery AJAX示例 二.延迟对象(Deferred) 2.1.回调函数 2.2.deferred.done 三.跨域 3.1.什么是跨域 3.2.JSONP跨域 3.3.jQuery使用JSONP跨域 3.4.跨域资源共享(CORS) 3.5.小结 四.弹出层 五.模板引擎 5.1.Hello World 5.2.方法 5.3.与AJAX结合应用 六.示例下载 一.AJAX示例 AJAX全称为"Asynchronous Java

随机推荐