CSS查缺补漏之《Web字体、2D/3D变换》

news2024/12/29 13:20:22

文章略长,慢慢享用~

Web字体

css3新增了字体,使得用户不必局限在本计算机中安装的字体,可以使用多种字体;

需要在style中定义@font-face规则;

 @font-face {

      font-family: 'xxx名字';  /* 必选项,自定义字体名称 */

      src: url('xxxx'); /* 必选项,引入字体来源 */

      font-stretch: 'expanded'; /* 可选项,定义如何拉伸字体,默认是normal */

      font-style: 'italic'; /* 可选项,字体样式,默认是normal */

      font-weight: 'bold'; /* 可选项,字体粗细*/

      unicode-range: 'U+0-10FFFF' /* 定义字体支持的 UNICODE 字符范围。默认是 "U+0-10FFFF" */

    }

考虑到浏览器版本,一般会对url进行兼容性处理:

@font-face {
    font-family: 'webfont';
    font-display: swap;
    src: url('webfont.eot'); /* IE9 */
    src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
    url('webfont.woff2') format('woff2'),
    url('webfont.woff') format('woff'), /* chrome、firefox */
    url('webfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
    url('webfont.svg#webfont') format('svg'); /* iOS 4.1- */
}

 在使用该字体定义样式时,直接使用定义样式即可:

font-family: 'xxx名字'

2D变换

2维坐标系:

 

2D变换使用transform属性表示,包含2D位移、2D缩放/放大、2D扭曲

2D位移

示例代码:

<div class="box">
   <div class="box1"></div>
</div>
.box {
   width: 200px;
   height: 200px;
   border: 1px solid red;
   margin: 0 auto;
   margin-top: 200px;
}
.box1 {
   width: 100px;
   height: 100px;
   background-color: #ffff00b4;
}

 

2d位移有x和y两个方向,包括translateX与translateY,位移对行内元素无效

translateX()表示在水平方向(x方向)发生位移,

translateY()表示在垂直方向(y方向)发生位移;

参数可以用长度值表示,也可以用%,相对于自身元素的宽度进行位移;

translate(pra1,pra2)复合属性,pra1表示水平方向位移,pra2表示垂直方向位移,若只有一个参数,表示仅水平方向位移;

 .box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* x轴上向右发生位移*/
    transform: translateX(20px);
 }

 

 .box1 {
   width: 100px;
   height: 100px;
   background-color: #ffff00b4;
   /* Y轴上向上发生位移*/
   transform: translateY(-20px); 
 }

 

translate可以链式调用, 

.box1 {
   width: 100px;
   height: 100px;
   background-color: #ffff00b4;
   /* X轴上向左发生位移-20px y轴上向下位移自身高度100px的10%即10px*/
   transform: translateX(-20px) translateY(10%); 
 }

 

 位移与相对定位很相似,都没有脱离文档流,且不会影响到其他人元素;但是位移如果使用%表示时,其参考的是自身元素的高或宽,而相对定位则参考的是父元素的高或宽;

浏览器处理位移比相对定位的效率要高,因此也可搭配定位实现水平居中(上述代码中的box类可以使用transform代替):

 .box {
    width: 200px;
    height: 200px;
    border: 1px solid red;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
 }

2D缩放

2D缩放/放大使用scale属性表示,有水平方向的缩放/放大和垂直方向的缩小/放大;

缩放对行内元素无效

scaleX()表示水平方向(x方向)的缩小/放大,

scaleY()表示垂直方向(y方向)的缩小/放大,

参数为大于1的数字,当参数大于1时,表示放大,当小于1时表示缩小;

scale(pra1,pra2)表示复合属性,pra1表示水平方向缩放/放大,pra2表示垂直方向缩小/放大,若只有一个参数,表示两个方向同时缩小/放大;

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
   /*y轴缩小0.5倍 */
    transform: scaleY(0.5);
}

 

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* x轴放大1.5倍 */
    transform: scaleX(1.5);
}

 

当然,scale也可以链式使用;

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
   /* x轴放大1.5倍,y轴缩小0.5倍 */
    transform: scaleX(1.5) scaleY(0.5);
}

面试题,会被问到,如何实现0.5px的线?或者实现10px的字体大小?-----用scale实现

因为浏览器中默认线型大小最小为1px,字体大小最小为12px;

.box1 {
    font-size: 12px;
    /* 实现文字大小为9.6px */
    transform: scale(0.8); 
}

.box1 {
    height: 1px;
    width: 100px;
    transform: scaleY(0.5);
    background-color: blue;
    margin-top: 100px;
}

2D旋转

2D旋转仅有z轴方向的,用rotateZ()表示

rotateZ() 参数为角度值(deg),旋转角度大于0按照顺时针旋转,向左旋转角度小于0按照逆时针旋转;

还可以使用rotate()做2d旋转,当只传一个参数时与rotateZ使用方法相同

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    transform: rotateZ(45deg);
}

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    transform: rotateZ(-30deg);
}

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    transform: rotate(-45deg);
}

 

2D扭曲

2D扭曲是指让元素在二维平面内被“拉扯”,从而实现扭曲变形;使用skew属性值实现

skewX:表示元素在水平方向扭曲,值为角度值,若大于0,则表示将元素的左上角、右下角拉扯;

skewY:表示元素在垂直方向扭曲,值为角度值,若大于0,则表示将元素的左上角、右下角拉扯;

skew复合属性,一个参数表示在水平方向扭曲,两个参数分别表示水平方向与垂直方向

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 表示在x方向扭曲 */
    transform: skewX(12deg)
}

 

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 表示在Y方向扭曲 */
    transform: skewY(-12deg)
}

 

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 表示在Y方向扭曲 */
    transform: skew(-12deg, -12deg)
}

 

2D多重变换

上述所有的变换方法都可以放在一起使用,无顺序要求,但是一般将旋转rotate放在最后(因为旋转后变换原点可能会改变,容易乱掉)

transform: translate()  scale()  rotate() ,可任意组合搭配使用

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 实现水平右移20px 纵方向扩大1.5倍 顺时针旋转30度*/
    transform: translateX(20px) scaleY(1.5) rotateZ(30deg);
}

 

变换原点

元素变换时,默认变换原点为元素的中心,使用transform-origin可以设置变换的原点~

transform-origin 参数为长度值或%(相对于自身元素)或关键词(如left、top等)

若是一个参数,则表示横坐标x,纵坐标默认为50%,若是两个,则依次为横坐标、纵坐标

变换原点对位移变化不起作用

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 将变换原点移动到100px 50px处 */
    transform-origin: 100px 50px;
    transform: rotateZ(30deg);
}

 

与下面代码一样的效果,

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 将变换原点移动到100px 50px处 */
    transform-origin: 100%;
    transform: rotateZ(30deg);
}
.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 将变换原点移动到左上角 */
    transform-origin: top left;
    transform: rotateZ(30deg);
}

 

3D变换

元素在进行3D变换之前,需要给其父元素开启3D空间!(以下三个属性都是设置给发生3D变换的父元素

transform-style用于开启3D空间;属性值有flat二维空间(默认值)/preserve-3d三维空间;

perspective用于设置景深,表示观察者与z=0平面的距离,能让3d空间产生透视效果,看起来更立体;属性值有none不设置(默认值)/长度值

<div class="box">
   <div class="box1">世界你好</div>
</div>
.box {
    width: 200px;
    height: 200px;
    border: 1px solid red;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    /* 开启三维空间 */
    transform-style: preserve-3d;
    /* 设置20px的景深 */
    perspective: 100px;
}
.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
}

 

虽然从视觉效果上看,并没有什么效果,但是其实在z轴上它已经比之前更加靠近我们观察者了,而且已经是个三维空间了~

.box {
    width: 200px;
    height: 200px;
    border: 1px solid red;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    /* 开启三维空间 */
    transform-style: preserve-3d;
    /* 设置20px的景深 */
    perspective: 100px;
}
.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    transform: rotateX(20deg);
}

 

可以通过设置透视点位置来看到变化

perspective-origin用于设置观察者位置(透视点位置),默认的位置在元素的中心

.box {
    width: 200px;
    height: 200px;
    border: 1px solid red;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    /* 开启三维空间 */
    transform-style: preserve-3d;
    /* 设置20px的景深 */
    perspective: 100px;
    /* 设置观察者位置在相对坐标轴向右偏移300px 向下偏移200px处 */
    /* 相当于观察者蹲下200px 向右移动300px*/
    perspective-origin: 300px 200px;
}

3D位移

3D位移是在2d位移的基础上,增加z轴上的位移,

translateZ() 参数仅能设置为长度值(因为自身元素z轴为0,无法作为参考),正值向屏幕外,负值向屏幕内延伸~

translate3d(pra1, pra2,pra3) 三个参数分别代表x/y/z轴上的位移,均不能省略~ 

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
/* 相当于元素向外靠近,视觉上元素就会变大 */
    transform: translateZ(50px);
}

 

注意当参数设置的比景深(此例中为100px)还大时,元素就会看不见了(相当于元素跑到观察者脑后了);

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 在x轴上向右移动20px 在y轴上向上移动20px 在z轴上向外移动20px */
    transform: translate3d(100px,-20px,20px);
}

3D旋转

3D旋转是在2D旋转的基础上,让元素可以在x轴以及y轴上旋转,

rotateX:在x轴上旋转,参数为角度值,面对x轴正方向时:正值表示顺时针旋转,反之逆时针;

rotateY:在y轴上旋转,参数为角度值,面对y轴正方向时:正值表示顺时针旋转,反之逆时针;

rotate3d(pra1, pra2, pra3, pra4) 前三个参数分别代表x/y/z轴(1表示旋转,0表示不旋转),par4表示旋转角度。均不能省略~ 

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 在x轴顺时针旋转45度 */
    transform: rotateX(45deg)
}

 

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 在Y轴逆时针旋转30度 */
    transform: rotateY(-30deg)
}

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 在x轴和y轴上顺时针旋转60度 */
    transform: rotate3d(1,1,0,60deg)
}

  

3D缩放

3D缩放是在2D缩放的基础上,让元素可以在z轴上缩放,

scaleZ用于设置在z轴上的缩放,大于1表示放大,小于1表示缩小;

scale3d(pra1,pra2,pra3),三个参数分别表示x/y/z轴的缩放比例,每个参数都不可省略~

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 在z轴上放大1.5 */
    transform: scaleZ(1.5)
}

 

 从效果上依然看不出区别,其实z轴上已经放大1.5倍了(变“厚”了),可通过一起设置其它变换看出来~

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 在z轴上放大1.5 并在x轴上顺时针旋转10度*/
    transform: scaleZ(1.5) rotateX(10deg)
}

 

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 在x轴上顺时针旋转10度 */
    transform: rotateX(10deg)
}

 

从上面可以看到,与单纯旋转x轴效果相比,设置了scaleZ确实有效果~

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 在x/y/z轴上都放大1.5倍 并在x轴上顺时针旋转10deg */
    transform: scale3d(1.5, 1.5, 1.5) rotateX(10deg)
}

 

多重变换

从上面的例子中也可以看出来,也可以利用多重变换将所有的3d变换包含进来~

tranform: translate scale rotate, 旋转变换还是最好放到最后实现,上面讲到所有的变换都可以任意组合~

transform-origin:和2d变换一样,使用该值设置变换原点,使用方法与上述所讲一样~

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 在x轴上放大1.5倍,在y轴上缩小0.5倍,在z轴上放大1.1倍 */
    /* 在x轴上右移20px 在z轴上向外移动20px */
    /* 在x轴上顺时针旋转10度 在y轴上顺时针旋转30度*/
    transform: scale3d(1.5, 0.5, 1.1) translateX(20px) translateZ(20px) rotateX(10deg) rotateY(30deg)
}

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 将变换原点放在距离x轴20px y轴200px z轴100px处 */
    transform-origin: 20px 200px 100px;
    /* 在x轴上放大1.5倍,在y轴上缩小0.5倍,在z轴上放大1.1倍 */
    /* 在x轴上右移20px 在z轴上向外移动20px */
    /* 在x轴上顺时针旋转10度 在y轴上顺时针旋转30度*/
    transform: scale3d(1.5, 0.5, 1.1) translateX(20px) translateZ(20px) rotateX(10deg) rotateY(30deg);
}

 

哦天,终于写的差不多了,累死!!

还有一个小点,在上面2d或3d所有例子中,当元素旋转到反面时,是可以看到反面的内容(正面内容的镜像),可以通过backface-visibility属性实现

backface-visibility用于设置元素背面内容是否可见,可选值有visible(默认值)、hidden

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    /* 隐藏背部 */
    backface-visibility: hidden;
    transform: rotateY(179deg);
}

作为对比,

.box1 {
    width: 100px;
    height: 100px;
    background-color: #ffff00b4;
    transform: rotateY(179deg);
}

终于整理的差不多了!!!!!!

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

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

相关文章

ROS2 入门应用 创建启动文件(Python)

ROS2 入门应用 创建启动文件&#xff08;Python&#xff09; 1. 创建功能包2. 添加依赖关系3. 添加启动文件4. 创建启动文件4.1. Python4.2. XML4.3. YAML 5. 编译和运行 1. 创建功能包 用Python、XML或YAML编写的启动文件可以启动和停止不同的节点&#xff0c;以及触发和处理…

设计模式(二十三):行为型之解释器模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

chapter8:SpringBoot启动配置原理

尚硅谷SpringBoot顶尖教程 1. 启动流程简介 SpringBoot应用从主启动类启动后的运行流程主要包含下面几个要点&#xff1a; &#xff08;1&#xff09;准备环境 执行ApplicationContextInitializer#initialize()方法&#xff1b;监听器SpringApplicationRunListener回调cont…

ADC 读取电位器旋钮,用回差消除临界值档位跳动

就是比如&#xff0c;用电位器当旋钮做风扇调速&#xff0c;划分出10 个速度档位&#xff0c;对应10 个ADC 转换结果的阈值。如果直接比较阈值&#xff0c;当旋钮拧到临近阈值的地方时&#xff0c;ADC 结果的微小跳动会导致风扇档位在两个级别之间不停左右横跳&#xff0c;因此…

Linux MySQL 索引 事务 存储引擎 死锁

索引&#xff08;面试问得多&#xff09; 索引是一个排序的列表&#xff0c;包含索引字段的值和其相对应的行数据所在的物理地址 作用 加快表的查询速度&#xff0c;还可以对字段排序 如何实现的搜索加速&#xff1f; 没有索引的情况下&#xff0c;要查询某行数据&#xff0c;需…

代码审计——命令执行详解

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 命令注入是指因为系统使用了可以执行命令的危险函数&#xff0c;但是调用这些函数的参数可控&#xff0c;并没有做过滤或过滤不…

Flutter集成Umeng步骤及若干问题总结

由于Flutter项目中用到umeng统计及手机号一键登录功能&#xff0c;但实际集成使用中遇到各种坑&#xff0c;文档及demo却都没有提及&#xff0c;因此写下这篇文章&#xff0c;有遇到同样问题的同学可以参考下。 集成之前&#xff0c;最好先查看一下文档&#xff1a;https://de…

LangChain for LLM Application Development 基于LangChain开发大语言应用模型(上)

以下内容均整理来自deeplearning.ai的同名课程 Location 课程访问地址 DLAI - Learning Platform Beta (deeplearning.ai) 一、什么是LangChain 1、LangChain介绍 LangChain是一个框架&#xff0c;用于开发由大语言模型驱动的应用程序。开发者相信&#xff0c;最强大的、差异…

Ubuntu+Pycharm+QtDesigner,并配置Pyqt5

1. 安装PyQt5 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5 2. 安装ubuntu环境下所需要的依赖包 sudo apt install pyqt5* 3. 安装QtDesigner sudo apt install qttools5-dev-tools 4. 设置Pycharm 步骤&#xff1a; File–>setting–>Tools–&…

ESP32设备驱动-VCNL4040趋近传感器

VCNL4040趋近传感器 文章目录 VCNL4040趋近传感器1、VNCL4040介绍2、硬件准备3、软件准备4、驱动实现1、VNCL4040介绍 VCNL4040 将趋近传感器 (PS)、环境光传感器 (ALS) 和高功率 IRED 集成到一个小型封装中。它通过CMOS工艺将光电二极管、放大器和模数转换电路集成到一个芯片…

Linux->线程库接口

目录 前言&#xff1a; 1 进程和线程 2 线程库接口 2.1 线程库基础理解 2.2 创建线程 2.2 线程资源回收 2.3 线程分离 前言&#xff1a; 本篇主要是对Linux原装线程库的函数接口进行学习&#xff0c;还有一部分的线程概念补充。 1 进程和线程 博主在上一篇文章当中有讲过…

中北大学 - 信息对抗大三下学习课程设计(爬取招标网站,进行招标分析,数据保存execl中)

文章目录 1. 题目描述2. 项目细节分析定时爬取任务思路避免多次爬取数据重复问题网站结构根据爬取信息确认招标地区 3. 项目代码4. 运行截图 1. 题目描述 中北大学信息安全技术爬虫课程设计 题目 5&#xff1a;招投标信息分析系统 &#xff08;20050441 2005031113&#xff09…

Floyd算法图解,C++实现Floyd算法

Floyd算法简介 Floyd算法是一种多源最短路径算法&#xff0c;是利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法&#xff0c;与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊德命名。 时间复杂度&am…

Python模块multiprocessing 实现多进程并发

简介 multiprocessing模块是Python标准库中提供的一个用于实现多进程编程的模块。它基于进程而不是线程&#xff0c;可以利用多核CPU的优势&#xff0c;提高程序的执行效率&#xff0c;同时也可以实现进程间通信和数据共享。 目录 1. 参数说明 1.1. Process&#xff08;控制进…

推荐系统初谈

文章目录 简介推荐系统与搜索引擎发展历史所属领域 推荐系统分类概览基于内容的推荐基于协同过滤的推荐基于内存的协同过滤基于模型的协同过滤基于矩阵分解的推荐 推荐系统的评价指标推荐系统存在的问题参考文献 简介 21年笔记迁移&#xff0c;主要介绍了推荐系统的定义、发展…

【IC设计】ICC1 workshop lab guide 学习笔记

文章目录 Lab1 Data Setup&Basic Flow1.1 Create a Milkyway library1.2 Load the Netlist,TLU,Constraints and Controls1.3 Basic Flow:Design Planning1.4 Bsic Flow:Placement1.5 Basic Flow:CTS1.6 Basic Flow:Routing Design Planning2.1 Load the Design2.2 Initial…

算法刷题-字符串-反转字符串II

简单的反转还不够&#xff0c;我要花式反转 541. 反转字符串II 力扣题目链接 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起, 每计数至 2k 个字符&#xff0c;就反转这 2k 个字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。 …

C++笔记之初始化线程的所有方法

code review! C笔记之初始化线程的所有方法 文章目录 C笔记之初始化线程的所有方法一.非类中初始化线程1.使用函数指针初始化线程2.lambda表达式初始化线程3.使用成员函数初始化线程4.使用函数对象(Functor)初始化线程5.使用std::bind绑定函数及其参数初始化线程 二.类中初始化…

滤波电容计算举例

例&#xff1a;输入电压220VAC&#xff0c;功率4W&#xff1b;要求输出电压波动不超过5%&#xff0c;试计算滤波电容容量。 解&#xff1a;&#xff08;1&#xff09;电容的储能公式为&#xff1a;Wc1/2CU^2 当电容充电到峰值电压&#xff08;即220x1.414310V&#xff09;时&am…

数仓的分层理论

一、简介 2021-4-25 11:04:16 数据仓库分层是数据仓库设计中非常重要的一个环节&#xff0c;一个好的分层设计可以极大地简化数据仓库的操作&#xff0c;提升使用体验。然需要注意的是&#xff0c;分层理论并不绝对&#xff0c;只是提供一种普适的指导思想和原则&#xff0c;…