怎么自定义字体_自定义字体@fontface的常见应用

前言

@font-face允许网页自带字体,从而消除对用户电脑字体的依赖。基本用法如下:

@font-face {    font-family: "family-name"; /* 字体名 */    src: url("family-name.eot"); /* IE9 */    src: url("family-name.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */         url("family-name.woff") format("woff"), /* chrome、firefox */         url("family-name.ttf") format("truetype"), /* chrome、firefox、opera、Safari, Android, iOS 4.2+ */         url("family-name.svg#family-name") format("svg"); /* iOS 4.1- */        unicode-range: ; /* 哪些字符需要使用这个字体 */    font-weight: normal;  /* 字体粗细 */    font-style: normal;  /* 字体样式 */}

当页面中用到这个字体,且用户设备中没有这个字体,就会从@font-face中指定的路径下载字体文件。以下几点请注意:

1.因各浏览器对字体的兼容不同,需要同时备有多种字体样式,请参考浏览器兼容情况;

2.字体文件的路径需要和网页在同一域名下,否则需要做跨域处理;

3.unicode-range设置只使用该字体的个别字符,有一定实用性,请参考文档使用;

本文列举@font-face的常见应用。

自定义字体

@font-face最原始的应用场景,就是使用用户电脑里没有的字体。举例:

e513096e89cd13644e63179dd62a8b7a.png

某狗电商网站,使用@font-face引入方正字体。CSS中的@font-face依次配置了eto、woff、truetype、svg四种格式,格式参考上文。Chrome选择下载woff格式,其余格式不下载。文件地址来自misc.360buyimg.com域名,与页面自身域名不一致,使用Cors跨域。至此,字体已下载到用户的设备中了,可以直接在css中使用通过font-family调用。

成套的中文字体包含大量字符,文件通常都比较大,动辄几M的字体文件会拖累页面加载速度,影响用户体验。上述这个页面中,使用到方正字体的只有28个汉字,因此对字体进行了子集化的处理,精简后文件大小只有6.47K。关于字体子集化,请参考我的上一篇博客。

自定义图标

@font-face的另一个常见应用,是取代图片格式的图标,举例:

b236f54f7fbab4c5fdab76e43f8a4a68.png

某鸟社交网站的LOGO是一只蓝色小鸟,查看这个小鸟源码,发现这个元素使用一个空的标签。该标签中有一个::before伪元素,内容是"/f179",字体名是"edgeicons"。我们找到页面资源,下载这个字体,用字体编辑软件打开,找到unicode编码为f179的字形:

d49f0935bb07a789a75c1620512f6af9.png

可以看到,这个字形就是该网站的LOGO,因此页面中的这个字就会显示成LOGO的形状。使用字体绘制图标不仅比图片要更小,减少请求次数,还可以通过font-size矢量缩放大小,通过color设置图标颜色,使用起来也是非常便捷。

在线制作的字形图标的工具,国外用户推荐fontello,国内用户推荐iconfont。

反爬虫抓取

第一次听到字体竟然可以用于反爬虫,谁都会大吃一惊。先看例子:

f1ecd7ad9733a65d7ce103e7e24cd6d7.png

某骆驼订票网站,页面上价格明明就是1590,查看源码怎么就变成1580了?继续查css,发现此处使用@font-face引入一个自定义字体如下:

592499d5e44cc62a311a6eb6ffd301ff.png

原来,狡猾的工程师把自定义字体中的字符“8”,形状绘制成“9”的形状。这样页面中用到这个字体的所有8,都会显示为9。注意这里字体每次都会动态生成,并配合生成页面内容,使得用户页面上看到的形状都是“1590”,从而理解到正确的价格。而蠢萌的爬虫抓取到的内容,则是错误的1580。

在许多竞争激烈的行业,价格这种敏感数据,不能轻易被友商的爬虫抓取。不过所谓道高一尺、魔高一丈,某猫电影票也使用这种反爬虫策略,但网上已经出现了对页面截图、并进行图象识别的python脚本。

其他脑洞

受限于公众号不能直接修改网页源码, 有些效果展示不了。有兴趣的朋友可以点击原文链接,跳转到我博客上的原文,了解一下自定义字体的其他应用。

6adbf936e269031902d1a3b681991eda.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue项目中使用mock(一)

一,安装 npm install mockjs --save-dev npm install json5 --save-dev npm install axios --save 二,每个文件内容 目录: 流程: Home.vue执行getUserInforList() 调用main.js中全局变量$api 调用/utils/api下的getUserInfo…

使用RxJava和Completable并行执行阻止任务

借助RxJava 1.1.1中引入的Completable抽象,如何并行执行阻止“仅副作用”(也称为void)任务的并行执行变得更加容易。 “ 正如您可能已经注意到,阅读我的博客时,我主要专注于软件Craft.io和自动代码测试。 但是&#x…

javafx 使用_使用JavaFX AnimationTimer

javafx 使用回想一下,给AnimationTimer起个名字可能不是一个好主意,因为它不仅可以用于动画,还可以用于测量fps速率,碰撞检测,模拟步骤,游戏主循环等。实际上,我大部分时间都在看AnimationTimer…

.Net Core 简洁架构事件(这个不完整,待仔细补充)

.Net Core的架构 - 根据微软官方文档 微软给出了.Net Core的架构方法,无论是在web,azure,uwp等等 微软的github地址:https://github.com/dotnet-architecture/eShopOnWeb 转载于:https://www.cnblogs.com/bijinshan/p/8250512.htm…

原理图中如何连线_Altium Designer10绘制原理图

在进行原理图绘制之前,应先将原理图库与PCB库相关联,在原理图绘制完成后,在生成PCB图,如何将原理图库与PCB库相关联?先进入原理图库,如下图所示。双击元器件文件,进行元器件配置。 元器件配置界面如下图所示。选择Add...进行添加对应的PCB库。 选择浏览进行查找相关PCB库…

NetBeans Java EE技巧3:数据库中的RESTful Web服务

许多现代的Web应用程序正朝着使用HTTP使用无状态通信的方向发展。 REST(代表性状态转移)体系结构样式通常用于设计网络应用程序,而使用Java EE 7,很容易开发用于数据库通信的RESTful后端。 使用简单的POJO(普通的Java旧…

参数php_PHP多参数方法的重构

php中文网最新课程每日17点准时技术干货分享假设我们要完成一个保存文章的功能&#xff0c;如果采用函数编程的方式&#xff0c;大概会是下面这个样子&#xff1a;<?php function saveArticle($title, $content, $categoryId){ // ...}?>每个参数代表一个属性&#…

k8s集群部署成功后某个节点突然出现notready状态的问题原因分析和解决办法

文章目录 1、问题描述2、查看node03的日志3、错误原因分析4、解决办法 1、问题描述 k8s集群配置为 一主三个节点&#xff1b;刚开始运行一直正常&#xff1b;某天突然node03主机状态变为notready&#xff0c;问题如下&#xff1a; 在master节点使用&#xff1a; #master节点…

kickstart_具有Java Kickstart的MongoDB

kickstartNoSQL数据库由于其可伸缩性而变得越来越流行。 适当使用时 NoSQL数据库可以提供真正的好处。 MongoDB是使用C 编写的高度可扩展的开源NoSQL数据库。 1.安装MongoDB 您可以按照所使用的操作系统&#xff0c;按照MongoDB官方网站上的说明安装MongoDB&#xff0c;而不会…

DataGuard之DG环境搭建

DG 环境搭建 1.设置归档模式 DG环境的搭建必须要把数据库启动到归档模式&#xff0c;并且为了避免开发人员使用nologging语句&#xff0c;我们还要把数据库设置为force logging。 查看数据库是否运行在归档模式&#xff1a; #su - oracle $sqlplus / as sysdba SQL>archive…

a算法解决八数码问题_javascript,八皇后问题解决

八皇后问题 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。 该问题是国际西洋棋棋手马克斯贝瑟尔于1848年提出&#xff1a; 在88格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c; 即&#xff1a;任意两个皇后都不能处于…

CentOS6.9部署zabbix3.0监控系统

环境&#xff1a; [rootredis ~]# uname -a Linux redis 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux [rootredis ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [rootredis ~]# getenforce Disabled [rootredis …

输出整形变量语句_Python合集之Python变量

在上一节的合集中&#xff0c;我们了解了Python的保留字与标识符&#xff0c;本节我们将进一步了解一下Python中关于变量的问题。变量严格意义上来讲应该称之为“名称”&#xff0c;也可以理解为标签。在Python中&#xff0c;不需要先声明变量名及其数据类型&#xff0c;直接赋…

activemq 连接_ActiveMQ网络连接器

activemq 连接这篇文章对我以及对ActiveMQ的网络连接器的工作方式可能感兴趣的任何ActiveMQ贡献者都适用。 我最近花了一些时间查看代码&#xff0c;并认为最好画一些快速的图表来帮助我记住我学到的知识&#xff0c;并在将来发现问题时帮助将来确定在哪里进行调试。 如果我输入…

如何让fragment刷新界面_快速实现android版抖音主界面的心得

原文作者&#xff1a;DK_BurNIng如何快速确定竞品某个界面的实现方式&#xff1f;当你收到产品一个需求是模仿某个竞品且时间很短没有过多时间给你调研技术方案的时候&#xff0c;如何尽快确定这个功能的技术方案呢&#xff1f; 这里我给出我自己的一个小窍门&#xff0c;可以避…

使用JBoss Cool Store的终极云零售指南

我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 带有JBoss Cool Store的App Dev Cloud 我们从头到尾讨论了各个层&#xff0c;但尚未为您提供除Red Hat Container Development Kit&#xff08;CDK&#xff09;之外的任何应用程序开发…

02.Python 3.6.4下载与安装

02.Python 3.6.4下载与安装 https://www.python.org/downloads/release/python-364/ Windows x86-64可执行文件安装程序视窗对于AMD64 / EM64T / x64&#xff0c;不是安腾处理器bee5746dc6ece6ab49573a9f54b5d0a131684744SIG我下载的是这个&#xff1a; https://www.python.or…

2018年1月 常用的linux命令

项目中经常用到的Linux命令 &#xff08;注意&#xff1a;linux命令要小写哦&#xff01;&#xff09; &#xff08;1&#xff09;、ls 显示当前目录下的文件 &#xff08;2&#xff09;、vi vim 进入编辑器&#xff0c;可以选择你要编辑的文档&#xff0c;一般我们将项目打…

javafx2_JavaFX 2 GameTutorial第4部分

javafx2介绍 这是与JavaFX 2游戏教程相关的六个部分系列的第四部分。 如果您错过了第1部分 &#xff0c; 第2部分或第3部分 &#xff0c;我建议您在开始本教程之前仔细阅读它们。 回顾一下&#xff0c;在第3部分中&#xff0c;我为您提供了许多经典街机风格游戏以及所使用的不同…

vue项目 乐橙云 轻应用直播SDK imouplayer.js

官网案例&#xff1a;https://open.imoulife.com/book/light/sdk.html 文档&#xff1a; https://open.imou.com/developDoc/31 1&#xff0c;下载 对应的资源 https://open.imoulife.com/book/readme/upload.html 2&#xff0c;引入资源 2.1 把下载的资源(static&#xff0c…