vue+element-ui实现带提示的锚点图标按钮

vue+element-ui实现带提示的锚点图标按钮

案例情景

在一个有顶部导航栏的网站首页,上下分成好几个不同内容的展示区,要求能通过侧边的锚点按钮快速定位,并且锚点按钮是一个图标按钮,鼠标悬浮时图标会转为文字提示(如CSDN这种)。

开发环境

Vue2、Element UI

实现方案

以CSDN锚点按钮为实现目标,可以用 element-ui 的圆角图标配合 el-icon做基础按钮,再添加悬浮事件扩展特效,而锚点跳转可以通过dom元素定位来实现。

准备工作:

  1. 在页面中创建4个div块,宽度100vw,高度可以长一点,70vh,各自赋予不同的id:#top#goods#discount#present
  2. 在页面中创建一个粘在顶部的导航栏,高度为5rem

实现流程:

  1. 创建1个锚点盒子和4个圆角图标按钮
<div class="anchor-tool">
  <el-button icon="el-icon-top" circle></el-button>
  <el-button icon="el-icon-goods" circle></el-button>
  <el-button icon="el-icon-discount" circle></el-button>
  <el-button icon="el-icon-present" circle></el-button>
</div>
  1. 将锚点盒子固定在屏幕一侧的底端,并提高图层保证能不被其它元素所覆盖
.anchor-tool {
  position: fixed;
  padding-left: 16px;
  z-index: 2;
  bottom: 10vh;
}
  1. 将el-button转为块,从而上下排列,同时去掉el-button的外边距,并设置合适的间隔距离8px
.anchor-tool {
  position: fixed;
  padding-left: 16px;
  z-index: 2;
  bottom: 10vh;

  > * {
    display: block;
    margin: 0 !important;
    margin-bottom: 8px !important;
  }
}
  1. 为按钮添加点击的锚点跳转事件
<el-button @click="goAnchor(target)" icon="el-icon-goods" circle></el-button>

goAnchor方法,传入跳转目标dom元素的id,并控制滑动条滑相应位置

goAnchor(id) {
  document.querySelector(id).scrollIntoView({
    behavior: 'smooth',
  });
},
  1. 此时会发现,点击后,目标区域的上部被导航栏遮住了,此时我们为滑动条添加一个8rem上距,不用导航栏的高度5rem,是因为顶端直接贴着导航栏而没有处于页面的较中心
<style>
html {
  /** 导航栏高5rem,滚动条距顶8rem是为了让锚点跳转时处于更中心的位置*/
  scroll-padding-top: 8rem;
}
</style>
  1. 为锚点按钮添加悬浮提示效果,此时通过js去实现,原先的按钮是一体的,难以实现更换内容,因此需要重构一下,把这个按钮拆成2层,由于我们需要悬浮时替换el-button的内容,而图标和文字属于两种不兼容的元素,可以通过v-html来动态渲染
<div v-for="(item,idx) in anchorBtns" :key="idx" @mouseenter="onAnchorBtn(item)"        @mouseleave="leaveAnchorBtn(item)">
  <el-button @click="goAnchor(item.target)" v-html="item.content" circle></el-button>
</div>

锚点按钮改为数据驱动的动态渲染

export default {
  //...
  data() {
    //...
    anchorBtns: [
      { target: '#top', content: '<el-icon class="el-icon-top"></el-icon>', hint: '<div>顶</div>' },
      { target: '#goods', content: '<el-icon class="el-icon-goods"></el-icon>', hint: '<div>商</div>' },
      { target: '#discount', content: '<el-icon class="el-icon-discount"></el-icon>', hint: '<div>抢</div>' },
      { target: '#present', content: '<el-icon class="el-icon-present"></el-icon>', hint: '<div>租</div>' }
    ]
  
  }
}

@mouseenter触发的方法,交换提示内容和图标内容,让鼠标悬浮按钮时渲染文字提示(switchAnchorContent是一个交换item的hint和content的函数,就不摆出来了)

onAnchorBtn(item) {
  //switchAnchorContent是一个交换item的hint和content的函数,就不摆出来了
  this.switchAnchorContent(item);
},

@mouseleave触发的方法,鼠标离去时把内容再换回来,恢复图标

leaveAnchorBtn(item) {
  this.switchAnchorContent(item);
}
  1. 此时基本上实现了,但还存在一个瑕疵,就是悬浮时按钮会抖一下,这是因为el-icon和我们div里的字体不一样导致的,设置字体大小一样即可
.anchor-tool {
  position: fixed;
  padding-left: 16px;
  z-index: 2;
  bottom: 10vh;

  > * {
    display: block;
    margin: 0 !important;
    margin-bottom: 8px !important;

    > * {
      /**规定el-icon和div字体一样大,防止按钮切换内容时因规格不一致而变形 */
      font-size: 1rem !important;
    }
  }
}
  1. CSDN的锚点按钮提示文字是4个字,我们也想做4个字的话,只要调整按钮的大小以及内容的大小,保证内容不会挤压到按钮的外框导致变形,同时图标的大小和文字div块大小一致即可,本文在这里不再做演示。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,以下是实现 Vue+Element-UI上传图片并压缩的基本步骤: 1. 安装依赖 在项目中安装 Element-UI 和插件 vue-image-crop-upload 以及图片压缩库,可使用以下命令: ``` npm install element-ui vue-image-crop-upload compressjs --save ``` 2. 引入 Element-UI 在 main.js 中引入 Element-UI: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) ``` 3. 使用 vue-image-crop-upload 在需要上传图片的组件中使用 vue-image-crop-upload,可使用以下代码: ```vue <template> <div> <vue-image-crop-upload ref="upload" :url="uploadUrl" :headers="uploadHeaders" :size="size" :accept="accept" :beforeUpload="beforeUpload" :cropConfig="cropConfig" :compressConfig="compressConfig" @input="handleInput" @crop-success="handleCropSuccess" > <el-button size="small" type="primary">上传图片</el-button> </vue-image-crop-upload> </div> </template> <script> import VueImageCropUpload from 'vue-image-crop-upload' export default { components: { VueImageCropUpload }, data() { return { uploadUrl: 'xxx', // 上传地址 uploadHeaders: { // 上传请求头 Authorization: 'Bearer ' + getToken() }, size: 1024 * 1024 * 2, // 上传图片大小限制 accept: '.jpg,.jpeg,.png', // 上传图片格式限制 cropConfig: { // 图片裁剪配置 aspectRatio: 1 / 1, autoCropArea: 1, viewMode: 1, zoomable: false, guides: false, dragMode: 'move', cropBoxResizable: false, crop: () => {} }, compressConfig: { // 图片压缩配置 targetSize: 1024 * 1024, // 目标大小 quality: 0.7, // 压缩质量 mimeType: 'image/jpeg' // 输出格式 } } }, methods: { beforeUpload(file) { // 文件上传前的回调函数 this.$refs.upload.startUpload() }, handleInput(file) { // 文件选择后的回调函数 this.$refs.upload.showCrop() }, handleCropSuccess(blob, file) { // 图片裁剪成功后的回调函数 this.compressImage(blob, file) // 压缩图片 }, compressImage(blob, file) { // 图片压缩 const reader = new FileReader() reader.readAsDataURL(blob) reader.onload = (e) => { const base64 = e.target.result const compressedBlob = Compress.compress(base64, this.compressConfig) const compressedFile = new File([compressedBlob], file.name, { type: compressedBlob.type }) this.$emit('upload', compressedFile) // 触发上传事件 } } } } </script> ``` 4. 完成上传 在父组件中监听上传事件,使用 axios 或其他方法上传文件至服务器: ```vue <template> <div> <upload :action="uploadUrl" @upload="handleUpload"></upload> </div> </template> <script> import axios from 'axios' import Upload from './Upload.vue' export default { components: { Upload }, data() { return { uploadUrl: 'xxx' // 上传地址 } }, methods: { handleUpload(file) { const formData = new FormData() formData.append('file', file) axios.post(this.uploadUrl, formData).then(response => { console.log(response.data) }) } } } </script> ``` 以上就是实现 Vue+Element-UI上传图片并压缩的基本步骤,您可以根据您的具体需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值