家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!
高级前端?进阶
监管机构和开发商一直在批评苹果对 iOS 的诸多限制,包括:要求所有浏览器使用苹果的 WebKit 引擎。 随着诸多监管机构也在反对苹果的一些不合理政策,一些人可能已经在为一个限制较少的 iOS 环境做准备,比如Google。
Chromium Bug Tracker表明目前正在构建一个基于 Blink 的新 iOS 浏览器,虽然这可能违反苹果关于平台上浏览器都使用 WebKit 的规定。 虽然谷歌坚称该项目只是一个实验,但是在网上却掀起了轩然大波。
Google Blink vs. Apple WebKit
谷歌的这项举措表明,它可能已经在等着苹果关于 WebKit 规则的变化,因为监管机构和开发人员最近几个月对该规则进行了越来越多的审查。 如果 Apple 允许使用其他浏览器引擎,那么 Google 准备一个具有增强功能的浏览器引擎就会是提前的商业布局。
Telegram 创始人Pavel Durov声称,Apple 的最新政策在迫使开发者创建单独的应用,这些应用须缴纳 App Store 30% 的销售佣金。 Durov 表示,如果苹果做更多的事情来支持 WebKit 或允许浏览器开发人员使用其他引擎,许多公司就可以通过移动网页提供服务,而不是维护应用程序。
Apple 对浏览器引擎的禁令也受到了英、美、欧盟监管机构的抨击。 欧盟最近颁布的数字市场法案可能会迫使 Apple 在未来几年内允许其他浏览器引擎、或者替代应用程序分发渠道。
虽然Cupertino坚称,其严格的控制使产品对用户来说更安全,同时在上月底公开批评了CMA 关于限制移动浏览器和云游戏的提议(CMA将其标记为反竞争)。但是,迫于外界压力,Apple的临时变卦也不是没有可能。
接下来,将带着大家一起来聊聊这次禁令之争中牵涉到的黑科技。
浏览器内核包括渲染引擎、JS执行引擎,由于JS引擎越来越独立,内核就倾向于只指渲染引擎。渲染引擎是对HTML文档进行解析并将其显示在页面上的工具。它负责获取网页内容(HTML、XML、图像等等)、渲染页面(例如加入CSS等)等等UI相关事务。
主流浏览器内核有那些?
由微软开发,并于1997年10月首次在ie 4.0中使用,凭借windows垄断优势,Trident市场占有率一直很高。2011年,从ie 9开始,Trident开始支持HTML5和CSS 3,因此也经常会看到有些网站在浏览时会提示用户,在Internet Explorer 9.0+以上浏览效果更佳。
由Netscape公司Mozilla组织开发。1998年,Netscape与IE浏览器竞争失利之后,成立非正式组织Mozilla,由其开发新一代内核,命名为“Gecko”,也就是Mozilla一直使用的内核。
Gecko的特点是代码完全公开,因此其开发程度很高,全世界的程序员都可以为其编写代码,增加功能。
苹果公司开发的内核,也是其旗下产品Safari浏览器使用的内核。Webkit引擎包含了WebCode排版引擎和JavaScriptCode解析引擎,都是自由软件,在GPL条约下授权,同时支持BSD系统开发。
Chrome、360极速浏览器、搜狗高速浏览器也都是使用Webkit内核。
由Google和Opera Software开发的浏览器排版引擎,Google计算将这个渲染引擎作为Chromium计划的一部分,并且在2013年4月公布了这一消息。这一渲染引擎是开源引擎Webkit中WebCore组件的一个分支,并且在Chrome(>=28)、Opera(>=15)浏览器中使用。
WebKit 是一个开源的 Web 浏览器引擎。 它是 macOS 和 iOS 中的一个框架,被许多三方应用程序使用,包括 Safari、Mail、Notes、Books、News 和 App Store等。
WebKit 代码库主要是用 C++ 编写的,带有一些 C 和汇编,主要是在 JavaScriptCore 中,还有一些用于与 Cocoa 平台集成的 Objective-C。它主要由以下部分组成:
Blink是一个由Google主导开发的开源浏览器排版引擎,Google计划将这个渲染引擎作为Chromium计划的一部分。其代码贡献来自Google、Facebook、Microsoft、Opera Software、Adobe Systems、Intel、IBM、Samsung等诸多大型公司,并于2013年4月首次发表。
图片来自Hartley Charlton的文章
Blink渲染引擎是开源引擎WebKit中WebCore的一个分支,并且在Chrome(>=28)、Opera(>=15)、Yandex、Vivaldi及Microsoft Edge(>=79)等诸多基于Chromium的浏览器中使用。
Chrome的开发者希望在浏览器的开发上拥有更大的自由度,同时避免与上游冲突、可以通过移除Chrome没有使用的组件而简化程序库,所以Google决定开发WebKit的分支版本。根据提交统计,Google自2009年年底以来一直是WebKit代码库的最大贡献者。
正如Blink的官网所言,Blink一直的使命就是推动开源生态、技术创新!而从Chrome的快速发展来看,Blink也确实做到了!
本文主要和大家介绍下最近比较火的一个大事,即Google在开发一个基于 Blink 的新 iOS 浏览器,用于应对苹果对于App Store浏览器内核限制的不确定性变化。文章主要从苹果禁令是什么、浏览器内核有那些、 深入理解Webkit 、深入理解Blink四个方面展开,因篇幅问题,没有过多展开。如果有兴趣,文末的参考资料提供了大量优秀文档以供学习。
https://www.techspot.com/news/97526-google-building-blink-based-ios-browser-violation-apple.html
https://webkit.org/
https://github.com/WebKit/WebKit/blob/main/Introduction.md
https://zh.wikipedia.org/zh-cn/Blink
https://chromium.googlesource.com/playground/chromium-org-site/+/refs/heads/main/blink/index.md
https://www.macrumors.com/2023/02/04/google-working-on-browser-that-would-break-rules/
https://www.chromium.org/blink/
代浏览器都内置了专用动画技术,Martin G?rner为您展现四种最棒的实例。
现代移动操作系统将用户接口动画化,并已达到了电脑端交互的标准——精选流畅的动画,体现出沉浸效果以及支持直观的交互。我们都想当然的认为,可以设置一个列表,使之带有运动特性,用手指轻轻一推,它就如同有重量和惯性一样运动起来,直到遇到边缘再反弹回来一点。但是,在网络上,我们还达不到这样的效果。
接受事实吧,现有网上的动画经常被视作UI灾难,还在使用二十年前陈旧的<blink>标签技术。加入Flash有点帮助,不过它缺乏HTML DOM集成,都变成了不美观的800×600分辨率,并且JavaScript DOM操作还有其标志性的5帧/秒(fps)动画率——真是绝望啊!
改变
2013年,现代浏览器内置了专用动画技术,达到60 fps。是时候去忘掉过去,开始构建美妙的UI动画体验了。我将展示四个动画技术,帮助你决定,哪一个更适合你的项目。
让我们从最简单的声明式技术开始:CSS3。这里不需要JavaScript,存CSS,加上一点现代手段。
CSS通过两种基本属性来声明动画:过渡和动画。过渡属性通知浏览器计算两种状态(由各自CSS定义)间的中间帧。动画通过改变元素CSS触发。比如,当你以编程方式改变它的层,或启动一个:hover CSS。
当缩略图层从开始转变到结束,图像则从一处平滑的移动到另一处,典型的表现为JavaScript DOM动作的结果。
img { -webkit-transition: 1s; }.begin { left: 0px; }.end { left: 500px; }
动画属性最常用于持续运行的动画特效,它还允许自定义中间步骤的动画。
创建一个旋转的图像:
img {-webkit-animation: myAnim 3s infinite; }@-webkit-keyframes myAnim{ from {-webkit-transform: rotate(0deg) } 50% {/* possible intermediate positions at any % */} to {-webkit-transform: rotate(360deg) }}
利用大量CSS属性制作动画具有无限的创造性,你可以根据意图在边框宽度内任意创建动画。 不过,大多数对动画有用的属性都是几何变换和不透明的。CSS3通过易操作的转换属性提供了全系列二维几何变换:平移、旋转、缩放和歪斜。
用旋转、缩放和歪斜创建2D转换:
webkit-transform:旋转30度
webkit-transform:缩小50%
webkit-transform:歪斜-20度,再20度
接下来变得有趣了。如果你觉得在CSS中添加3D效果,技术上是为了粗体和斜体的设计,这很愚蠢,请接着阅读。通过扩展几何转换到三维图像将是一个很自然的方式,相同变换属性还可以做平移X,Y,Z轴以及旋转X,Y,Z轴。
3D旋转图像:
webkit-transform:Y轴旋转45度
再加上点抛出动画效果,看上去就像是一个旋转的三维立方体。
如果确实这般容易的话,就不会有任何趣味性了。设计师留了一点悬念,你可以试一下,只对一个图像进行旋转,浏览器默认渲染出来的效果是不带透视性的:
webkit-transform:Y轴旋转45度
可以添加上透明属性,默认是无穷大极限值也是不带有一点透明效果的。就如同靠近镜头的对象与很远距离外的对象看上去大小一样。
为了确保图像看上去更真实,你还需要指定一个镜头与屏幕之间距离的值。加上-webkitperspective: 1000px就可以了。
要在一块平面屏幕上呈现一个3D对象,首先画出一条线连接眼镜或相机与3D物理上的点。这条线与屏幕的交集就是相应像素所在的位置。为了找到像素在屏幕上的坐标,利用泰勒斯定理,你需要空间中点的3D坐标和相机与屏幕之间的距离(f在光学中也被称为焦距)。这就是视角属性提供的距离。如果这个距离是无限远的,你可以看到所有射线(眼球到3D点线)是水平紧密状的,而且很远很远的对象在屏幕上的大小一样。
现在我们有设置一个3D立方体的所有基础了,利用六个图像以及CSS 3D转换,接下来就可以实现旋转了。
这一步很简单:我们把一个三维旋转封装到一个div,将会产生如下效果:
浏览器执行你让它所做的步骤:在div渲染一个三维立方体,然后像一张平面图片般在自身运用3D旋转。这是默认效果,虽然不是你想要的。你要告诉浏览器运用嵌套div来构成3D转换,-webkit-transform-style: preserve-3d属性。通过这个,我们就能得到想要的旋转立方体了。
很容易在空间失去定位。我的建议是采用一个div,命名为SCENE。这就是透明属性存放的位置。在内部,放置一个命名为OBJECT的div,它应当拥有transform-style: preserve-3d属性,并且该div就是你应用转换移动整个对象的地方。最后,在该div内部,使用3D转换设置你想要的正面图像,创建所需对象。在我们的例子中,立方体的六个面:
.SCENE { -webkit-perspective: 1000px; }.OBJECT{ -webkit-transform-style: preserve-3d; -webkit-transform: rotateX(20deg rotateY(120deg) rotateZ(50deg); /* replace this with an animation property if you want movement */}.FACE1 { -webkit-transform:translateX(150px)rotateY(90deg);}...
关于3D CSS转换很棒的一点是CSS动画和过渡的完美结合。我们在这留了一个练习,让旋转立方体运动起来,当鼠标光标悬停其上时,立方体自动打开来。操作方法是:把立方体的面移动到与中心一定距离的地方。第二组CSS属性有一个 :hover选择器,将立方体的面放置在更远的距离。通过运用第一种转换属性,你将看到立方体从中心盘旋打开,同时还保持旋转(演示)。
HTML与CSS都是强大的动画技术,但缺乏绘图基元。SVG能够弥补这点,并拥有其独特的动画标签。SVG动画部分被特定称为同步多媒体集成语言(SMIL)。
首先,SVG是用于矢量基元的,比如矩形、圆形和贝塞尔曲线:
<svg> <rect x="5" y="5" width="140" height="140" stroke="#000000" strokewidth="4"fill="#AAAAFF" opacity="1"/></svg>
同样可用于:
<line x1 y1 x2 y2><circle cx cy r><path d><image x y width height xlink:href>
其中一个基元,<path>标签,是SVG中最好用的。它允许你使用直线、弧和贝塞尔曲线定义任意路径。路径定义看上去想一个字母,如同Inkscape矢量图形软件生成的。对于SVG动画,你应该理解这一点。
一个二次和三次贝塞尔曲线的例子:
<svg> <path d="M 30,240 Q 170,40 260,230" stroke="#F00" /> <path d="M 30,240 C 70,90 210,150 260,230" stroke="#F00" /></svg>
语法:
M x,y ? ? 新的起点 (标记)
L x,y ? ? ?到哪里的直线
Q cx, cy, x, y ?二次贝塞尔曲线到 (x,y)和一个控制点
C cx,cy, dx,dy, x,y 三次贝塞尔曲线到(x, y)和两个控制点
A ? ? ? 椭圆弧
z ? ? ? 字符串最后,用于结束路径
让我们把这些矢量变得更生动化。你可以查看演示,一个家伙踏着滑板翱翔于白云间。
冲浪板上下摆动,小人的嘴巴在大和更大的笑容间交替变化,眼睛滚动,瞳孔扩张。这是SVG动画四种可能的类型。
最简单的一种SVG动画运用<animate>标签,改变一种几何形状的一个参数,在本例中,就是眼睛的半径。
要使瞳孔扩张,需要改变属性列表值中的半径值。
<circle cx="200" cy="205" r="80" > <animate dur="3s" attributeName="r" values="80; 150; 80" repeatCount="indefinite" /></circle>
方便的是变化的属性还可以成为<path>标签。允许你创建一个动画路径。 唯一的限制是两个曲线之间要进行转换,必须是同一种类型且拥有相同数量的控制点。它们必须由相同位置上的同一个字母定义,唯一不同的只能是参数的改变。当移动小人的嘴巴时,只有“微笑”和“大笑”位置被定义了。SVG动画将完成插值。
<path fill="#fff"> <animate attributeName="d" dur="2s" repeatCount="indefinite" values="m 0,0 c 1,15 -13,45 -45,45 -32,0 -44,-28 -44,-44 z; m 0,0 c -4,15 -66,106 -98,106 -32,0 3,-89 9,-105 z" /></path>
当然,SVG还能进行几何变换,也能做成动画。这里的动画标签是<animate Transform>。你必须告诉它想要将哪里的转变做成动画,还要提供一个分号分隔的所有关键位置的值列表。还可以组成动画转换,你告诉浏览器使用additive=”sum” 属性。
几何转换的动画:
<g> ... <!-- SVG primitives group --> <animateTransform dur="3s" repeatCount="indefinite" additive="sum" attributeName="transform" type="translate" values="0,0; 200,-130; -100,200; 0,0" /> <animateTransform dur="3s" repeatCount="indefinite" additive="sum" attributeName="transform" type="rotate" values="0; 20; -20; 0" /></g>
第三个和最后一个SVG动画标签也很有用。<animateMotion>用来引导对象沿着特定路径运动。 它有一个隐藏的技巧称为rotate=”auto”属性。它让对象不仅能够遵循指定路径,同时自身保持朝前,如同路上行驶的车辆一样。
<g> ... <!-- SVG primitives group --> <animateMotion dur=”1s"repeatCount="indefinite" path="m 0,0 a 15,11 0 1 1 -30,0 15,11 0 1 1 30,0 z" /></g>
SMIL有大量控制动画特征。在它的JavaScript API中揭露pauseAnimations(), unpauseAnimations()和setCurrentTime(t) 函数在全局性开始/停止/暂停一个动画的功能。还在所有三种动画标签(<animate>, <animateTransform>, <animateMotion>)上指定了begin与end属性。它们可以利用一个事件节点/用户事件/动画事件的强大组合。你可以指定,动画在点击之后的一秒结束或开始。
例如,下面这个SVG按钮被点击后有一个移动的阴影效果:
<g id="buttonID"> <!-- SVG button artwork here --> <animate begin="buttonID.click" dur="1s"\ .../></g>
由声明性动画转换到编程性动画技术,<canvas>标签是你的第一选择。本文所提到的所有技术中,<canvas>标签最具有跨浏览器支持,浏览器厂商做了很多努力使之兼容60fps动画,以下是设置一个画布的方法:
<canvas width="400" height="400" style="width: 400px; height: 400px;"></canvas>
第一个尺寸(标签属性)设置了画布的分辨率,这就是你所使用的坐标空间。第二个尺寸(CSS属性)是画布出现在屏幕上的形状大小。为什么不把画布物理尺寸设置到100%分辨率,内部坐标空间不变,浏览器为任意窗口都能正确渲染图画?非常遗憾,浏览器将画布内容作为点阵图来扫描的,任何扩大范围的结果都将导致模糊混乱的像素。于是,把这两个值设置成相同的值是唯一可行的选项。
初始化画布需要JavaScript中<canvas>元素,并在其上调用getContext('2d')函数。获得的图画内容对象被用来调用到画布API。内容是状态性的,存储三种不同的状态信息:绘画风格,即时几何转换以及累计绘图路径。在画布上进行绘画的方法是发布绘图指令,不产生任何可见内容,但在内存中已创建了一个路径,然后发布一个油墨指令(ctx.stroke(), ctx.fill() 或两者皆有),就能显示出路径了。
画布动画需要设置一个动画循环,你应当基于requestAnimationFrame()函数(带有正确的前缀)。该函数使浏览器能够管理帧率,在浏览器选项卡隐藏时也能停止动画。
function runAnimation(){ yourWorld.draw() // this is your drawing code webkitRequestAnimationFrame(runAnimation);}
一般来说,画布被用于动画的时候,对象的位置必须是在逐帧的基础上才行,这是因为它们都是物理仿真的结果。观看box2dweb.js教程。仿真不断改变仿真世界中对象的位置,动画循环周期性的在屏幕上展现当前环境状态。
在画布动画中使用SVG精灵是一种很有用的技巧。一个任意复杂性的静态矢量图片在画布上呈现都是繁琐的,这样做实际上可行,虽然不如发送一个.svg到 ctx.drawImage()简单。出于模糊安全的原因,只有内联SVG支持,你必须在Blob API中使用它(代码)。
SVG精灵能够以任意比例展示其矢量美态,但遗憾的是,只支持Chrome浏览器。
WebGL暴露浏览器运行的JavaScript应用程序OpenGL API,而不需要任何插件。理论上讲,你只需要在<canvas> 元素上调用getContext(‘webgl’)(而不是之前的2d)就可以了。然而,WebGL非常大,并且API等级低。最重要的是,web版本没有默认的渲染路径,这意味着你无法给它一个形状,让它使用适合的默认值展示出来。所以你必须编写着色器,使用GLSL语言编写屏幕上出现的任何内容。
幸运的是我们有Three.js帮助。Three最初是由Mr.doob开发的库,用于一些Chrome演示(www.ro.me/www.chaostoperfection.com),但它是相对独立的。它拥有所有的基础,以及内置独特的着色器,你就可以专注于其他有用的方面:相机、灯光、行动。
首先要做的是编写Three粘合代码(很简单):
var renderer=new THREE.WebGLRenderer({antialias: true});renderer.setSize(width, height);renderer.setClearColorHex(0x000000, 0); // color,transparency// the renderer creates a canvas elementfor youdocument.whereeveryouwant.appendChild(renderer.domElement);
在lights和action之前,需创建camera和位置:
// arguments: FOV,viewAspectRatio, zNear, zFarvar camera=new THREE.PerspectiveCamera(35,width/height, 1, 10000);camera.position.z=300;
然后是light:
var light=new THREE.DirectionalLight(0xffffff, 1);//color, intensitylight.position.set(1, 1, 0.3); // direction
我们试着呈现一个立方体吧,3D对象在Three中被称为网络,都由一个几何体和一个材料构成。
我们使用一个简单的结构:
var texture=THREE.ImageUtils.loadTexture(‘Fernando Togni.jpg’);var cube=new THREE.Mesh( new THREE.CubeGeometry(100, 100, 100), new THREE.MeshLambertMaterial({map: texture}) );
最后添加内容,称为渲染函数。
var scene=new THREE.Scene();scene.add(cube);scene.add(light);renderer.render(scene, camera);
这将为我们的立方体产生一个静态图像,为了让它动起来,我们包裹渲染召集一个动画循环,改变立方体在每一帧的位置。
function runAnimation(t){ // animate your objects depending on time cube.rotation.y=t/1000; cube.position.x=... renderer.render(scene, camera); // display requestAnimationFrame(runAnimation); // and loop}
推荐使用三维建模软件例如Sketchup。Three识别几类3D模型结构,包括COLLADA(.dae)具有广泛行业支撑。下面是如何在Three中加载一个模型:
var loader=new THREE.ColladaLoader();loader.load("Android.dae", function(collada){ var model=collada.scene; model.position=...; // x, y, z model.rotation=...; // x, y, z scene.add(model);} );
再做一些努力,更换机器人外观花式,Three提供兰伯特和冯氏照明风格,法线贴图,凹凸贴图,环境映射以及更多。
还可以使机器人运动起来,具体步骤参考教程。
原文链接:http://www.gbtags.com/gb/share/2124.htm
览器内核又可以分成两部分:渲染引擎(layout engineer 或者 Rendering Engine)和 JS 引擎。
渲染引擎它负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入 CSS 等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。
JS 引擎则是解析 Javascript 语言,执行 javascript语言来实现网页的动态效果。
HTML
最开始渲染引擎和 JS 引擎并没有区分的很明确,后来 JS 引擎越来越独立,内核就倾向于只指渲染引擎。有一个网页标准计划小组制作了一个 ACID 来测试引擎的兼容性和性能。内核的种类很多,如加上没什么人使用的非商业的免费内核,可能会有10多种,但是常见的浏览器内核可以分这四种:Trident、Gecko、Blink、Webkit。
主流浏览器
(1)Trident(IE内核)
国内很多的双核浏览器的其中一核便是 Trident,美其名曰 "兼容模式"。
代表: IE、傲游、世界之窗浏览器、Avant、腾讯TT、猎豹安全浏览器、360极速浏览器、百度浏览器等。
Window10 发布后,IE 将其内置浏览器命名为 Edge,Edge 最显著的特点就是新内核 EdgeHTML。
(2)Gecko(firefox)
Gecko(Firefox 内核): Mozilla FireFox(火狐浏览器) 采用该内核,Gecko 的特点是代码完全公开,因此,其可开发程度很高,全世界的程序员都可以为其编写代码,增加功能。 可惜这几年已经没落了, 比如 打开速度慢、升级频繁、猪一样的队友flash、神一样的对手chrome。
(3) webkit(Safari)
Safari 是苹果公司开发的浏览器,所用浏览器内核的名称是大名鼎鼎的 WebKit。
现在很多人错误地把 webkit 叫做 chrome内核(即使 chrome内核已经是 blink 了),苹果感觉像被别人抢了媳妇,都哭晕再厕所里面了。
代表浏览器:傲游浏览器3、 Apple Safari (Win/Mac/iPhone/iPad)、Symbian手机浏览器、Android 默认浏览器,
(4) Chromium/Blink(chrome)
在 Chromium 项目中研发 Blink 渲染引擎(即浏览器核心),内置于 Chrome 浏览器之中。Blink 其实是 WebKit 的分支。
大部分国产浏览器最新版都采用Blink内核。二次开发
(5) Presto(Opera)
Presto(已经废弃) 是挪威产浏览器 opera 的 "前任" 内核,为何说是 "前任",因为最新的 opera 浏览器早已将之抛弃从而投入到了谷歌怀抱了。
移动端的浏览器内核主要说的是系统内置浏览器的内核。
手机浏览器
Android手机而言,使用率最高的就是Webkit内核,大部分国产浏览器宣称的自己的内核,基本上也是属于webkit二次开发。
iOS以及WP7平台上,由于系统原因,系统大部分自带浏览器内核,一般是Safari或者IE内核Trident的
*请认真填写需求信息,我们会在24小时内与您取得联系。