iOS系统中导航栏的转场解决方案与最佳实践

目前,开源社区和业界内已经存在一些iOS导航栏转场的解决方案,但对于历史包袱沉重的美团App而言,这些解决方案并不完美。有的方案不能满足复杂的页面跳转场景,有的方案迁移成本较大,为此我们提出了一套解决方案并开发了相应的转场库,目前该转场库已经成为美团点评多个App的基础组件之一。

在美团App开发的早期,涉及到导航栏样式改变的需求时,经常会遇到转场效果不佳或者与预期样式不符的“小问题”。在业务体量较小的情况下,为了满足快速的业务迭代,通常会使用硬编码的方式来解决这一类“小问题”。但随着美团App业务的高速发展,这种硬编码的方式遇到了以下的挑战:

从各个角度来看,硬编码的方式已经不能很好的解决此类问题,美团App需要一个更加合理、更加持久、更加简单易行的解决方案来处理导航栏转场问题。

本文将从导航栏的概念入手,通过讲解转场过程中的状态管理、转换时机和样式变化等内容,引出了在大型应用中导航栏转场的三种常见解决方案,并对美团点评的解决方案进行剖析。

在iOS系统中,苹果公司不仅建议开发者遵循MVC开发框架,在它们的代码里也可以看到MVC的影子,导航栏组件的构成就是一个类似MVC的结构,让我们先看看下面这张图:

在这张图里,我们可以将UINavigationController看做是C,UINavigationBar看做是V,而UIViewController和UINavigationItem组成的Stack可以看做是M。这里要说明的是,每个UIViewController都有一个属于自己的UINavigationItem,也就是说它们是一一对应的。

很多时候,国内的开发者会将UINavigationBar和UINavigationController混在一起叫导航栏,这样的做法不仅增加了开发者之间的沟通成本,也容易导致误解。毕竟它们是两个完全不一样的东西。

所以本文为了更好的阐明问题,会采用英文区分不同的概念,当需要描述笼统的导航栏概念时,会使用导航栏组件一词。

大家可以通过下图获得更为直观的感受,进而了解到导航栏组件在push过程中各个方法的调用顺序。

值得注意的地方有两点:

第一个是UINavigationController作为UINavigationBar的代理,在没有特殊需求的情况下,不应该修改其代理方法,这里是通过符号断点获取它们的调用顺序。如果我们创建了一个自定义的导航栏组件系统,它的调用顺序可能会与此不同。

下面这张图展示了导航栏在pop过程中各个方法的调用顺序:

除了上面说到的两点,pop过程中还需要注意一点,那就是从B返回到A的过程中,A视图控制器的viewDidLoad方法并不会被调用。关于这个问题,只要提醒一下,大多数人都会反应过来是为什么。不过在实际开发过程中,总会有人忘记这一点。

导航栏组件在iOS11发布时,获得了重大更新,这个更新可不是增加了一个大标题样式(LargeTitleDisplayMode)那么简单,需要注意的地方大概有两点:

经常有人说iOS的原生导航栏组件不好使用,抱怨主要集中在导航栏组件的状态管理和控件的布局问题上。

控件的布局问题随着iOS11的到来已经变得相对容易处理了不少,但导航栏组件的状态管理仍然让开发者头疼不已。

虽然导航栏组件的push和pop动画给人一种每次操作后都会创建一遍导航栏组件的错觉,但实际上这些ViewController都是由一个NavigationController所管理,所以你看到的NavigationBar是唯一的。

在NavigationController的Stack存储结构下,每当Stack中的ViewController修改了导航栏,势必会影响其他ViewController展示的效果。

例如下图所示的场景,如果NavigationBar原先的颜色是绿色,但之后进入Stack里的ViewController将NavigationBar颜色修改为紫色后,在此之后push的ViewController会从默认的绿色变为紫色,直到有新的ViewController修改导航栏颜色才会发生变化。

虽然在push过程中,NavigationBar的变化听起来合情合理,但如果你在NavigationBar为绿色的ViewController里设置不当的话,那么当你pop回这个ViewController时,NavigationBar可就不一定是绿色了,它还会保持为紫色的状态。

通过这个例子,我们大概会意识到在导航栏里的Stack中,每个ViewController都可以永久的影响导航栏样式,这种全局性的变化要求我们在实际开发中必须坚持“谁修改,谁复原”的原则,否则就会造成导航栏状态的混乱。这不仅仅是样式上的混乱,在一些极端状况下,还有可能会引起Stack混乱,进而造成Crash的情况。

我们刚才提到了“谁修改,谁复原”的原则,但何时修改,何时复原呢?

苹果公司在它的API文档中专门用了一段文字来解答大家的疑惑,这段文字的标题为《HandlingView-RelatedNotifications》,在这里我们直接引用原文:

Whenthevisibilityofitsviewschanges,aviewcontrollerautomaticallycallsitsownmethodssothatsubclassescanrespondtothechange.UseamethodlikeviewWillAppear:toprepareyourviewstoappearonscreen,andusetheviewWillDisappear:tosavechangesorotherstateinformation.Useothermethodstomakeappropriatechanges.

Figure1showsthepossiblevisiblestatesforaviewcontroller’sviewsandthestatetransitionsthatcanoccur.Notall‘will’callbackmethodsarepairedwithonlya‘did’callbackmethod.Youneedtoensurethatifyoustartaprocessina‘will’callbackmethod,youendtheprocessinboththecorresponding‘did’andtheopposite‘will’callbackmethod.

这里很好的解释了所有的will系列方法和did系列方法的对应关系,同时也给我们吃了一个定心丸,那就是在appearing和disappearing状态之间会由will系列方法进行衔接,避免了状态中断。这对于连续push或者连续pop的情况是及其重要的,否则我们无法做到“谁修改,谁复原”的原则。

通常来说,如果只是一个简单的导航栏样式变化,我们的代码结构大体会如下所示:

-(void)viewWillAppear:(BOOL)animated{[superviewWillAppear:animated];//MARK:changethenavigationbarstyle}-(void)viewWillDisappear:(BOOL)animated{[superviewWillDisappear:animated];//MARK:restorethenavigationbarstyle}现在,我们明确了修改时机,接下来要明确的就是导航栏的样式会进行怎样的变化。

对于不同ViewController之间的导航栏样式变化,大多可以总结为两种情况:

对于显示与否的问题,可以在上一节提到的两个方法里调用setNavigationBarHidden:animated:方法,这里需要提醒的有两点:

颜色变化的问题就稍微复杂一些,在iOS7后,导航栏增加了translucent效果,这使得导航栏背景色的变化出现了两种情况:

对于第一种情况,我们需要调用UINavigationBar的setBackgroundColor:方法。

对于第二种情况我们需要调用UINavigationBar的setBackgroundImage:forBarMetrics:方法。

对于第二种情况,这里有三点需要提示:

在刚接触导航栏API时,许多人经常会把文档里的这些英文词搞混,也不太明白带有这些词的变量为什么有的是布尔型,有的是浮点型,总之一切都让人很困惑。

在这里将做了一个总结,这对于理解Apple的API设计原则十分有帮助。

transparent,translucent,opaque三个词经常会用在一起,它用于描述物体的透光强度,为了让大家更好的理解这三个词,这里做了三个比喻:

alpha和opacity经常会在一起使用,它要表示的就是透明度,在Web端这两个属性有着明显的区别。

在Web端里,opacity是设定整个元素的透明值,而alpha一般是放在颜色设置里面,所以我们可以做到对特定对元素的某个属性设定alpha,比如背景、边框、文字等。

div{width:100px;height:100px;background:rgba(0,0,0,0.5);border:1pxsolid#000000;opacity:0.5;}这一概念同样适用于iOS里的概念,比如我们可以通过alpha通道单独的去设置backgroudColor、borderColor,它们互不影响,且有着独立的alpha通道,我们也可以通过opacity统一设置整个view的透明度。

但与Web端不一致的是,iOS里面的view不光拥有独立的alpha属性,同时也是基于CALayer,所以我们可以看到任意UIView对象下面都会有一个layer的属性,用于表明CALayer对象。view的alpha属性与layer里面的opacity属性是一个相等的关系,需要注意的是view上的alpha属性是Web端并不具备的一个能力,所以笔者认为:在iOS中去说alpha时,要区分是在说view上的属性,还是在说颜色通道里的alpha。

由于这两个词都是在描述程度,所以我们看到它们都是CGFloat类型:

translucent会影响导航栏组件里ViewController的View布局,这里需要大家理清5个API的使用场景:

如果我们先定义一个UINavigationController,它里面包含了多个UIViewController,每个UIViewController里面包含一个UIView对象:

这些调整布局的API背后是一套基于topLayoutGuide和bottomLayoutGuide的计算而已,在iOS11后,Apple提出了SafeArea的概念,将原先分裂开来的topLayoutGuide和bottomLayoutGuide整合到一个统一的LayoutGuide中,也就是所谓的SafeArea,这个改变看起来似乎不是很大,但它的出现确实方便了开发者。

这里只说一下contentInsetAdjustmentBehavior和additionalSafeAreaInsets两个API。

对于contentInsetAdjustmentBehavior属性而言,它的诞生也意味着automaticallyAdjustsScrollViewInsets属性的失效,所以我们在那些已经适配了iOS11的工程里能看到如下类似的代码:

if(@available(iOS11.0,*)){self.tableView.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;}else{self.automaticallyAdjustsScrollViewInsets=NO;}此处的代码片段只是一个示例,并不适用所有的业务场景,这里需要着重说明几个问题:

对于additionalSafeAreaInsets而言,如果系统提供的这几种行为并不能满足我们的布局要求,开发者还可以考虑使用additionalSafeAreaInsets属性做调整,这样的设定使得开发者可以更加灵活,更加自由的调整视图的布局。

苹果提供了许多修改导航栏组件样式的API,有关于布局的,有关于样式的,也有关于动画的。backIndicatorImage和backIndicatorTransitionMaskImage就是其中的两个API。

backIndicatorImage和backIndicatorTransitionMaskImage操作的是NavigationBar里返回按钮的图片,也就是下图红色圆圈所标注的区域。

想要成功的自定义返回按钮的图标样式,我们需要同时设置这两个API,从字面上来看,它们一个是返回图片本身,另一个是返回图片在转场时用到的mask图片,看起来不怎么难,我们写一段代码试试效果:

self.navigationController.navigationBar.backIndicatorImage=[UIImageimageNamed:@"backArrow"];self.navigationController.navigationBar.backIndicatorTransitionMaskImage=[UIImageimageNamed:@"backArrowMask"];代码里的图片如下所示:

也许大多数人在这里会都认为,mask图片会遮挡住文字使其在遇到返回按钮右边缘的时候就消失。但实际的运行效果是怎么样子的呢?我们来看一下:

在上面的图片中,我们可以看到返回按钮的文字从返回按钮的图片下面穿过并且文字被图片所遮挡,这种动画看起来十分奇怪,这是无法接受的。我们需要做点修改:

self.navigationController.navigationBar.backIndicatorImage=[UIImageimageNamed:@"backArrow"];self.navigationController.navigationBar.backIndicatorTransitionMaskImage=[UIImageimageNamed:@"backArrow"];这一次我们将backIndicatorTransitionMaskImage改为indicatorImage所用的图片。

到这里,可能大多数人都会好奇,这代码也能行?让我们看下它实际的效果:

在上面的图中,我们看到文字在到达图片的右边缘时就从下方穿过并被完全遮盖住了,这种动画效果虽然比上面好一些,但仍然有改进的空间,不过这里我们先不继续优化了,我们先来讨论一下它们背后的运作原理。

iOS系统会将indicatorImage中不透明的颜色绘制成返回按钮的图标,indicatorTransitionMaskImage与indicatorImage的作用不同。indicatorTransitionMaskImage将自身不透明的区域像mask一样作用在indicatorImage上,这样就保证了返回按钮中的文字像左移动时,文字只出现在被mask的区域,也就是indicatorTransitionMaskImage中不透明的区域。

掌握了原理,我们来解释下刚才的两种现象:

在第一种实现中,我们提供的indicatorTransitionMaskImage覆盖了整个返回按钮的图标,所以我们在转场过程中可以清晰的看到返回按钮的文字。

在第二种实现中,我们使用indicatorImage作为indicatorTransitionMaskImage,记住文字是只能出现在indicatorTransitionMaskImage里不透明的区域,所以显然返回按钮中的文字会在图标的最右边就已经被遮挡住了,因为那片区域是透明的。

那么前面提到的进一步优化指的是什么呢?

让我们来看一下下面这个示例图,为了更好的区分,我们将indicatorTransitionMaskImage用红色进行标注。黑色仍然是indicatorImage。

按照刚才介绍的原理,我们应该可以理解,现在文字只会出现在红色区域,那么它的实际效果是什么样子的呢,我们可以看下图:

现在,一个完美的返回动画,诞生啦!

前两章的铺垫就是为了这一章的内容,所以现在让我们开始今天的大餐吧。

刚才我们说了两个页面间NavigationBar的样式变化需要在各自的viewWillAppear:和viewWillDisappear:中进行设置。那么问题就来了:这样的设置会带来什么问题呢?

试想一下,当我们的页面会跳到不同的地方时,我们是不是要在viewWillAppear:和viewWillDisappear:方法里面写上一堆的判断呢?如果应用里还有router系统的话,那么页面间的跳转将变得更加不可预知,这时候又该如何在viewWillAppear:和viewWillDisappear:里做判断呢?

现在我们的问题就来了,如何让导航栏的转场更加灵活且相互独立呢?

常见的解决方案如下所示:

这三种方案各有优劣,我们在网上也可以看到很多关于它们的讨论。

例如方案一,虽然看起来工作量大且难度高,但是这个工作一旦完成,我们就会将处理导航栏转场的主动权牢牢抓在手里。但这个方案的一个弊端就是,如果苹果修改了导航栏的整体风格,就好比iOS11的大标题特效,那么工作量就来了。

对于方案二而言,虽然看起来简单易用,但这需要一个良好的继承关系,如果整个工程里的继承关系混乱或者是历史包袱比较重,后续的维护就像“打补丁”一样,另外这个方案也需要良好的团队代码规范和完善的技术文档来做辅助。

大型App的导航栏问题就像一个典型的“公地悲剧”问题。在软件行业,公用代码的所有权可以被视作“公地”,因为不注重长期需求而容易遭到消耗。如果开发人员倾向于交付“价值”,而以可维护性和可理解性为代价,那么这个问题就特别普遍了。如果是这种情况,每次代码修改将大大减少其总体质量,最终导致软件的不可维护。

所以解决这个问题的核心在于:明确公用代码的所有权,并在开发期施加约束。

使用者只用关心当前ViewController的NavigationBar样式,而不用在push或者pop的时候去处理NavigationBar样式。

举个例子来说,当从A页面push到B页面的时候,转场库会保存A页面的导航栏样式,当pop回去后就会还原成以前的样式,因此我们不用考虑pop后导航栏样式会改变的情况,同时我们也不必考虑push后的情况,因为这个是页面B本身需要考虑的。

转场库的使用十分简单,我们不需要import任何头文件,因为它在底层通过MethodSwizzling进行了处理,只需要在使用的时候遵循下面4点即可:

隐式修改是指使用setBackgroundImage:forBarMetrics:方法时,如果image里的像素点没有alpha通道或者alpha全部等于1会使得translucent变为NO或者nil。

以上,我们讲完了设计理念和使用方法,那么我们来看看美团的转场库到底做了什么?

从大方向上来看,美团使用的是前面所说的第三种方案,不过它也有一些自己独特的地方,为了更好的让大家理解整个过程,我们设计这样一个场景,从页面Apush到页面B,结合之前探讨过的方法调用顺序,我们可以知道几个核心方法的调用顺序大致如下:

在push过程的开始,转场库会在页面A自身的view上添加一个与导航栏一模一样的NavigationBar并将真的导航栏隐藏。之后这个假的导航栏会一直存在页面A上,用于保留A离开时的导航栏样式。

等到页面B调用viewDidLoad或者viewWillAppear:的时候,开发者在这里自行设置真的导航栏样式。转场库在这里会对页面布局做一些修正和辅助操作,但不会影响导航栏的样式。

等到页面B调用viewWillLayoutSubviews的时候,转场库会在页面B自身的view上添加一个与真的导航栏一模一样的NavigationBar,同时将真的导航栏隐藏。此时不论真的导航栏,还是假的导航栏都已经与viewDidLoad或者viewWillAppear:里设置的一样的。

当然,这一步也可以放在viewWillAppear:里并在dispatchmainqueue的下一个runloop中处理。

等到页面B调用viewDidAppear:的时候,转场库会将假的导航栏样式设置到真的导航栏中,并将假的导航栏从视图层级中移除,最终将真的导航栏显示出来。

为了让大家更好地理解上面的内容,请参考下图:

说完了push过程,我们再来说一下从页面Bpop回页面A的过程,几个核心方法的调用顺序如下:

在pop过程的开始,转场库会在页面B自身的view上添加一个与导航栏一模一样的NavigationBar并将真的导航栏隐藏,虽然这个假的导航栏会一直存在于页面B上,但它自身会随着页面B的dealloc而消亡。

等到页面A调用viewWillAppear:的时候,开发者在这里自行设置真的导航栏样式。当然我们也可以不设置,因为这时候页面A还持有一个假的导航栏,这里还保留着我们之前在viewDidLoad里写的导航栏样式。

等到页面A调用viewDidAppear:的时候,转场库会将假的导航栏样式设置到真的导航栏中,并将假的导航栏从视图层级中移除,最终将真的导航栏显示出来。

同样,我们可以参考下面的图来理解上面所说的内容:

现在,大家应该对我们美团的解决方案有了一定的认识,但在实际开发过程中,还需要考虑一些布局和适配的问题。

如果发现导航栏在转场过程中出现了样式错乱,可以遵循以下几点基本原则:

永远记住每个ViewController只用关心自己的样式,设置的时机点在viewWillAppear:或者viewDidLoad里。

如果需要一个透明效果的导航栏,可以使用如下代码实现:

[self.navigationController.navigationBarsetBackgroundImage:[UIImagenew]forBarMetrics:UIBarMetricsDefault];self.navigationController.navigationBar.shadowImage=[UIImagenew];导航栏的颜色渐变效果如果需要导航栏实现随滚动改变整体alpha值的效果,可以通过改变setBackgroundImage:forBarMetrics:方法里image的alpha值来达到目标,这里一般是使用监听scrollView.contentOffset的手段来做。请避免直接修改NavigationBar的alpha值。

还有一点需要注意的是,在页面转场的过程中,也会触发contentOffset的变化,所以请尽量在disappear的时候取消监听。否则会容易出现导航栏透明度的变化。

请避免背景图里的像素点没有alpha通道或者alpha全部等于1,容易触发translucent的隐式改变。

如果我们需要隐藏导航栏,请保证所有的ViewController能坚持如下原则:

如果在转场的过程中还会显示或者隐藏导航栏的话,请保证两个方法的动画参数一致。

-(void)viewWillAppear:(BOOL)animated{[self.navigationControllersetNavigationBarHidden:YESanimated:animated];}viewWillAppear:里的animated参数是受push和pop方法里animated参数影响。

目前已知的有两个系统问题如下:

美团平台诚招iOS、Android、FE高级/资深工程师和技术专家,Base北京、上海、成都,欢迎有兴趣的同学投递简历到zhangsiqi04@meituan.com。

THE END
1.教育在线平台系统开发的全面解析与构建指南随着互联网技术的飞速发展,在线教育已成为教育行业的重要趋势。教育在线平台系统作为在线教育的重要载体,其开发质量和功能设计直接关系到教学效果和学习体验。本文将从需求分析、技术选型、功能设计、用户体验优化等方面,全面解析教育在线平台系统的开发过程,为教育机构和企业提供一份实用的构建指南。 https://www.pbids.com/aboutUs/pbidsNews/1861300381826519040
2.App页面元素分层式导航1.4 抽屉式导航 一般采用将导航主题隐藏在App侧边的方式,以一个按钮来呼出导航,在使用完成之后再使用相同的按钮隐藏起来。一般用于底部没有导航栏,而且使用比较少的功能都收纳起来,如我的。 1.5 沉浸式导航 又叫 内容驱动式导航 或 体验驱动式导航,是沉浸式设计的一种表现,在内容中自由的转换,或是内容本身定义导https://blog.csdn.net/vbirdbest/article/details/142083906
3.网站设计,探索与创新之路云设计小黄狮随着移动设备的多样化,跨平台整合设计将成为未来的趋势,设计师需要考虑到不同设备和平台的特点,提供一致的用户体验,跨平台整合设计将有助于提高网站的可用性和访问量。 网站设计形式对于网站的成功具有重要影响,设计师需要不断关注最新的设计理念和技术趋势,不断创新和改进设计形式,以提高用户体验和网站的访问量,在未来https://www.vvrcloud.com/post/20774.html
4.梦学谷在线教育平台,知识付费,博客社区,倍速视频播放,支付宝微信uni-app是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。 DCloud公司拥有600万开发者用户,几十万应用案例、12亿手机端月活用户,数千款uni-app插件、70+微信/qq群。 https://ext.dcloud.net.cn/plugin?id=5341
5.万字干货!超全面的小程序设计指南优设网豆瓣评分提供最新的电影介绍及评论。豆瓣是典型的有情怀,小而美的产品了。 你们不知道的小程序 1. 弹窗不能覆盖导航栏 因为在小程序里导航栏的层级是最高的,即使隐藏导航栏 Title Bar 也是依然存在的。 半屏弹窗 除了官方指南里的模态对话框,也可以尝试半屏弹窗,一是承载更多信息,二是更好的继续流程不被打断。 https://www.uisdc.com/mini-program-design-guide
6.以Web为基础10篇(全文)学生登录系统不但可以在线点播课程课件及多媒体视频、浏览教学信息资源, 还可参加实时的教学互动视频课堂、课程讨论及测验考试;教师不但可使用学生的所有功能, 还可查看统计学生的学习档案, 组织管理内部的学习资源, 为教师对学生素质进行公正评价及正确分析提供有力平台支持。[3]https://www.99xueshu.com/w/ikeyqzszmwjy.html
7.福建省应急管理厅门户网站改版和运营服务项目附件资格承诺函(若有) 参照《福州市财政局关于进一步推进政府采购领域优化营商环境工作的通知》(榕财采〔2021〕52号)“四、简化资格证明材料”的相关规定:(1)供应商在响应文件中可自行选择是否提供资格承诺函 (格式详见附件),若按附件内容要求提供资格承诺函,无需在投标文件中提交财务状况、缴纳税收和社保资金缴纳证明材https://zfcg.czt.fujian.gov.cn/upload/document/20221123/544811a0bef040bd8c5bfb3c756e9d1d.html
8.新媒体客户端(精选十篇)新媒体客户端包括前台APP和后台管理发布平台两部分。前台APP包括欢迎页、栏目列表、首页栏目、用户登录、用户注册等,后台包括采编管理、发布管理、栏目管理、互动管理、素材管理、群组推送等。如图1所示。 2.2 界面 接下来介绍下首页、导航栏、社情民意等几个主要功能模块的界面设计。 https://www.360wenmi.com/f/cnkey227gz22.html
9.iOS16导航栏titleView适配UINavigationBarTitleControl本文只涉及 iOS 16 Beta中出现的导航栏异常 我们一般配置自定义导航栏会用到 navigationItem.titleView,在iOS 16 Bata的适配过程中发现导航栏的自定义titleView会出现位置、尺寸、透明度配置异常。 1. navigationItem.titleView 位置异常问题 1.1 查看导航栏层级 https://www.jianshu.com/p/3382e5629b9a
10.导航栏还是侧栏?flutter跨平台适配指南平台差异:在某些平台上,特别是移动设备上,侧栏可能不易于使用或者不符合用户的习惯。 风格一致性:侧栏的设计和使用需要更多的注意,以确保其与应用的整体风格和用户体验保持一致。 何时应该选择导航栏? 应用功能简单:当应用功能较少,主要包含几个核心页面时,可以选择使用导航栏,保持界面简洁明了。 https://blog.51cto.com/techfanyi/10427181
11.5种内容筛选种类以及如何选择类型理论文摘处于页面的底部导航栏的位置 当用户出发操作的时候,内容从下往上弹出展示。 5. 抽屉式筛选 电商平台应用较多的分类形式,通常是有两个分类层级,一、二级的分类类目都比较多,默认情况下,如果分类特别多时可以只展示第一层级信息,用展开收起辅助用户浏览二级类目信息。 http://www.333cn.com/shejizixun/201917/43496_148326.html
12.b2b分类信息(属于b2b平台的是)联创号阿里巴巴的网站有些不同。左侧固定栏为页面导航,右侧固定栏有个人主页、个人足迹、新闻、发布新信息、返回顶部等快捷方式。可以看出,由于Alibaba.com是一个B2B平台,用户的个人中心是一个重要的存在。在购买过程中,买家可能要随时查看自己的购买信息,所以相比Taobao.com,它增加了一个关于个人中心的浮动固定栏目。 https://www.lian-bj.com/lc/?p=76339
13.26篇博文含有标签「版本甄知科技ITSM猪齿鱼效能平台 V1.1 主要新特性 1. 新增在线工作日历,支持Outlook、Google等本地日历订阅,快速掌握工作项安排? 猪齿鱼工作日历将个人工作项及不同项目工作项以时间维度集中在一处,在在线日历中查看工作,使团队间能够快速同步工作。工作日历更是项目工作项可视化的利器,使业务任务和项目协作变得更加透明可视化?,一http://www.zknow.com/choerodon/blog/tags/%E7%89%88%E6%9C%AC/
14.站长号平台:站长要知道网站优化的核心是用户体验大多数网站都有导航栏。这大大增加了用户的便捷,有了导航栏用户不仅可以快速找到自己想要的栏目,搜索引擎也可以快速抓取和理解网站的结构层级。 3.要注重网站的加载速度 某项数据表明,如果网站的加载速度超过了12秒,那么用户极可能直接关闭网站。加载速度不仅决定了用户是否停留在我们的网站,还决定了搜索引擎抓取的速度https://weibo.com/ttarticle/p/show?id=2309404837148229763622
15.侧边栏分页和步骤条的一些设计思考杂时代1.4 层级划分 因为侧边导航栏中有树形结构,一个主级别可以分散为多个子级别,所以就需要划分一下层级。划分层级的方法也有很多,可以改变字号、改变颜色、改变字形、改变距离,那我用的方法是改变距离。采用哪种方法还是要看具体需求,像那种需要想突出层级且对比强烈的需求,可以采用改变字号和改变字形(加粗)。下图中颜色http://zatime.com/6391.html
16.品牌网站建设中的网站布局与结构设计一个好的网站结构应当有合理的页面层级,让用户可以清晰地理解网站的整体框架和信息组织。合理的页面层级可以使用户通过导航栏或面包屑导航快速定位和跳转到目标页面。同时,合理的页面层级也能够便于搜索引擎索引和收录网站的各个页面。 2. 规范的命名和链接 https://www.jijinweb.com/news/brand-website/12981.html
17.小黑盒导航栏的形式多样,可以是简单的文字链接,也可以是设计精美的图片或是丰富多彩的按钮,还可以是下砬菜单导航。 一般来说,网站中的导航位置在各个页面中出现的位置是比较固定的,而且风格也较为一致。导航的位置一般有4种:在页面的左侧、右侧、顶部和底部。有时候在同一个页面中运用了多种导航。当然并不是导航在页面https://xiaoheihe.cn/community/7214/list/98998379
18.小程序主商城介绍·微信小程序商城使用教程(定期更新)·看云小票打印、发货、退换货、门店核销员绑定/门店核销、模版消息群发推送、绑定微信/手机号/邮箱接收订单提醒、多门店展示、优惠券、卡券、余额充值/扣除、积分充值/扣除、会员等级/会员折扣设置、快速购买、模版消息通知、区域允许购买、视频文章展示、在线客服、一键导航、一键拨号、员工管理、详细的数据统计等等一系列商城https://www.kancloud.cn/lj419412084/qhv4/1757499
19.医院网站管理制度(精选6篇)(2)网站导航。①提供网站地图(纯文字索引)供查询,并提供帮助信息;②在各页面固定位置设置风格统一的导航栏,清晰表达本网页的逻辑位置;③各层级间的网页相互导航便捷;④导航文字准确、直观、易识别;⑤外部导航链接地址正确。 3、网站表现设计 网站表现形式应生动、形象并有自身特色,尽量从易用性和人性化的角度出发设https://www.ruiwen.com/word/yiyuanwangzhanguanlizhidu.html
20.神马广告与其他平台的差距新闻中心就像看商店的经营状况如何,既要看这家商店的地段热不热闹(神马搜索推广给客户带来了多少客人),还要看营业额好不好(这些客人中有多少完成了转化)。 23 5、神马推广后台(掌握)知识点『概念』神马推广后台(e.sm.cn):是基于 神马搜索、神马展示网络、神马导航等产品的推广营销平台。客户可以结合自身业务需求,进行 https://www.tui86.com/889.html
21.移动端app里面主要的三大控件布局为状态栏导航栏标签栏。刷刷题APP(shuashuati.com)是专业的大学生刷题搜题拍题答疑工具,刷刷题提供移动端app里面主要的三大控件布局为状态栏、导航栏、标签栏。A.正确B.错误的答案解析,刷刷题为用户提供专业的考试题库练习。一分钟将考试题Word文档/Excel文档/PDF文档转化为在线题库,制作自己的https://www.shuashuati.com/ti/f018667c5c474aa0a8b7f0829b726540.html?fm=bdce0487b1740e02b03a6334078ecbeb50
22.在单页设计中突出显示导航栏中的当前部分在单页设计中,突出显示导航栏中的当前部分是为了让用户清晰地知道他们当前所处的页面位置,提供更好的导航体验。这可以通过以下几种方式来实现: 1. 高亮当前部分:可以使用不同的颜色、加粗、下划线等方式来https://cloud.tencent.com/developer/information/%E5%9C%A8%E5%8D%95%E9%A1%B5%E8%AE%BE%E8%AE%A1%E4%B8%AD%E7%AA%81%E5%87%BA%E6%98%BE%E7%A4%BA%E5%AF%BC%E8%88%AA%E6%A0%8F%E4%B8%AD%E7%9A%84%E5%BD%93%E5%89%8D%E9%83%A8%E5%88%86