uniapp/html修改页面中的内容指定字段样式

1. html页面中的内容替换,或改变某些字的颜色

  前端使用innnerHtml显示返回值+innerHtml文字显示两种不同的颜色(两部分显示颜色不一样)。
  特别注意:你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容插值。
在这里插入图片描述

在这里插入图片描述

1.1. html字符串改变某些字的颜色

  需求:要文本框的字体部分改变颜色、大小、换行等功能。在了解需求后,文本框input发现完全满足不了现需求,于是寻求其它解决方案。
  给定字符串
  let text = ‘这是一段正常的文字\r\n这是换行(这是提示的红色)\r\n这段文字为可编辑状态’

1.1.1. 初始方案

  当发现文本框满足不了需求时,我第一感觉时不想麻烦,虽然把每一段内容拆成单独的input标签也可实现但是工作量太大,太过麻烦。我的思路是利用盒子的属性contenteditable直接将内容丢进div。
  llet text = ‘这是一段正常的文字\r\n这是换行(这是提示的红色)\r\n这段文字为可编辑状态’;

let dom = document.getElementById('text');
dom.innerHTML= text;
// 当编辑完成后 在取得div的内容就可以了
let resultText = document.getElementById('text').innerHTML;
console.log(resultText);

  但是这样有一点满足不了,text文本中的\r\n识别不了

1.1.2. 最终方案

  既然div识别不了\r\n那就换个能识别的标签,完美解决。

et text = '这是一段正常的文字\r\n这是换行(这是提示的红色)\r\n这段文字为可编辑状态';
let dom = document.getElementById('text');
dom.innerHTML= text;
// 当编辑完成后 在取得div的内容就可以了
let resultText = document.getElementById('text').innerHTML;
console.log(resultText);

1.2. html字符串改变某些字的颜色

在这里插入图片描述

unction strRelace(){
   
   
    var xsxf = document.getElementById("str_id");
    xsxf.innerHTML="字段1测试字段2"
    var str1 = "字段1";
    var str2 = "字段2";
    var reg=eval("/"+str1+"/gi");
    var reg3=eval("/"+str2+"/gi");
    xsxf.innerHTML =  xsxf.innerHTML.replace(
        reg,"<font color='#FF0000'>字段1</font>");
    xsxf.innerHTML =  xsxf.innerHTML.replace(
        reg3,"<font color='#00FF00'>字段2</font>");
}

1.3. html列表字符串改变某些字的颜色

在这里插入图片描述

1.3.1. page-str-replace.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>搜索查询</title>
    <meta name="viewport"
          content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Cache-Control" content="no-cache">
    <meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">
    <script type="text/javascript" src="../static/js/init-rem.js"></script>
    <link rel="stylesheet" type="text/css" href="../static/css/mui.min.css"/>
    <script type="text/javascript" src="../static/js/mui.min.js"></script>
    <link rel="stylesheet" type="text/css" href="../static/css/mui-icons-extra.css"/>
    <link rel="stylesheet" type="text/css" href="../static/css/mui.loading.css"/>
    <script type="text/javascript" src="../static/js/mui.loading.js"></script>
    <script type="text/javascript" src="../static/js/my-mui-loading.js"></script>
    <link rel="stylesheet" type="text/css" href="../static/css/mescroll.min.css"/>
    <script type="text/javascript" src="../static/js/mescroll.min.js"></script>
    <link rel="stylesheet" type="text/css" href="../static/css/selectFilter.css"/>
    <script type="text/javascript" src="../static/js/jquery-3.1.1.min.js"></script>
    <script type="text/javascript" src="../static/js/selectFilter.js"></script>
    <script type="text/javascript" src="../static/helper/net-helper.js"></script>
    <script type="text/javascript" src="../static/helper/init-helper.js"></script>
    <script type="text/javascript" src="../static/constant/sp-constant.js"></script>
    <link rel="stylesheet" type="text/css" href="../static/css/base.css"/>
    <link rel="stylesheet" type="text/css" href="../css/page-str-replace.css"/>
    <script src="../static/js/vconsole.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        //var vc = new VConsole()
    </script>
</head>
<body>
<div class="base-body-layout">
    <div class="base-body-inner-layout">
        <!--标题区域-->
        <div class="base-title-bar">
            <span class="base-title-back" onclick="history.go(-1)">
                <img src="../img/icon/icon_back.png"/>
            </span>
            <h1>搜索查询</h1>
            <span class="base-title-back"></span>
        </div>
        <!--内容区域-->
        <div class="base-mescroll">
            <div id="str_id">字段1测试字段2</div>
            <!--搜索布局-->
            <div class="base-query-layout">
                <div class="base-query-input">
                    <span class="base-query-img">
                        <img src="../img/icon/icon-query-gray.png"/>
                    </span>
                    <input id="query_id" class="base-search-input"
                           type="text" placeholder="请输入搜索内容"/>
                    <span id="clear_input_id" class="base-search-clear">×</span>
                </div>
                <span id="query_submit_id" class="base-query-title">搜索</span>
            </div>
            <ul id="list_id" class="list-layout"></ul>
        </div>
    </div>
</div>
<script type="text/javascript" src="../js/page-str-replace.js"></script>
</body>
</html>

1.3.2. page-str-replace.css

/*搜索布局*/
.base-query-layout {
   
   
    width: 100vw;
    display: flex;
    display: -webkit-flex;
    flex-direction: row;
    align-items: center;
    -webkit-align-items: center;
    padding: 0.1rem 0.2rem 0.15rem;
    background-color: white;
}

.base-query-input {
   
   
    display: flex;
    display: -webkit-flex;
    flex-direction: row;
    align-items: center;
    -webkit-align-items: center;
    height: 0.7rem;
    line-height: 0.7rem;
    flex: 1;
    opacity: 1;
    background-color: #f5f5f5;
    border-radius: 0.5rem;
    border: 0.01rem solid #999999;
}

.base-query-input > input {
   
   
    flex: 1;
    font-size: 0.30rem;
    margin: 0;
    padding: 0 0 0 0.1rem;
    color: #333333;
    opacity: 1;
    height: 0.6rem;
    line-height: 0.6rem;
    background-color: #f5f5f5;
    border-radius: 0.5rem;
    border: 0.01rem solid #f5f5f5;
}

.base-query-img {
   
   
    overflow: hidden;
    width: 0.7rem;
    height: 0.7rem;
    display: flex;
    border-radius: 0.5rem;
    justify-content: center;
    align-items: center;
    margin: 0 0 0 0;
}

.base-query-img img {
   
   
    height: 60%;
}

.base-query-title {
   
   
    font-size: 0.30rem;
    color: white;
    margin-left: 0.2rem;
    padding: 0.12rem 0.35rem;
    border-radius: 0.3rem;
    background-color: dodgerblue;
}
.base-search-input {
   
   
    flex: 1;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis
}

.base-search-clear {
   
   
    color: #999;
    font-size: 0.35rem;
    margin-right: 0.2rem;
}
.home-layout {
   
   
    overflow-x: hidden;
}

.home-layout li {
   
   
    overflow-x: hidden;
    background: #fff;
    margin: 0.2rem 0.2rem;
    padding: 0.05rem 0.05rem;
    border: 0.02rem solid #efeff4;
    border-radius: 0.1rem;
    box
<!-- hybrid/html/map.html --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <title>高德地图</title> <!-- <script src="https://webapi.amap.com/loader.js"></script> --> <script src="https://cdn.bootcss.com/vue/2.6.11/vue.js"></script> <style> #map-container { width: 100%; height: 584px; border-radius: 22px; z-index: 4; } /* 新增:隐藏高德默认标记图标 */ #map-container .amap-marker img[src*="mark_bs.png"] { display: none !important; } </style> </head> <body> <div id="map-container"></div> <script type="text/javascript" src="./js/uni.webview.0.1.52.js"> </script> <script> window._AMapSecurityConfig = { securityJsCode: 'cf331d54f67e306ca5c0b17f7122d559' }; </script> <script src="https://webapi.amap.com/maps?v=2.0&key=f3323c24769b10828db07f07c0fcec0d&plugin=AMap.MarkerCluster"> </script> <script src="https://webapi.amap.com/ui/1.1/main.js"></script> <script> // 确保UniApp通信桥接准备就绪 function setupUniBridge() { return new Promise(resolve => { if (typeof uni.postMessage === 'function') { return resolve(); } document.addEventListener('UniAppJSBridgeReady', resolve); }); } // 向UniApp发送消息(兼容H5和App环境) async function sendMessageToUniApp(data) { // 1. 确保桥接就绪(仅对App环境有效,H5环境会直接resolve) await setupUniBridge(); // 2. 区分环境发送消息 if (isH5Environment()) { // H5环境:使用浏览器原生postMessage console.log('H5环境,使用window.parent.postMessage发送消息'); window.parent.postMessage({ type: 'webviewMessage', // 自定义类型,方便UniApp识别 data: JSON.stringify(data) }, '*'); // 第三个参数为目标域名,*表示允许所有(开发环境可用,生产环境需指定具体域名) } else if (window.uni && typeof uni.postMessage === 'function') { // App环境:使用uni.postMessage console.log('App环境,使用uni.postMessage发送消息'); uni.postMessage({ data: JSON.stringify(data) }); } else { console.error('未支持的环境,无法发送消息'); } } // 辅助函数:判断是否为H5环境(浏览器环境) function isH5Environment() { const protocol = window.location.protocol; // H5环境的协议通常是http:或https: return protocol === 'http:' || protocol === 'https:'; } // 解析URL参数 const params = new URLSearchParams(location.search); const points = JSON.parse(params.get('points') || '[]'); const markers = JSON.parse(params.get('markers') || '[]'); // 初始化地图 const map = new AMap.Map('map-container', { zoom: 10, center: [points[0].lng, points[0].lat], showBuildingBlock: true }); // 自定义单个标记内容(保持原有样式,修复图片路径) function createMarkerContent(markerData) { // 优先使用本地图片,失败则用备用图(确保是自定义图标) const imageUrl = './img/flag.png'; return ` <div style="position:relative;z-index:1000;"> <img src="${imageUrl}" style="width:30px; height:30px;" alt="${markerData.title}"> <div style="position:absolute; bottom:-20px; left:50%; transform: translateX(-50%); background: #f5e7e7; padding:3px 8px; border-radius: 18px; white-space:nowrap; font-family:ShuHuiTi, sans-serif; font-size: 12px; font-weight: bold; border: 2px solid #F47C58; color:#E4393C;"> ${markerData.title} </div> </div> `; } // 聚合点渲染函数 function _renderClusterMarker(context) { const count = context.count; console.log('渲染聚合点,数量:', count); // 通过JS直接设置样式(优先级更高) const div = document.createElement('div'); div.innerHTML = count; // 强制设置关键样式(覆盖默认) div.style.width = '40px'; div.style.height = '40px'; div.style.backgroundColor = '#FF9A44'; div.style.borderRadius = '50%'; div.style.display = 'flex'; div.style.alignItems = 'center'; div.style.justifyContent = 'center'; div.style.color = 'white'; div.style.fontWeight = 'bold'; // 设置聚合点偏移(确保居中) context.marker.setOffset(new AMap.Pixel(-20, -20)); context.marker.setContent(div); // 通过context.marker设置内容 } // 单个标记渲染函数 function _renderMarker(context) { const markerData = context.data[0].originalData; // 1. 生成标记内容 const content = createMarkerContent(markerData); // 2. 设置标记内容 context.marker.setContent(content); // 3. 校准偏移量(根据内容尺寸计算,确保标记中心与经纬度对齐) // 内容总高度:图片30px + 标题区域20px = 50px,向上偏移50px使底部对齐定位点 context.marker.setOffset(new AMap.Pixel(-15, -50)); // 水平偏移:30px宽/2=15px // 4. 绑定点击事件 context.marker.on('click', async () => { const message = { type: 'markerClick', data: markerData }; console.log('H5发送消息:', message); // 优先使用uni.postMessag await sendMessageToUniApp({ type: 'markerClick', data: markerData }); }); } // 绘制路线(保持原有功能) function drawRouteAndPoints() { if (points.length === 0) return; const path = points.map(p => [p.lng, p.lat]); new AMap.Polyline({ path: path, strokeColor: "#32CD32", strokeWeight: 5, zIndex: 500, map: map }); if (points.length >= 2) { AMap.plugin('AMap.Driving', () => { const driving = new AMap.Driving({ map: map, policy: AMap.DrivingPolicy.LEAST_TIME, zIndex: 550 }); driving.search( [points[0].lng, points[0].lat], [points[points.length - 1].lng, points[points.length - 1].lat] ); }); } } // 初始化聚合标记 function initClusterMarkers() { if (!markers.length) return; // 转换数据格式为官方示例要求的结构(包含lnglat字段) const clusterPoints = markers.map(marker => ({ lnglat: new AMap.LngLat(marker.lng, marker.lat), // 官方要求的经纬度格式 originalData: marker // 保留原始数据供渲染使用 })); // 参考官方示例:插件加载后初始化聚合 AMap.plugin('AMap.MarkerCluster', function() { if (typeof AMap.MarkerCluster === 'undefined') { console.error('聚合插件加载失败'); return; } // 配置聚合参数 const cluster = new AMap.MarkerCluster(map, clusterPoints, { gridSize: 80, // 网格大小(官方示例默认60,可调整) maxZoom: 15, // 最大聚合级别 minClusterSize: 2, // 最小聚合数量(测试时可改为1) zoomOnClick: true, averageCenter: true, zIndex: 2000, // 聚合点参数名 renderClusterMarker: _renderClusterMarker, // 单个标记参数名 renderMarker: _renderMarker }); // 调整视野 const bounds = new AMap.Bounds(); clusterPoints.forEach(point => bounds.extend(point.lnglat)); map.setBounds(bounds, [50, 50, 50, 50]); }); } // 地图加载完成后初始化 map.on('complete', function() { console.log('地图加载完成,初始化组件'); initClusterMarkers(); if (points.length > 0) drawRouteAndPoints(); }); map.on('error', (err) => console.error('地图错误:', err)); // 构建带标题的HTML内容 // markers.forEach(marker => { // // 构建HTML内容(包含图片和标题) // const content = ` // <div style="background: linear-gradient(180deg, #E3383B 0%, #F47C58 98%); padding:6px; border-radius: 8px;"> // <div style=" white-space:wrap; // font-family:AlibabaPuHuiTi-SemiBold; font-size: 15px; // margin-top:5px;color:#fff;width:100%;">闽宁新貌展示中心</div> // <div style=" white-space:wrap;text-indent: 1em;letter-spacing: 1px; // font-family:AlibabaPuHuiTi-RegularL3; font-size: 10px; // margin-top:5px;color:#fff;width:100%;"> // 闽宁新貌展示中心,生动呈现闽宁协作丰硕成果,见证昔日“干沙滩”蜕变为今日“金沙滩”的壮丽历程。 </div> // <img src="./img/ditu.png" style="width:200px; height:110px; display:block;margin-top:5px;"> // </div> // `; // const markerObj = new AMap.Marker({ // position: [marker.lng, marker.lat], // content: content, // 使用HTML内容 // anchor: 'bottom-center', // 锚点在底部中心 // offset: new AMap.Pixel(0, -25) // 向上偏移 // }); // markerObj.on('click', () => { // console.log('window--uni', uni, window); // // console.log(marker, '000'); // // 将数据转为字符串 // const message = JSON.stringify({ // type: 'markerClick', // title: marker.title // }); // window.parent.postMessage(message, '*'); // // 通过uni.postMessage发送数据 // // uni.postMessage({ // // data: JSON.stringify(message) // 发送字符串 // // }); // }); // map.add(markerObj); // }); // 2. 在map加载完成后初始化聚合点 // map.on('complete', function() { // // 创建聚合实例 // const cluster = new AMap.MarkerClusterer(map, markers.map(m => { // return new AMap.Marker({ // position: [m.lng, m.lat], // content: createMarkerContent(m) // 自定义标记 // }); // }), { // gridSize: 80, // maxZoom: 18, // renderClusterMarker: renderCluster // }); // // // 转换数据格式 // // const clusterPoints = markers.map(marker => ({ // // lnglat: [marker.lng, marker.lat], // // title: marker.title, // // originalData: marker // 保留原始数据 // // })); // // console.log('在map加载完成后初始化聚合点', clusterPoints); // // // 确保有聚合点数据 // // if (clusterPoints.length === 0) return; // // 使用MarkerCluster插件 // // AMap.plugin('AMap.MarkerCluster', function() { // // console.log("聚合插件加载完成"); // // // 创建聚合点 // // const cluster = new AMap.MarkerCluster(map, clusterPoints, { // // gridSize: 80, // 聚合网格像素大小 // // maxZoom: 18, // 最大聚合级别 // // minClusterSize: 2, // 最小聚合数量 // // zoomOnClick: true, // 点击聚合点是否放大地图 // // averageCenter: true, // 聚合点是否使用平均值中心 // // // 定义聚合点样式 // // renderClusterMarker: function(context) { // // console.log('定义聚合点样式-context', context); // // // const count = context.count; // // // const div = document.createElement('div'); // // // div.innerHTML = ` // // // <div style="background: #FF9A44; // // // border-radius: 50%; // // // width: 40px; // // // height: 40px; // // // display: flex; // // // align-items: center; // // // justify-content: center; // // // color: white; // // // font-weight: bold; // // // z-index:99;"> // // // ${count} // // // </div> // // // `; // // const count = context.count; // // const div = document.createElement('div'); // // div.style.background = '#FF9A44'; // // div.style.borderRadius = '50%'; // // div.style.width = '40px'; // // div.style.height = '40px'; // // div.style.display = 'flex'; // // div.style.alignItems = 'center'; // // div.style.justifyContent = 'center'; // // div.style.color = 'white'; // // div.style.fontWeight = 'bold'; // // div.style.zIndex = '99'; // // div.innerHTML = count; // // // context.marker.setContent(div); // // return div; // // }, // // // 自定义标记点样式 // // renderMarker: function(context) { // // const markerData = context.data[0].originalData; // // // console.log('自定义标记点样式-context', context); // // // const marker = new AMap.Marker({ // // // position: [markerData.lng, markerData.lat], // // // content: ` // // // <div style="position:relative; text-align:center;z-index:100;"> // // // <img src="./img/flag.png" // // // style="width:40px; height:50px; display:block;"> // // // <div style="position:absolute; bottom:-90%; left:0%; transform:translateX(-50%); // // // background: rgba(227, 57, 59, 0.1); padding:6px 0; // // // border-radius: 18px; white-space:wrap; // // // font-family:ShuHuiTi; font-size: 12px;font-weight: bold; // // // margin-top:5px;border: 2px solid #F47C58;color:#E4393C;width:80px;"> // // // ${markerData.title} // // // </div> // // // </div> // // // `, // // // offset: new AMap.Pixel(0, 0) // // // }); // // // 创建自定义内容 // // const content = ` // // <div style="position:relative; text-align:center;z-index:100;"> // // <img src="./img/flag.png" style="width:40px; height:50px; display:block;"> // // <div style="position:absolute; bottom:-90%; left:50%; transform:translateX(-50%); // // background: rgba(227, 57, 59, 0.1); padding:6px 0; font-family:ShuHuiTi; font-size: 12px;font-weight: bold; // // margin-top:5px;border: 2px solid #F47C58;color:#E4393C;width:80px; border-radius: 18px;"> // // ${markerData.title} </div> </div> `; // // const marker = new AMap.Marker({ // // position: [markerData.lng, markerData.lat], // // content: content, // // offset: new AMap.Pixel(-2, -4) // 根据实际图片调整偏移 // // }); // // // 绑定聚合点点击事件 // // // marker.on('click', async function(e) { // // // console.log(e, 'bbbbb'); // // // sendMessageToUniApp({ // // // type: 'markerClick', // // // center: e.lnglat // // // }); // // // }); // // // // console.log('聚合点点', marker); // // // map.add(marker); // // // 绑定标记点击事件 // // marker.on('click', async function(e) { // // 发送消息给UniApp // // await sendMessageToUniApp({ // // type: 'markerClick', // // data: markerData // // }); // // }); // // return marker; // // }, // // }); // // // 绑定聚合点点击事件 // // cluster.on('click', async function(e) { // // console.log(e, 'bbbbb'); // // // 发送聚合点点击事件 // // await sendMessageToUniApp({ // // type: 'clusterClick', // // data: { // // count: e.clusterData.count, // // center: e.clusterData.center, // // markers: e.clusterData.markers // // } // // }); // // }); // // }); // }); // 2. 绘制路线 // const path = points.map(p => [p.lng, p.lat]); // new AMap.Polyline({ // path: path, // strokeColor: "#32CD32", // strokeWeight: 5, // map: map // }); // 3. 添加起点终点标记 // points.forEach((point, i) => { // new AMap.Marker({ // position: [point.lng, point.lat], // // content: `<div class="point-label">${i === 0 ? '起' : '终'}</div>`, // offset: new AMap.Pixel(-10, -10), // map: map // }); // }); // 4. 绘制驾车路径(如果需要,可以注释掉直线路径,保留驾车路径) // 注意:这里同时绘制了直线和驾车路径,可能会重叠 // if (points.length >= 2) { // AMap.plugin('AMap.Driving', () => { // const driving = new AMap.Driving({ // map: map, // 这样驾车路线会直接显示在地图上 // policy: AMap.DrivingPolicy.LEAST_TIME // }); // driving.search( // [points[0].lng, points[0].lat], // [points[points.length - 1].lng, points[points.length - 1].lat], // (status, result) => { // // 可以根据结果处理 // } // ); // }); // } // 1. 绘制路线 // if (points.length > 0) { // const path = points.map(p => [p.lng, p.lat]); // new AMap.Polyline({ // path: path, // strokeColor: "#32CD32", // strokeWeight: 5, // map: map // }); // // 添加起点终点标记 // points.forEach((point, i) => { // new AMap.Marker({ // position: [point.lng, point.lat], // offset: new AMap.Pixel(-10, -10), // map: map // }); // }); // // 绘制驾车路径(如果需要) // if (points.length >= 2) { // AMap.plugin('AMap.Driving', () => { // const driving = new AMap.Driving({ // map: map, // policy: AMap.DrivingPolicy.LEAST_TIME // }); // driving.search( // [points[0].lng, points[0].lat], // [points[points.length - 1].lng, points[points.length - 1].lat] // ); // }); // } // } </script> </body> </html>点击点标记只有console.log('H5发送消息:', message);这个打印,其他的没有反应
最新发布
08-10
### 如何在 UniApp 中设置或修改附件样式的实现方法 #### 一、关于 `privacy policy` 配置策略 在 UniApp 开发中,如果涉及到隐私政策提示框的配置,可以通过指定参数来调整其行为模式。例如,`privacyPolicyConfig.strategy` 可以接受三个值:`template`、`custom` 和 `none`[^1]。默认情况下,该值为 `none`,表示不会显示任何预设模板或自定义内容。 对于开发者而言,可以根据实际需求选择不同的策略: - **Template**: 使用平台提供的标准模板。 - **Custom**: 提供完全自定义的内容展示方式。 - **None**: 不显示相关内容。 此部分主要影响应用启动时是否弹出隐私条款说明窗口及其表现形式。 --- #### 二、内嵌 H5 页面并自定义 WebView 大小 当需要在 UniApp 应用内部加载外部 HTML 或者 Web 资源时,通常会借助 `<web-view>` 组件完成操作[^2]。然而,默认状态下,<web-view> 会被渲染至全屏状态,无法直接通过 CSS 修改尺寸。 解决这一问题的方法之一是利用父级容器布局配合动态计算高度宽度的方式间接控制子组件呈现比例: ```html <!-- 示例代码 --> <view class="container"> <!-- 定义外层包裹器 --> <view style="width: {{ webWidth }}px; height: {{ webHeight }}px;"> <web-view :src="url"></web-view> </view> </view> ``` ```javascript // JavaScript 实现逻辑 export default { data() { return { url: 'https://example.com', // 替换为目标链接地址 webWidth: 300, // 初始设定宽高数值 (单位 px) webHeight: 400, }; }, }; ``` 上述例子展示了如何通过绑定 Vue 数据模型中的变量改变视图区域的实际面积大小,从而达到灵活定制的效果。 --- #### 三、基于 uView 的文件上传功能扩展——添加水印支持 针对图片类资源管理场景下常见的附加业务诉求比如打上版权标记等,则推荐采用第三方 UI 框架如 uView 所封装好的工具集简化开发流程[^3]。具体步骤如下所示: 1. 引入必要的插件模块; 2. 监听用户选取动作触发事件处理程序 (`afterRead`) 获取原始素材信息; 3. 基于 Canvas API 构建个性化装饰图案覆盖原图像表面形成最终产物; 4. 将加工后的成果重新提交给后台存储服务端点。 以下是完整的示范脚本片段: ```html <u-upload ref="uUpload" @after-read="handleAfterRead"> </u-upload> <canvas canvas-id="watermarkCanvas" style="display:none;"></canvas> ``` ```javascript methods: { handleAfterRead(e) { const { file } = e; uni.getImageInfo({ src: file.url, success(resImage) { let ctx = uni.createCanvasContext('watermarkCanvas'); // Draw original image onto the canvas. ctx.drawImage(resImage.path, 0, 0, resImage.width, resImage.height); // Add watermark text at bottom-right corner as an example. ctx.setFontSize(20); ctx.setFillStyle('#ffffff'); // Set color to white for better visibility over dark backgrounds. ctx.fillText(`© ${new Date().getFullYear()} Your Company`, resImage.width - 180, resImage.height - 20); ctx.draw(false, () => { setTimeout(() => { uni.canvasToTempFilePath({ canvasId: 'watermarkCanvas', success(canvasRes) { console.log("Watermarked Image Path:", canvasRes.tempFilePath); // Proceed with uploading this new path instead of old one... } }); }, 20); // Give some time for drawing process completion before conversion attempt. }); } }); } } ``` 以上代码实现了基本的功能框架,允许使用者先挑选本地相册里的项目然后再经过一系列图形编辑工序生成带有所属权声明的新版本用于后续分享传播用途之中去。 --- #### 四、总结 综上所述,在 UniApp 平台之上无论是基础控件还是高级交互特性均提供了丰富的可能性让程序员能够按照各自项目的特定要求来进行细致化的调节优化工作。从简单的表单字段验证到复杂的多媒体流媒体播放再到如今讨论过的文档附件外观修饰等方面都体现了跨终端一致性的优势所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值