div设置position:fixed或者absolute绝对定位后,click事件失效问题

本文介绍如何通过调整Z-index属性,使div内的链接或标签在页面布局中获得更高的显示层级,解决前后元素遮挡问题。适用于网页设计与前端开发人员。

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

div后面需要点击的link或者标签放到绝对定位的div里面,然后将这个div的z-index设置得大于前一个绝对定位的div即可:

z-index: 99;
position: absolute;

 

控制按钮在视频上,可是由于设置position:absolute,导致切换移动端时,按钮直接不见了,如以下代码;<template> <el-carousel class="box" ref="carouselRef"> <el-carousel-item v-for="(videoSrc,index) in videoList" :key="index"> <div class="contain"> <!--目的:按钮始终准确定位在视频区域的右下角,单靠.box无法固定,因为用的不是html的原生组件--> <video class="toy_video" autoplay loop muted playsinline @click=""> <!--playsinline允许网页内联播放--> <source :src="videoSrc" type="video/mp4" /> Your browser does not support the video tag. </video> </div> <!--buy按钮叠加在视频上--> <el-button class="buy" :style="{backgroundImage:`url(${buyImg})`}" ></el-button> </el-carousel-item> </el-carousel> </template> <style scoped lang="scss"> .box{ position: relative; /* 相对定位 */ border-radius: 25px; overflow: hidden; height: 100%; /* 用于调试布局高度 background: rgba(0,0,255,0.1);*/ margin-top: 0; line-height: 0; // 清除行高空隙 font-size: 0; // 防止文本撑开 } .contain{ position: relative; height: 100%; border-radius: 25px; } /* 设置.el-carousel 的每一层样式,用于清楚一些其自带的默认样式 */ ::v-deep .el-carousel { height: 100%; border-radius: 25px; margin: 0 !important; padding: 0 !important; } ::v-deep .el-carousel__container { height: 100%; border-radius: 25px; margin: 0 !important; padding: 0 !important; } ::v-deep .el-carousel__item { height: 100%; border-radius: 25px; margin: 0 !important; padding: 0 !important; line-height: 0; } /* 注意:必须确保整个布局链条上高度是明确传递下来的,否则<el-carousel class="box"> 的高度 不会受到 .left, .videos, .select 中 flex 样式的控制*/ .toy_video{ width: 100%; height: 100%; object-fit: contain; /* 视频覆盖满 */ z-index: 2; margin: 0; padding: 0; display: block; } .buy{ /* 直接写在css里不一定生效 background-image: url('@/assets/buy_new.png');*/ background-size: cover; /* 图片覆盖整个按钮 */ background-position: center; width: 198px; height: 96px; z-index: 6; /*确保按钮在视频上方*/ position: absolute; /* 绝对定位 */ right: 132px; bottom: 65px; /* 无效,因为绝对定位 (position: absolute) 的元素,不再受 margin 的正常流影响 margin-left: 6px; margin-bottom: 6px;*/ /* 用于调试布局高度 */ background: rgba(0,0,255,0.1); // background: rgba(0,0,0,0); // 清除按钮的默认底色:白色 border-radius: 30px; /*background-color: red; 临时测试 */ outline: none; /*去除焦点状态的轮廓线 */ border: none; /*去除按钮默认的边框 */ background-repeat: no-repeat; /* 防止重复 */ } </style>
最新发布
08-05
</div> 如上所示vue代码,我要在class="gradient-rectangle" 下面也就是与class="vertical-button-bar"同一级别的在整个页面的右下角加一个指南针功能,指南针代码可以借鉴:<template> <div id="cesium-container" class="cesium-container"> <!-- 修改后的指南针按钮 --> <button class="compass-button" @click="resetNorth"> <img src="/image/zhinanzhen.png" alt="指南针" style="width: 30px; height: 30px;" /> </button> </div> </template> <script> import * as Cesium from 'cesium'; import 'cesium/Build/Cesium/Widgets/widgets.css'; import CircleRippleMaterialProperty from './CircleRippleMaterialProperty'; export default { name: 'CesiumRippleEffect', data() { return { viewer: null, rippleEntity: null }; }, mounted() { this.initCesium(); }, beforeDestroy() { if (this.viewer) { this.viewer.destroy(); // 完全移除Cesium实例 const cesiumContainer = document.getElementById('cesium-container'); if (cesiumContainer) { cesiumContainer.innerHTML = ''; } } }, methods: { initCesium() { // 修复沙箱错误:禁用InfoBox Cesium.InfoBoxViewModel.prototype._iframeHtml = '<div></div>'; // 初始化Cesium Viewer this.viewer = new Cesium.Viewer('cesium-container', { animation: false, timeline: false, baseLayerPicker: false, geocoder: false, homeButton: false, sceneModePicker: false, navigationHelpButton: false, fullscreenButton: true, infoBox: false // 完全禁用InfoBox组件 }); // 添加波纹圆效果 this.addRippleEffect(); // 调整相机位置 this.viewer.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(113.194006, 27.399411, 2000), orientation: { heading: Cesium.Math.toRadians(0), pitch: Cesium.Math.toRadians(-60), roll: 0 }, duration: 2.0 }); }, addRippleEffect() { // 指定坐标 (113.194006, 27.399411) const position = Cesium.Cartesian3.fromDegrees(113.194006, 27.399411); // 创建波纹圆实体 this.rippleEntity = this.viewer.entities.add({ name: '动态波纹圆', position: position, ellipse: { semiMinorAxis: 500.0, semiMajorAxis: 700.0, height: 0, material: new CircleRippleMaterialProperty({ color: Cesium.Color.fromCssColorString("#00FFFF").withAlpha(0.6), speed: 1, count: 1, gradient: 0.1 }) } }); // 添加参考点 this.viewer.entities.add({ position: position, point: { pixelSize: 10, color: Cesium.Color.RED } }); }, // 指南针功能:重置北方向 resetNorth() { if (!this.viewer) return; // 获取当前相机位置 const camera = this.viewer.camera; const currentPosition = camera.position.clone(); // 创建新的方向,将heading(偏航角)设为0(正北方向) const orientation = { heading: 0, // 北方向 pitch: camera.pitch, roll: camera.roll }; // 平滑过渡到北方向 camera.flyTo({ destination: currentPosition, orientation: orientation, duration: 1.0, easingFunction: Cesium.EasingFunction.CUBIC_OUT }); } } }; </script> <style scoped> .cesium-container { width: 100%; height: 100vh; position: relative; overflow: hidden; /* 防止内容溢出 */ } /* 指南针按钮样式 - 确保可见 */ .compass-button { position: absolute; bottom: 20px; right: 20px; z-index: 1000; /* 确保在Cesium控件之上 */ width: 40px; height: 40px; background: rgba(255, 255, 255, 0.9); /* 提高背景不透明度 */ border: 1px solid #ddd; border-radius: 50%; /* 圆形按钮 */ cursor: pointer; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 8px rgba(0,0,0,0.3); /* 更明显的阴影 */ transition: all 0.3s ease; } .compass-button:hover { background: rgba(255, 255, 255, 1); transform: scale(1.1); box-shadow: 0 4px 12px rgba(0,0,0,0.4); } .compass-button svg { color: #1a73e8; /* 更明显的颜色 */ width: 24px; height: 24px; } </style> 基于此修改代码,然后原先vue中的其他无关代码不要动
07-07
<template> <div class="record-form"> <!-- 头部标题动画 --> <h1 class="title" v-motion="titleAnimation">人员信息记录表</h1> <!-- 主表单区域 --> <form @submit.prevent="submitForm"> <!-- 姓名 --> <div class="form-group"> <label>姓名</label> <input type="text" v-model="formData.name" placeholder="请输入姓名" :class="{invalid: !validations.name}" @blur="validateName"> <transition name="fade"> <span class="error-msg" v-if="!validations.name">姓名不能为空</span> </transition> </div> <!-- 性别选择 --> <div class="form-group"> <label>性别</label> <div class="radio-group"> <label v-for="option in genderOptions" :key="option.value"> <input type="radio" v-model="formData.gender" :value="option.value"> <span class="radio-icon" :class="{checked: formData.gender === option.value}"></span> {{ option.label }} </label> </div> </div> <!-- 年龄滑块 --> <div class="form-group"> <label> 年龄: {{ formData.age }} 岁 <transition name="bounce"> <span v-if="formData.age < 18" class="age-warning">(未满18岁)</span> </transition> </label> <input type="range" min="1" max="100" v-model="formData.age"> </div> <!-- 职业选择 --> <div class="form-group"> <label>职业</label> <select v-model="formData.occupation"> <option disabled value="">请选择职业</option> <option v-for="job in occupations" :key="job" :value="job">{{ job }}</option> </select> </div> <!-- 兴趣爱好 --> <div class="form-group"> <label>兴趣爱好</label> <div class="hobby-grid"> <div v-for="hobby in hobbies" :key="hobby" class="hobby-item" :class="{selected: formData.hobbies.includes(hobby)}" @click="toggleHobby(hobby)"> {{ hobby }} </div> </div> </div> <!-- 个人简介 --> <div class="form-group"> <label>个人简介</label> <textarea v-model="formData.bio" placeholder="请简要介绍自己..." rows="3"></textarea> </div> <!-- 提交按钮 --> <div class="form-actions"> <button type="reset" @click="resetForm">重置</button> <button type="submit" :class="{active: canSubmit}">提交记录</button> </div> </form> <!-- 成功提交通知 --> <transition name="fade"> <div v-if="submissionSuccess" class="success-modal"> <p>人员信息已成功记录!</p> <button @click="submissionSuccess = false">关闭</button> </div> </transition> </div> </template> <script setup> import { ref, reactive, computed } from 'vue' // 表单数据结构 const formData = reactive({ name: '', gender: '', age: 25, occupation: '', hobbies: [], bio: '' }) // 选项数据 const genderOptions = [ { label: '男', value: 'male' }, { label: '女', value: 'female' }, { label: '其他', value: 'other' } ] const occupations = ref([ '学生', '教师', '工程师', '医生', '设计师', '程序员', '创业者' ]) const hobbies = ref([ '阅读', '旅行', '音乐', '运动', '美食', '摄影', '游戏', '电影' ]) // 验证状态 const validations = reactive({ name: true }) const submissionSuccess = ref(false) // 动画定义 const titleAnimation = { initial: { opacity: 0, y: -50 }, enter: { opacity: 1, y: 0, transition: { type: 'spring', stiffness: 150, damping: 15 } } } // 验证方法 const validateName = () => { validations.name = formData.name.trim().length > 0 } // 切换爱好选择 const toggleHobby = (hobby) => { const index = formData.hobbies.indexOf(hobby) if (index > -1) { formData.hobbies.splice(index, 1) } else { formData.hobbies.push(hobby) } } // 提交表单 const submitForm = () => { validateName() if (canSubmit.value) { // 实际应用中这里发送API请求 console.log('提交数据:', JSON.stringify(formData)) submissionSuccess.value = true // 模拟延迟重置 setTimeout(() => { resetForm() }, 1500) } } // 重置表单 const resetForm = () => { Object.assign(formData, { name: '', gender: '', age: 25, occupation: '', hobbies: [], bio: '' }) Object.assign(validations, { name: true }) } // 计算属性 const canSubmit = computed(() => { return formData.name.trim() && formData.gender && formData.occupation }) </script> <style scoped lang="scss"> .record-form { max-width: 800px; margin: 2rem auto; padding: 2rem; background: white; border-radius: 15px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } .title { text-align: center; margin-bottom: 2rem; color: #2c3e50; font-weight: 600; font-size: 2.2rem; } .form-group { margin-bottom: 1.5rem; label { display: block; margin-bottom: 0.5rem; font-weight: 500; color: #34495e; } input, select, textarea { width: 100%; padding: 0.8rem; border: 1px solid #ddd; border-radius: 8px; font-size: 1rem; transition: border-color 0.3s; &:focus { border-color: #3498db; outline: none; box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.2); } &.invalid { border-color: #e74c3c; } } textarea { min-height: 80px; resize: vertical; } } .radio-group { display: flex; gap: 2rem; margin-top: 0.5rem; label { display: flex; align-items: center; gap: 0.5rem; cursor: pointer; font-weight: normal; } input[type="radio"] { display: none; & + .radio-icon { width: 20px; height: 20px; border: 2px solid #95a5a6; border-radius: 50%; position: relative; transition: all 0.3s; &.checked::after { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 10px; height: 10px; background: #3498db; border-radius: 50%; } &.checked { border-color: #3498db; } } } } .hobby-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.8rem; margin-top: 0.5rem; } .hobby-item { padding: 0.6rem; border: 1px solid #ddd; border-radius: 8px; text-align: center; cursor: pointer; transition: all 0.3s; &:hover { background-color: #f1f9ff; } &.selected { background-color: #3498db; color: white; border-color: #3498db; transform: translateY(-3px); box-shadow: 0 4px 8px rgba(52, 152, 219, 0.3); } } .error-msg { display: block; margin-top: 0.5rem; color: #e74c3c; font-size: 0.9rem; } .age-warning { font-size: 0.85rem; color: #e74c3c; } .form-actions { display: flex; justify-content: flex-end; gap: 1rem; margin-top: 2rem; button { padding: 0.8rem 1.5rem; border: none; border-radius: 8px; font-size: 1rem; font-weight: 500; cursor: pointer; transition: all 0.3s; &:first-child { background-color: #ecf0f1; color: #7f8c8d; &:hover { background-color: #d5dbdb; } } &:last-child { background-color: #3498db; color: white; &:hover { background-color: #2980b9; transform: translateY(-2px); box-shadow: 0 4px 10px rgba(52, 152, 219, 0.3); } &:active { transform: translateY(0); } &:disabled { background-color: #bdc3c7; cursor: not-allowed; transform: none; box-shadow: none; } } } } .success-modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: white; padding: 2rem; border-radius: 15px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); text-align: center; z-index: 100; p { font-size: 1.2rem; margin-bottom: 1.5rem; color: #2ecc71; } button { padding: 0.6rem 1.2rem; background-color: #2ecc71; color: white; border: none; border-radius: 8px; cursor: pointer; } } /* 过渡动画 */ .fade-enter-active, .fade-leave-active { transition: opacity 0.3s; } .fade-enter-from, .fade-leave-to { opacity: 0; } .bounce-enter-active { animation: bounce-in 0.5s; } @keyframes bounce-in { 0% { transform: scale(0.5); opacity: 0; } 50% { transform: scale(1.2); } 100% { transform: scale(1); opacity: 1; } } </style> 这段代码运行没反应,请帮我修改一下
06-11
<template> <div id="app"> <div id="container"> <div id="header"> <div class="logo"> <div> <div class="header-title">流程图设计器</div> </div> </div> <div class="button-group"> <button id="save-button" class="button button-save" @click="saveDiagram"><i>💾</i> 保存</button> <button id="reset-button" class="button button-reset" @click="resetDiagram"><i>🔄</i> 重置</button> </div> </div> <div id="canvas-container"> <button id="toggle-sidebar" class="toggle-sidebar" @click="toggleSidebar"> {{ sidebarOpen ? '关闭面板' : '属性面板' }} </button> <div id="canvas"></div> </div> <div id="status-bar"> <div class="status-item"> <div class="status-indicator" :style="statusIndicatorStyle"></div> <span>{{ statusText }}</span> </div> <div class="status-item"> <span>{{ elementCount }} 个元素</span> </div> <div class="status-item"> <span>{{ lastSaveText }}</span> </div> </div> </div> <div id="notification" class="notification" :class="{ show: showNotification, [notificationType]: true }"> {{ notificationMessage }} </div> <div id="sidebar" class="sidebar" :class="{ open: sidebarOpen }"> <h3>元素属性</h3> <div class="properties-group"> <div class="property-item"> <label for="element-name">名称</label> <input type="text" id="element-name" placeholder="输入元素名称" v-model="elementName" @input="updateElementProperties" /> </div> <div class="property-item"> <label for="element-desc">描述</label> <textarea id="element-desc" rows="3" placeholder="输入元素描述" v-model="elementDesc" @input="updateElementProperties" ></textarea> </div> </div> </div> </div> </template> <script> import BpmnJS from 'bpmn-js/dist/bpmn-modeler.development.js' import 'bpmn-js/dist/assets/diagram-js.css' import 'bpmn-js/dist/assets/bpmn-js.css' import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css' export default { name: 'ActivitiDesigner', data() { return { bpmnModeler: null, isModelerReady: false, sidebarOpen: false, showNotification: false, notificationMessage: '', notificationType: '', statusText: '就绪', elementCount: 0, lastSaveText: '未保存', currentElement: null, elementName: '', elementDesc: '', elementBusinessObject: null, } }, computed: { statusIndicatorStyle() { switch (this.statusText) { case '就绪': return { backgroundColor: '#2ecc71' } case '加载中': return { backgroundColor: '#f39c12' } case '保存中': return { backgroundColor: '#3498db' } case '错误': return { backgroundColor: '#e74c3c' } default: return { backgroundColor: '#95a5a6' } } }, }, mounted() { this.initializeModeler() }, methods: { async initializeModeler() { try { this.showNotification = true this.notificationMessage = '正在初始化流程图设计器...' this.notificationType = 'warning' // 创建BPMN模型实例 this.bpmnModeler = new BpmnJS({ container: '#canvas', keyboard: { bindTo: document, }, }) // 监听模型就绪事件 this.bpmnModeler.on('import.done', (event) => { console.log('BPMN模型加载完成') this.isModelerReady = true this.statusText = '就绪' // 更新元素计数 this.updateElementCount() // 显示成功通知 this.showNotificationMessage('流程图加载完成!', 'success') // 监听元素选择事件 this.bpmnModeler.on('element.click', (event) => { this.handleElementSelection(event.element) }) }) // 监听错误事件 this.bpmnModeler.on('error', (err) => { console.error('BPMN模型错误', err) this.isModelerReady = false this.statusText = '错误' this.showNotificationMessage(`模型错误: ${err.message}`, 'error') }) // 监听元素变化事件 this.bpmnModeler.on('element.changed', () => { this.updateElementCount() }) // 创建新流程图 await this.createNewDiagram() } catch (err) { console.error('初始化BPMN模型失败', err) this.showNotificationMessage(`初始化失败: ${err.message}`, 'error') } }, async createNewDiagram() { if (!this.bpmnModeler) return try { this.statusText = '加载中' await this.bpmnModeler.createDiagram() console.log('创建流程图成功') this.lastSaveText = '未保存' this.showNotificationMessage('已创建新流程图', 'success') this.statusText = '就绪' } catch (err) { console.error('创建流程图失败', err) this.showNotificationMessage(`创建流程图失败: ${err.message}`, 'error') this.statusText = '错误' } }, async saveDiagram() { if (!this.bpmnModeler || !this.isModelerReady) { this.showNotificationMessage('模型尚未准备好,请稍后再试', 'warning') return } try { this.statusText = '保存中' // 保存XML const { xml } = await this.bpmnModeler.saveXML({ format: true }) console.log('BPMN XML:', xml) // 在实际应用中,这里可以发送到服务器保存 // await this.saveToServer(xml); // 更新状态 const now = new Date() this.lastSaveText = `最后保存: ${now.toLocaleTimeString()}` // 显示成功通知 this.showNotificationMessage('流程图保存成功!XML内容已输出到控制台', 'success') // 恢复状态 setTimeout(() => { this.statusText = '就绪' }, 1000) } catch (err) { console.error('保存失败', err) this.showNotificationMessage(`保存失败: ${err.message}`, 'error') this.statusText = '错误' } }, resetDiagram() { if (confirm('确定要重置吗?当前内容将丢失。')) { this.createNewDiagram() this.elementName = '' this.elementDesc = '' this.currentElement = null } }, toggleSidebar() { this.sidebarOpen = !this.sidebarOpen }, updateElementCount() { if (!this.bpmnModeler) return try { const elementRegistry = this.bpmnModeler.get('elementRegistry') this.elementCount = elementRegistry ? elementRegistry.getAll().length : 0 } catch (err) { console.error('更新元素计数失败', err) } }, showNotificationMessage(message, type) { this.notificationMessage = message this.notificationType = type this.showNotification = true setTimeout(() => { this.showNotification = false }, 3000) }, handleElementSelection(element) { this.currentElement = element this.elementBusinessObject = element.businessObject console.log(element,'element') // 加载元素属性 this.elementName = this.elementBusinessObject.name || '' this.elementDesc = this.elementBusinessObject.description || '' // 打开属性面板 this.sidebarOpen = true }, updateElementProperties() { if (!this.currentElement || !this.bpmnModeler || !this.elementBusinessObject) return try { const modeling = this.bpmnModeler.get('modeling') // 更新名称 modeling.updateProperties(this.currentElement, { name: this.elementName, description: this.elementDesc, }) this.showNotificationMessage('元素属性已更新', 'success') } catch (err) { console.error('更新元素属性失败', err) this.showNotificationMessage(`更新属性失败: ${err.message}`, 'error') } }, }, } </script> <style scoped> * { box-sizing: border-box; margin: 0; padding: 0; } body, html { height: 100%; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); color: #333; overflow: hidden; } #container { display: flex; flex-direction: column; height: calc(100vh - 150px) ; max-width: 100%; margin: 0 auto; box-shadow: 0 0 30px rgba(0, 0, 0, 0.1); } #header { background: linear-gradient(to right, #2c3e50, #4a6491); color: white; padding: 15px 20px; display: flex; justify-content: space-between; align-items: center; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); z-index: 10; } .logo { display: flex; align-items: center; gap: 15px; } .logo-icon { font-size: 28px; color: #3498db; } .header-title { font-size: 22px; font-weight: 600; } .header-subtitle { font-size: 14px; opacity: 0.8; margin-top: 3px; } .button-group { display: flex; gap: 12px; } .button { padding: 10px 20px; border: none; border-radius: 5px; font-weight: 600; cursor: pointer; display: flex; align-items: center; gap: 8px; transition: all 0.3s ease; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); } .button:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); } .button:active { transform: translateY(0); } .button-save { background: linear-gradient(to right, #27ae60, #2ecc71); color: white; } .button-reset { background: linear-gradient(to right, #e74c3c, #c0392b); color: white; } .button-export { background: linear-gradient(to right, #3498db, #2980b9); color: white; } #canvas-container { flex: 1; position: relative; overflow: hidden; background: #f8f9fa; } #canvas { height: 100%; width: 100%; } #status-bar { background: #2c3e50; color: #ecf0f1; padding: 8px 20px; font-size: 14px; display: flex; justify-content: space-between; align-items: center; } .status-item { display: flex; align-items: center; gap: 8px; } .status-indicator { width: 10px; height: 10px; border-radius: 50%; background-color: #2ecc71; } .notification { position: fixed; top: 20px; right: 20px; padding: 15px 25px; border-radius: 5px; color: white; font-weight: 500; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); z-index: 1000; opacity: 0; transform: translateX(100%); transition: all 0.4s ease; } .notification.show { opacity: 1; transform: translateX(0); } .notification.success { background: linear-gradient(to right, #27ae60, #2ecc71); } .notification.error { background: linear-gradient(to right, #e74c3c, #c0392b); } .notification.warning { background: linear-gradient(to right, #f39c12, #e67e22); } .sidebar { position: absolute; top: 260px; right: 20px; width: 300px; height: 50%; background: white; box-shadow: -5px 0 15px rgba(0, 0, 0, 0.1); z-index: 5; padding: 20px; overflow-y: auto; display: none; } .sidebar.open { display: inline } .sidebar h3 { margin-bottom: 15px; color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; } .properties-group { margin-bottom: 20px; } .property-item { margin-bottom: 15px; } .property-item label { display: block; margin-bottom: 5px; font-weight: 500; color: #2c3e50; } .property-item input, .property-item textarea, .property-item select { width: 100%; padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; } .toggle-sidebar { position: absolute; top: 20px; right: 20px; background: #3498db; color: white; border: none; border-radius: 5px; padding: 8px 15px; cursor: pointer; z-index: 6; } .tools-palette { position: absolute; top: 20px; left: 20px; background: white; border-radius: 8px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); padding: 15px; z-index: 5; display: flex; flex-direction: column; gap: 10px; } .tool-btn { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: #f8f9fa; border: 1px solid #e0e0e0; cursor: pointer; transition: all 0.2s; } .tool-btn:hover { background: #3498db; color: white; transform: scale(1.1); } .tool-btn.active { background: #3498db; color: white; } </style> 描述没有更新
07-19
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一望损莓苔

一毛钱的动力~yeah~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值