背景偏移取图标

本文介绍了一种提高网页加载速度的技术——CSS Sprite,并通过示例展示了如何将多个小图标整合到一张大图中,再利用 CSS 的 background-position 属性来显示特定图标,从而减少 HTTP 请求次数。

  通常为了减少客户端从服务器下载图片的次数,提高服务器的性能,现在比较流行的做法是将多张图片拼合成一张大图片,然后再利用background-position属性截取其中的各个小图标,如菜单,表单或导航的小图标等这种技术称为CSS Sprite技术,示例代码如下:
html代码如下:

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
<title>背景偏移取图标</title>
<link type="text/css" rel="stylesheet" href="1.css"/>
</head>
<body>
    <div id="name">name</div>
    <div id="psw">psw</div>
    <div id="tel">tel</div>
</body>
</html>

1.css代码如下:

div
  {
     width:73px;
     line-height:52px;
     height:52px;
     text-align:right;
     background:url(images/3.jpg) no-repeat;
     color:white;
    }
 #name
   {
     background-position:-286px -7px;<!--向左偏移286px,向上偏移7px-->
  } 
#psw 
  { 
    background-position:-272px -116px; 
  } 
#tel
 { 
    background-position:-535px -230px;
 }

 (要用图片处理工具量出要截取的的图标所要偏移的量,正负代表偏移的方向,正代表向右或向下偏移,负代表向左或向上偏移)

素材图:

最终效果图:

 

转载于:https://www.cnblogs.com/cyn941105/p/5667923.html

<think> 我们正在解决Element Menu中加载本地png文件作为图标的问题。根据引用[1],用户遇到的问题是:在循环中使用动态路径时,图片不显示(而写死的路径可以显示为base64格式)。引用[2]提供了一种通过CSS背景图替换默认图标的方法。 解决方案思路: 1. 使用CSS背景图方法(如引用[2])来替换图标,这样我们可以直接使用本地png文件路径。 2. 确保在循环中,每个菜单项图标的类名是唯一的,或者通过行内样式设置背景图(但行内样式无法使用伪元素,所以需要调整)。 3. 注意:引用[1]中用户提到循环出来的路径没有转换成base64,而写死的路径可以。这可能是由于webpack或构建工具对动态路径和静态路径处理方式不同。因此,我们需要确保动态路径能够被正确加载。 具体步骤: 方法一:使用CSS类名(适用于图标种类有限的情况) - 为每个图标预先定义CSS类,每个类对应一个png文件。 - 在循环中,根据数据为每个菜单项设置对应的类名。 方法二:使用行内样式设置背景图(适用于图标种类多或动态路径) - 注意:使用行内样式时,不能使用伪元素,因此需要调整结构。 - 我们可以不使用`::before`来隐藏默认图标,而是直接用一个div来显示背景图,并隐藏默认图标。 详细步骤(方法二): 步骤1:在菜单项中,我们使用一个div(或其他元素)来显示图标,而不是使用Element自带的图标类(如`el-icon-xxx`)。 步骤2:通过行内样式设置这个div的背景图为本地png文件。 步骤3:隐藏默认的图标(如果有的话)。 修改模板如下: ```vue <el-menu> <el-submenu v-for="(item, index) in menuList" :key="index" :index="index.toString()"> <template slot="title"> <!-- 自定义图标容器 --> <div class="custom-icon" :style="{ backgroundImage: 'url(' + item.icon + ')' }"></div> <span>{{ item.title }}</span> </template> <!-- 子菜单项 --> </el-submenu> </el-menu> ``` 步骤4:添加CSS样式: ```css .custom-icon { display: inline-block; width: 24px; height: 24px; background-size: cover; /* 使背景图覆盖整个容器 */ margin-right: 8px; /* 和原本的图标间距保持一致 */ } /* 隐藏Element UI默认的图标 */ .el-submenu__title i { display: none !important; } ``` 注意:这里我们通过行内样式动态绑定背景图的路径(`item.icon`是数据中每一项的图标路径)。这样在循环中,每个菜单项都会使用自己的图标。 关于路径问题: - 如果使用Vue CLI(webpack)构建,我们通常将图片放在`src/assets`目录下,然后在数据中使用require动态引入,这样可以确保路径被正确处理。 - 修改数据中的icon字段为:`icon: require('@/assets/icons/' + 图片文件名)` 例如: ```javascript data() { return { menuList: [ { title: '首页', icon: require('@/assets/icons/home.png') }, { title: '用户管理', icon: require('@/assets/icons/user.png') } ] } } ``` 这样,在循环中,每个路径都会被webpack处理,转换为正确的路径(可能是base64,也可能是打包后的路径,决于文件大小和配置)。 方法三:如果不想使用require,也可以将图片放在public目录,然后使用绝对路径。但是这样在构建后路径可能会变化,所以建议使用require。 总结: - 使用自定义元素(div)通过行内样式设置背景图,并隐藏默认图标。 - 在数据中使用require引入图片,确保webpack处理路径。 这样就能解决循环中动态路径图片不显示的问题。 如果问题仍然存在,请检查: - 图片路径是否正确(在require中使用正确的相对路径)。 - 图片是否存在。 最后,我们还可以参考引用[3]中的调整菜单宽度的方式,如果图标大小不合适,可以调整容器的宽高和背景大小。 </think> ### Element Menu 加载本地 PNG 文件作为图标的解决方案 在 Element UI 的 Menu 组件中使用本地 PNG 文件作为图标,关键要解决路径处理和动态渲染问题。以下是详细解决方案: #### 方法一:静态路径直接引用(简单场景) 适用于固定不变的图标: ```vue <el-menu> <el-menu-item index="1"> <template #title> <!-- 直接写死本地路径 --> <img src="@/assets/icons/home.png" class="custom-icon"> <span>首页</span> </template> </el-menu-item> </el-menu> <style> .custom-icon { width: 20px; height: 20px; margin-right: 8px; vertical-align: middle; } </style> ``` #### 方法二:动态路径循环渲染(推荐方案) **解决引用[1]中描述的循环路径问题**: ```vue <template> <el-menu> <el-menu-item v-for="item in menuItems" :key="item.index" :index="item.index" > <template #title> <!-- 使用 require 动态加载路径 --> <img :src="require(`@/assets/icons/${item.icon}.png`)" class="custom-icon"> <span>{{ item.title }}</span> </template> </el-menu-item> </el-menu> </template> <script> export default { data() { return { menuItems: [ { index: '1', title: '首页', icon: 'home' }, { index: '2', title: '用户', icon: 'user' } ] } } } </script> ``` **关键点**: 1. 使用 `require()` 动态加载路径确保 Webpack 正确处理文件 2. PNG 文件统一存放在 `src/assets/icons/` 目录 3. 图标文件名不带扩展名(如 `home` 对应 `home.png`) #### 方法三:CSS 背景图替换图标类(兼容方案) 如引用[2]所述,通过覆盖 Element 的图标类: ```vue <el-menu> <el-menu-item index="1"> <template #title> <i class="el-icon-custom-home"></i> <!-- 自定义图标类 --> <span>首页</span> </template> </el-menu-item> </el-menu> <style> /* 替换默认图标 */ .el-icon-custom-home { background: url('~@/assets/icons/home.png') center/contain no-repeat; } .el-icon-custom-home:before { content: " "; /* 空内容隐藏默认图标 */ visibility: hidden; } /* 调整菜单位置(引用[3]的间距问题) */ .sidebar-container .el-menu-item { padding-left: 20px !important; } </style> ``` #### 解决常见问题 1. **图片不显示问题(引用[1])**: - 使用 `require` 动态加载路径✅ - 确认 PNG 文件在正确目录(建议 `assets/icons/`) - 检查 Webpack 配置是否处理 PNG 文件: ```js // vue.config.js module.exports = { chainWebpack: config => { config.module .rule('images') .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/) } } ``` 2. **图标位置偏移问题(引用[3])**: ```css /* 垂直居中调整 */ .el-menu-item > .el-tooltip { display: flex; align-items: center; } .custom-icon { margin-top: -3px; /* 微调位置 */ } ``` 3. **高亮状态处理**: ```css .el-menu-item.is-active .custom-icon { filter: brightness(1.2); /* 提高亮度 */ } ``` #### 最佳实践建议 1. **文件命名规范**:使用小写字母+连字符(如 `user-management.png`) 2. **图标尺寸**:统一使用 24x24px 或 20x20px PNG 文件 3. **性能优化**: ```vue <!-- 使用 webp 格式减少体积 --> <img :src="require(`@/assets/icons/${item.icon}.webp`)"> ``` > 通过 `require` 动态加载是解决循环中路径问题的核心方案(引用[1]),同时结合 CSS 调整可确保图标正确显示和定位(引用[2][3])[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值