关于 iconfont 在pc上面部分浏览器中显示问题

本文讨论了iconfont字体图标库在不同浏览器中显示尺寸不一致的问题,特别是360浏览器中遇到的line-height属性问题。推荐使用IcoMoon.io来导入SVG并生成规范尺寸,以解决跨浏览器兼容性问题。

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

icon font 字体图标库的问题

作为前端自定义字体图标库相信大部分人已经使用过了,列举下面一些个问题

  • 自定义图标的时候尺寸控制
  • 导出的图标在其他浏览器上面的尺寸不同

尺寸在倒入的时候自行控制,这个就不必多说了,耐心操作
主要说快速处理导出的时候在其他浏览器上面的问题

先说明一下当前的问题场景,入下图所示
这里写图片描述
chrome浏览器与主流的高级浏览器基本都是支持的,不存在什么问题,看下图
这里写图片描述
这里写图片描述
这里写图片描述
在360中出现了line-height属性的问题,因为当前下载下来的字体图标是已经打包好,这时候只能提供svg,而无法找到目标源,即在iconfont上面的地址是位于哪个项目的,查找起来麻烦。

解决方式:https://icomoon.io/
把你的svg导入,生成规范的尺寸出来,再进行下载,强大

具体操作如下:
这里写图片描述这里写图片描述
这里写图片描述这里写图片描述
就完毕了,使用就跟iconfont一致,可以不用定义icon iconfont前缀

<think>我们已经在之前的讨论中详细说明了如何根据语言动态切换广告位PID。现在,根据您给出的思路(同语言显示同banner),我将提供一个更简洁的实现方案,特别针对eyoucms模板标签。 ### 解决方案:动态广告位PID #### 步骤1:在公共函数文件中定义语言映射 在`/application/common.php`中添加以下函数: ```php /** * 获取当前语言 */ function get_current_lang() { // 1. 从URL参数获取(例如:?lang=en) if (isset($_GET['lang']) && in_array($_GET['lang'], ['zh', 'en', 'ja'])) { return $_GET['lang']; } // 2. 从Session获取 if (isset($_SESSION['user_lang']) && in_array($_SESSION['user_lang'], ['zh', 'en', 'ja'])) { return $_SESSION['user_lang']; } // 3. 从Cookie获取 if (isset($_COOKIE['site_lang']) && in_array($_COOKIE['site_lang'], ['zh', 'en', 'ja'])) { return $_COOKIE['site_lang']; } // 4. 从浏览器语言获取 $browserLang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); if (in_array($browserLang, ['zh', 'en', 'ja'])) { return $browserLang; } // 5. 默认语言 return 'zh'; // 默认中文 } /** * 根据语言获取广告位PID */ function get_banner_pid() { $lang = get_current_lang(); $map = [ 'zh' => 1, // 中文广告位PID 'en' => 2, // 英文广告位PID 'ja' => 3 // 日文广告位PID ]; return $map[$lang] ?? $map['zh']; // 默认中文 } ``` #### 步骤2:在模板中动态调用广告位 修改模板文件(例如:`/template/pc/default/index/index.html`)中的banner部分: ```html <section class="home-banner"> <div class="swiper" id="indexbanner"> <div class="swiper-wrapper"> <!-- 动态调用广告位,使用函数get_banner_pid()获取当前语言对应的PID --> {eyou:adv pid=':get_banner_pid();'} <div class="swiper-slide"> <a href="{$field.links}" title="{$field.title}" class="pcimg"> <img src="{$field.litpic}" width="1920" height="801" alt="{$field.title}"/> </a> <a href="{$field.links}" title="{$field.title}" class="mobimg"> <img src="{$field.litpic}" width="750" height="313" alt="{$field.title}"/> </a> <div class="banner-animote"> <div class="title">{$field.title}</div> <div class="text">{$field.intro}</div> </div> </div> {/eyou:adv} </div> <div class="swiper-pagination banner-pagination"></div> <div class="banner-button-next"><em class="iconfont icon-xiangyoujiantou"></em></div> <div class="banner-button-prev"><em class="iconfont icon-xiangzuojiantou"></em></div> </div> </section> ``` #### 步骤3:创建语言切换控制器 创建文件`/application/index/controller/Language.php`: ```php <?php namespace app\index\controller; use think\Controller; class Language extends Controller { public function switchLang($lang = 'zh') { // 验证语言 $allowedLangs = ['zh', 'en', 'ja']; if (!in_array($lang, $allowedLangs)) { $this->error('语言支持'); } // 设置Session session('user_lang', $lang); // 设置Cookie(30天有效期) cookie('site_lang', $lang, 30 * 86400); // 返回上一页 $this->redirect($_SERVER['HTTP_REFERER']); } } ``` #### 步骤4:在模板中添加语言切换链接 在需要切换语言的地方(如页眉)添加: ```html <div class="language-switcher"> <a href="{:url('index/language/switchLang', ['lang'=>'zh'])}">中文</a> <a href="{:url('index/language/switchLang', ['lang'=>'en'])}">English</a> <a href="{:url('index/language/switchLang', ['lang'=>'ja'])}">日本語</a> </div> ``` #### 步骤5:配置路由(可选) 在`/application/route.php`中添加: ```php use think\Route; Route::get('switch-lang/:lang', 'index/language/switchLang'); ``` ### 原理解释 1. **动态广告位PID**: - 通过`get_banner_pid()`函数获取当前语言对应的广告位ID - 在eyoucms标签中,使用`pid=':get_banner_pid();'`动态传入PID - 函数内部维护语言到广告位ID的映射 2. **语言切换流程**: - 用户点击语言链接 → 调用`switchLang`方法 - 方法设置Session和Cookie → 重定向回原页面 - 页面重新加载时,`get_current_lang()`会读取新的语言设置 - 广告位PID随之更新,展示对应语言的banner ### 注意事项 1. **广告位创建**: - 在后台创建三个广告位,PID分别为1(中文)、2(英文)、3(日文) - 每个广告位添加对应语言的广告内容 2. **缓存问题**: - 如果使用了页面缓存,需要在语言切换时清除缓存 - 在广告标签中添加随机参数避免缓存:`{eyou:adv pid=':get_banner_pid();' rand=':time();'}` 3. **默认语言**: - 确保默认语言(中文)的广告位PID=1存在 4. **SEO优化**: - 为同语言版本添加hreflang标签,帮助搜索引擎识别多语言页面 ### 高级优化:无刷新切换(AJAX) ```javascript // 语言切换按钮事件 $('.lang-switch').click(function(e) { e.preventDefault(); var lang = $(this).data('lang'); // 发送AJAX请求切换语言 $.post('/switch-lang', {lang: lang}, function() { // 重新加载banner区域 reloadBanner(); }); }); // 重新加载banner function reloadBanner() { $.get(window.location.href, function(html) { var newBanner = $(html).find('.home-banner').html(); $('.home-banner').html(newBanner); // 重新初始化Swiper if (typeof Swiper !== 'undefined') { new Swiper('#indexbanner', { // ...配置... }); } }); } ``` ### 最终效果 - 中文用户访问时,显示PID=1的banner(中文广告) - 英文用户访问时,显示PID=2的banner(英文广告) - 日文用户访问时,显示PID=3的banner(日文广告) - 用户切换语言后,页面刷新并显示对应语言的banner §§相关问题§§: 1. 如何在eyoucms中实现多语言内容管理(文章、产品等) 2. 使用AJAX实现无刷新语言切换时如何避免页面闪烁 3. 多语言网站如何设置404页面和错误处理 4. 在eyoucms中如何批量导入多语言内容</think>### 详细解决方案:在eyoucms中实现多语言banner切换 根据您的思路,我将提供完整的实现方案,让同语言显示同的banner。以下是详细的步骤和代码: #### 核心思路 1. 为每种语言创建独立的广告位(同PID) 2. 根据当前语言动态选择广告位PID 3. 在模板中动态调用对应语言的广告位 #### 完整实现代码 ##### 步骤1:创建语言识别函数(局函数) 在`/application/common.php`中添加: ```php // 获取当前语言 function get_current_lang() { // 1. 检查URL参数(最高优先级) if (!empty($_GET['lang'])) { $lang = substr($_GET['lang'], 0, 2); if (in_array($lang, ['zh', 'en'])) { return $lang; } } // 2. 检查会话(用户本次访问设置) if (!empty($_SESSION['user_lang'])) { return $_SESSION['user_lang']; } // 3. 检查Cookie(长期设置) if (!empty($_COOKIE['site_lang'])) { return $_COOKIE['site_lang']; } // 4. 检查浏览器语言 if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); if (in_array($browser_lang, ['zh', 'en'])) { return $browser_lang; } } // 5. 默认语言(从系统配置获取) return \think\Config::get('default_lang') ?: 'zh'; } // 获取当前语言的banner PID function get_banner_pid() { $lang = get_current_lang(); // 语言到PID的映射(可在后台配置) $map = [ 'zh' => 1, // 中文广告位PID 'en' => 2 // 英文广告位PID // 添加更多语言... ]; return $map[$lang] ?? $map['zh']; // 默认使用中文 } ``` ##### 步骤2:创建语言切换控制器 创建`/application/index/controller/Language.php`: ```php <?php namespace app\index\controller; class Language extends \think\Controller { // 语言切换 public function switchLang($lang = 'zh') { // 验证语言是否合法 $allowed_langs = ['zh', 'en']; if (!in_array($lang, $allowed_langs)) { $this->error('支持的语言'); } // 设置会话 session('user_lang', $lang); // 设置Cookie(30天有效期) cookie('site_lang', $lang, 30 * 86400); // 返回上一页 $this->redirect($_SERVER['HTTP_REFERER']); } } ``` ##### 步骤3:修改模板文件 在您的模板文件(如`/template/pc/default/index/index.html`)中修改banner部分: ```html <!-- 语言切换按钮 --> <div class="language-switcher"> <a href="{:url('index/language/switchLang', ['lang' => 'zh'])}" class="lang-zh">中文</a> <a href="{:url('index/language/switchLang', ['lang' => 'en'])}" class="lang-en">English</a> </div> <!-- 动态banner区域 --> <section class="home-banner"> <div class="swiper" id="indexbanner"> <div class="swiper-wrapper"> <!-- 动态PID调用:根据语言选择同的广告位 --> {eyou:adv pid=':get_banner_pid();'} <div class="swiper-slide"> <a href="{$field.links}" title="{$field.title}" class="pcimg"> <img src="{$field.litpic}" width="1920" height="801" alt="{$field.title}"/> </a> <a href="{$field.links}" title="{$field.title}" class="mobimg"> <img src="{$field.litpic}" width="750" height="313" alt="{$field.title}"/> </a> <div class="banner-animote"> <div class="title">{$field.title}</div> <div class="text">{$field.intro}</div> </div> </div> {/eyou:adv} </div> <div class="swiper-pagination banner-pagination"></div> <div class="banner-button-next"><em class="iconfont icon-xiangyoujiantou"></em></div> <div class="banner-button-prev"><em class="iconfont icon-xiangzuojiantou"></em></div> </div> </section> ``` ##### 步骤4:配置路由(可选) 在`/application/route.php`中添加: ```php use think\Route; Route::get('switch-lang/:lang', 'index/language/switchLang'); ``` ##### 步骤5:后台广告位设置 1. 登录eyoucms后台 2. 进入「系统」→「广告管理」→「广告位管理」 3. 创建两个广告位: - 中文首页轮播 (PID=1) - 英文首页轮播 (PID=2) 4. 为每个广告位添加对应的banner内容 #### 实现原理详解 1. **语言检测流程**: - 系统通过`get_current_lang()`函数检测当前语言 - 检测顺序:URL参数 > 会话 > Cookie > 浏览器语言 > 默认语言 - 确保用户手动选择的语言优先级最高 2. **动态PID调用**: - `get_banner_pid()`函数根据当前语言返回对应的PID - 在模板中使用`{eyou:adv pid=':get_banner_pid();'}`动态调用广告位 - 中文用户:调用PID=1的广告位 - 英文用户:调用PID=2的广告位 3. **语言切换机制**: ```mermaid sequenceDiagram 用户->>前端: 点击语言切换按钮 前端->>后端: 请求 /switch-lang/en 后端->>后端: 设置session和cookie 后端->>前端: 重定向回原页面 前端->>后端: 重新加载页面 后端->>模板引擎: 渲染页面 模板引擎->>PHP: 调用get_banner_pid() PHP->>模板引擎: 返回当前PID(如2) 模板引擎->>前端: 输出英文banner ``` #### 高级优化:AJAX无刷新切换 ```javascript // 在模板底部添加 <script> $(document).ready(function() { // 语言切换按钮点击事件 $('.language-switcher a').click(function(e) { e.preventDefault(); var lang = $(this).hasClass('lang-en') ? 'en' : 'zh'; // 发送AJAX请求切换语言 $.ajax({ url: '/switch-lang/' + lang, type: 'GET', success: function() { // 重新加载banner区域 reloadBanner(); } }); }); // 重新加载banner function reloadBanner() { $.ajax({ url: window.location.href, data: { 'partial': 'banner' }, // 只请求banner部分 success: function(response) { // 提取新的banner内容 var newBanner = $(response).find('.home-banner').html(); // 替换当前banner $('.home-banner').html(newBanner); // 重新初始化Swiper if (typeof Swiper !== 'undefined') { new Swiper('#indexbanner', { loop: true, pagination: { el: '.swiper-pagination', clickable: true }, navigation: { nextEl: '.banner-button-next', prevEl: '.banner-button-prev' }, autoplay: { delay: 5000, } }); } } }); } }); </script> ``` #### 后台控制器优化(支持部分加载) 在控制器中添加部分加载支持: ```php // /application/index/controller/Index.php public function index() { // ...原有代码... // 如果是AJAX请求且只请求banner部分 if ($this->request->isAjax() && $this->request->param('partial') == 'banner') { return $this->fetch('index/banner'); } return $this->fetch(); } ``` 创建部分模板文件`/template/pc/default/index/banner.html`: ```html <!-- 只包含banner部分 --> <section class="home-banner"> <!-- ...banner代码与主模板相同... --> </section> ``` #### 多语言SEO优化 在模板头部添加: ```html <head> <!-- 多语言SEO --> <link rel="alternate" hreflang="zh" href="{:url('index/index/index', ['lang' => 'zh'])}" /> <link rel="alternate" hreflang="en" href="{:url('index/index/index', ['lang' => 'en'])}" /> <!-- 设置当前页面语言 --> <meta property="og:locale" content="{:get_current_lang()}" /> <!-- 语言切换的规范URL --> {if get_current_lang() == 'zh'} <link rel="canonical" href="{:url('index/index/index', ['lang' => 'zh'])}" /> {else} <link rel="canonical" href="{:url('index/index/index', ['lang' => 'en'])}" /> {/if} </head> ``` #### 注意事项 1. **缓存处理**: - 在广告标签中添加随机参数:`{eyou:adv pid=':get_banner_pid();' rand=':time();'}` - 在语言切换时清除模板缓存 2. **默认语言设置**: 在`/config/app.php`中添加: ```php 'default_lang' => 'zh', // 默认语言 ``` 3. **广告位存在处理**: ```php function get_banner_pid() { // ...原有代码... // 检查PID是否存在 $exists = \think\Db::name('adv')->where('pid', $pid)->find(); return $exists ? $pid : $map['zh']; } ``` 4. **多语言扩展**: - 添加新语言只需在映射数组中添加: ```php $map = [ 'zh' => 1, 'en' => 2, 'fr' => 3, // 法语 'es' => 4 // 西班牙语 ]; ``` ### 最终效果 - 中文用户访问时,显示PID=1的中文banner - 英文用户访问时,显示PID=2的英文banner - 用户可以通过语言切换按钮实时切换语言 - 系统会记住用户的语言偏好(通过session和cookie)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值