整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

day13:前端面试题(基础)

浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢

  • 在线的情况下,浏览器发现html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过app并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。
  • 离线的情况下,浏览器就直接使用离线存储的资源。

2 请描述一下 cookies,sessionStorage 和 localStorage 的区别?

  • cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)
  • cookie数据始终在同源的http请求中携带(即使不需要),记会在浏览器和服务器间来回传递
  • sessionStoragelocalStorage不会自动把数据发给服务器,仅在本地保存
  • 存储大小:cookie数据大小不能超过4ksessionStoragelocalStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大
  • 有期时间:localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据sessionStorage 数据在当前浏览器窗口关闭后自动删除cookie 设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭

3 iframe有那些缺点?

  • iframe会阻塞主页面的Onload事件
  • 搜索引擎的检索程序无法解读这种页面,不利于SEO
  • iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载
  • 使用iframe之前需要考虑这两个缺点。如果需要使用iframe,最好是通过javascript动态给iframe添加src属性值,这样可以绕开以上两个问题

4 WEB标准以及W3C标准是什么?

  • 标签闭合、标签小写、不乱嵌套、使用外链cssjs、结构行为表现的分离

5 xhtml和html有什么区别?

  • 一个是功能上的差别主要是XHTML可兼容各大浏览器、手机以及PDA,并且浏览器也能快速正确地编译网页
  • 另外是书写习惯的差别XHTML 元素必须被正确地嵌套,闭合,区分大小写,文档必须拥有根元素

6 Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?

  • 页面被加载的时,link会同时被加载,而@imort页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载 import只在IE5以上才能识别,而linkXHTML标签,无兼容问题 link方式的样式的权重 高于@import的权重
  • <!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签之前。告知浏览器的解析器, 用什么文档类型 规范来解析这个文档
  • 严格模式的排版和 JS 运作模式是 以该浏览器支持的最高标准运行
  • 在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。 DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现

7 行内元素有哪些?块级元素有哪些? 空(void)元素有那些?行内元素和块级元素有什么区别?

  • 行内元素有:a b span img input select strong
  • 块级元素有:div ul ol li dl dt dd h1 h2 h3 h4… p
  • 空元素:<br> <hr> <img> <input> <link> <meta>
  • 行内元素不可以设置宽高,不独占一行
  • 块级元素可以设置宽高,独占一行

8 HTML全局属性(global attribute)有哪些

  • class:为元素设置类标识
  • data-*: 为元素增加自定义属性
  • draggable: 设置元素是否可拖拽
  • id: 元素id,文档内唯一
  • lang: 元素内容的的语言
  • style: 行内css样式
  • title: 元素相关的建议信息

9 Canvas和SVG有什么区别?

  • svg绘制出来的每一个图形的元素都是独立的DOM节点,能够方便的绑定事件或用来修改。canvas输出的是一整幅画布
  • svg输出的图形是矢量图形,后期可以修改参数来自由放大缩小,不会失真和锯齿。而canvas输出标量画布,就像一张图片一样,放大会失真或者锯齿

10 HTML5 为什么只需要写 <!DOCTYPE HTML>

  • HTML5 不基于 SGML,因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为
  • HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型

11 HTML5 为什么只需要写 <!DOCTYPE HTML>

  • HTML5 不基于 SGML,因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为
  • HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型

12 如何在页面上实现一个圆形的可点击区域?

  • svg
  • border-radius
  • js实现 需要求一个点在不在圆上简单算法、获取鼠标坐标等等

13 网页验证码是干嘛的,是为了解决什么安全问题

  • 区分用户是计算机还是人的公共全自动程序。可以防止恶意破解密码、刷票、论坛灌水
  • 有效防止黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试

14 viewport

 <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
    // width    设置viewport宽度,为一个正整数,或字符串‘device-width’
    // device-width  设备宽度
    // height   设置viewport高度,一般设置了宽度,会自动解析出高度,可以不用设置
    // initial-scale    默认缩放比例(初始缩放比例),为一个数字,可以带小数
    // minimum-scale    允许用户最小缩放比例,为一个数字,可以带小数
    // maximum-scale    允许用户最大缩放比例,为一个数字,可以带小数
    // user-scalable    是否允许手动缩放
  • 延伸提问怎样处理 移动端 1px 被 渲染成 2px问题

局部处理

  • meta标签中的 viewport属性 ,initial-scale 设置为 1
  • rem按照设计稿标准走,外加利用transfromescale(0.5) 缩小一倍即可;

全局处理

  • mate标签中的 viewport属性 ,initial-scale 设置为 0.5
  • rem 按照设计稿标准走即可

15 渲染优化

  • 禁止使用iframe(阻塞父文档onload事件)iframe会阻塞主页面的Onload事件搜索引擎的检索程序无法解读这种页面,不利于SEOiframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载使用iframe之前需要考虑这两个缺点。如果需要使用iframe,最好是通过javascript动态给iframe添加src属性值,这样可以绕开以上两个问题
  • 禁止使用gif图片实现loading效果(降低CPU消耗,提升渲染性能)
  • 使用CSS3代码代替JS动画(尽可能避免重绘重排以及回流)
  • 对于一些小图标,可以使用base64位编码,以减少网络请求。但不建议大图使用,比较耗费CPU小图标优势在于减少HTTP请求避免文件跨域修改及时生效
  • 页面头部的<style></style> <script></script> 会阻塞页面;(因为 Renderer进程中 JS线程和渲染线程是互斥的)
  • 页面中空的 hrefsrc 会阻塞页面其他资源的加载 (阻塞下载进程)
  • 网页gzipCDN托管,data缓存 ,图片服务器
  • 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
  • innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能
  • 当需要设置的样式很多时设置className而不是直接操作style
  • 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作
  • 图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳
  • 对普通的网站有一个统一的思路,就是尽量向前端优化、减少数据库操作、减少磁盘IO

16 meta viewport相关

<!DOCTYPE html>  <!--H5标准声明,使用 HTML5 doctype,不区分大小写-->
<head lang=”en”> <!--标准的 lang 属性写法-->
<meta charset=’utf-8′>    <!--声明文档使用的字符编码-->
<meta http-equiv=”X-UA-Compatible” content=”IE=edge,chrome=1″/>   <!--优先使用 IE 最新版本和 Chrome-->
<meta name=”description” content=”不超过150个字符”/>       <!--页面描述-->
<meta name=”keywords” content=””/>     <!-- 页面关键词-->
<meta name=”author” content=”name, email@gmail.com”/>    <!--网页作者-->
<meta name=”robots” content=”index,follow”/>      <!--搜索引擎抓取-->
<meta name=”viewport” content=”initial-scale=1, maximum-scale=3, minimum-scale=1, user-scalable=no”> <!--为移动设备添加 viewport-->
<meta name=”apple-mobile-web-app-title” content=”标题”> <!--iOS 设备 begin-->
<meta name=”apple-mobile-web-app-capable” content=”yes”/>  <!--添加到主屏后的标题(iOS 6 新增)
是否启用 WebApp 全屏模式,删除苹果默认的工具栏和菜单栏-->
<meta name=”apple-itunes-app” content=”app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL”>
<!--添加智能 App 广告条 Smart App Banner(iOS 6+ Safari)-->
<meta name=”apple-mobile-web-app-status-bar-style” content=”black”/>
<meta name=”format-detection” content=”telphone=no, email=no”/>  <!--设置苹果工具栏颜色-->
<meta name=”renderer” content=”webkit”> <!-- 启用360浏览器的极速模式(webkit)-->
<meta http-equiv=”X-UA-Compatible” content=”IE=edge”>     <!--避免IE使用兼容模式-->
<meta http-equiv=”Cache-Control” content=”no-siteapp” />    <!--不让百度转码-->
<meta name=”HandheldFriendly” content=”true”>     <!--针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓-->
<meta name=”MobileOptimized” content=”320″>   <!--微软的老式浏览器-->
<meta name=”screen-orientation” content=”portrait”>   <!--uc强制竖屏-->
<meta name=”x5-orientation” content=”portrait”>    <!--QQ强制竖屏-->
<meta name=”full-screen” content=”yes”>              <!--UC强制全屏-->
<meta name=”x5-fullscreen” content=”true”>       <!--QQ强制全屏-->
<meta name=”browsermode” content=”application”>   <!--UC应用模式-->
<meta name=”x5-page-mode” content=”app”>   <!-- QQ应用模式-->
<meta name=”msapplication-tap-highlight” content=”no”>    <!--windows phone 点击无高亮
设置页面不缓存-->
<meta http-equiv=”pragma” content=”no-cache”>
<meta http-equiv=”cache-control” content=”no-cache”>
<meta http-equiv=”expires” content=”0″>

17 你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么?

  • IE: trident内核
  • Firefoxgecko内核
  • Safari:webkit内核
  • Opera:以前是presto内核,Opera现已改用Google - ChromeBlink内核
  • Chrome:Blink(基于webkit,Google与Opera Software共同开发)

18 div+css的布局较table布局有什么优点?

  • 改版的时候更方便 只要改css文件。
  • 页面加载速度更快、结构化清晰、页面显示简洁。
  • 表现与结构相分离。
  • 易于优化(seo)搜索引擎更友好,排名更容易靠前。

19 a:img的alt与title有何异同?b:strong与em的异同?

  • alt(alt text):为不能显示图像、窗体或applets的用户代理(UA),alt属性用来指定替换文字。替换文字的语言由lang属性指定。(在IE浏览器下会在没有title时把alt当成 tool tip显示)
  • title(tool tip):该属性为设置该属性的元素提供建议性的信息
  • strong:粗体强调标签,强调,表示内容的重要性
  • em:斜体强调标签,更强烈强调,表示内容的强调点

20 你能描述一下渐进增强和优雅降级之间的不同吗

  • 渐进增强:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
  • 优雅降级:一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

区别:优雅降级是从复杂的现状开始,并试图减少用户体验的供给,而渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带

21 为什么利用多个域名来存储网站资源会更有效?

  • CDN缓存更方便
  • 突破浏览器并发限制
  • 节约cookie带宽
  • 节约主域名的连接数,优化页面响应速度
  • 防止不必要的安全问题

页设计图

视频讲解课程

1.设计图分析和HTML模块化结构:https://www.ixigua.com/i6903745684596326915/

2.HTML模块化和CSS模块化示例:https://www.ixigua.com/i6904203127541465611/


HTML+CSS模块化基础代码

核心知识点

  1. 分析设计图结构和模块划分
    1. 横向分:头部,导航,banner,中间主体,底部
    2. 按页面分:列表页,详情页,单页
    3. 模块划分:列表,轮播,自定义模块
  2. 了解页面布局和模块化布局的区别
    1. 页面布局主要是分栏唯一功能,不能定义样式,一般用 col-为前缀命名
  3. 了解html模块化命名规范
    1. 列表类模块使用 ul-为前缀命名
      1. 列表li里面的命名规范
        1. 都以短的英文缩写为主
        2. 图片 .pic
        3. 文本 .txt
        4. 标题 .tit
        5. 日期 .date
        6. 简介 .desc
        7. 信息 .info
        8. 按钮 .btn
        9. 更多 .more
    2. 其他自定义模块都用 m- 为前缀命名
    3. 单独元素都已 g- 为前缀命名
      1. 大标题 g-tit1
      2. 按钮 g-btn
    4. 通用的模块统一命名
      1. 头部 header
      2. 底部 footer
      3. 主导航 nav
      4. 侧导航 snv
      5. 分页 pages
      6. 当前位置 cur
  4. 了解CSS模块化写法规范和编码顺序
    1. 先写初始化样式
    2. 然后是头部底部公用样式
    3. 然后写每个模块的样式
    4. 每个模块的样式都以模块命开头,每个模块独立
    5. .wp是限制页面宽度的
    6. .col- 是页面布局分栏的

过前面几节课的操作,我们为wordpress主题trans的首页模板实现了动态代码的调用,网站前端的数据与wordpress数据库的数据正式挂钩上。在接下来的课程中,我们还要修改trans主题的文章列表页、文章详情页、搜索页等等。这个时候,如果你够细心的话,会发现一个问题:trans主题的这些模板页面的头部、右侧边栏、底部的数据都是一样的。也就是说,我们每创建一个动态模板之时,都要重新修改一下这几个部分的代码。这时,我们可能会想到,既然代码都是一样的,为什么不能把这几部分的代码做成几个公共的模板,供其它模板直接调用?这就是我们今天所要探讨的问题——拆分wordpress主题trans的首页动态模板,做成几个公共模板:头部模板、右侧边栏模板、底部模板。下面,我们就一个一个地来实现。

一、头部模板——header.php。

trans主题首页模板的头部,从所有前端页面展示效果看,从最上端到搜索框那里就是首页的头部,如下图:


我们在trans主题目录下创建一个header.php,然后在trans主题首页动态模板中找到头部的所有代码。首页头部的可视化代码是包含在< header></header>标签里的,这个找起来不难。我们还要把网页代码的头部< head></head>里的代码也要找出来。简单地说,就是从网页代码的最顶部,一直到</header>这个结束标签,把这段代码剪切下来,粘贴到header.php文件中。代码如下:

< !DOCTYPE html>< html>< head>< meta charset="UTF-8">< title>< ?php echo get_bloginfo("name"); ?></title>< link rel="stylesheet" href="< ?php bloginfo("wpurl"); ?>/wp-includes/css/dashicons.css"> < link rel="stylesheet" href="< ?php echo get_bloginfo("stylesheet_url"); ?>">< /head>< body>< !-- 头部 --> < header>< div>< div>< ul>< a href="< ?php bloginfo("siteurl"); ?>">< img src="< ?php echo get_option("logo_img") ?: bloginfo("template_url")."/images/logo.png"; ?>" alt=""></a></ul>< ul>< ?php $menu = array( 'container' => false, //最外层标签名'echo' => false, //不让直接输出,而是以一个变量'theme_location' => 'menu_top', //菜单名 'depth' => 0, //菜单深度);echo strip_tags(wp_nav_menu( $menu ), '<a>' );?> </ul></div></div>< div>< div>< ul>< li id="prev">< span class="dashicons-before dashicons-arrow-left-alt"></span></li>< li id="next">< span class="dashicons-before dashicons-arrow-right-alt"></span></li>< li id="brush">< span class="dashicons-before dashicons-image-rotate"></span></li></ul>< ul>< form action="< ?php bloginfo("siteurl"); ?>" method="get">< input type="search" name="s" placeholder="搜索...">< input type="submit" value="搜索"></form> </ul></div></div></header>

二、右侧边栏模板——sidebar.php

trans主题首页模板的右侧边栏,如下图所示:


在trans主题目录下创建一个sidebar.php文件,然后,从首页模板index.php的代码中找到右侧边栏的代码。右侧边栏的所有代码包含在< div></div>这对div中,我们把整个< div>的所有代码剪切下来,粘贴到sidebar.php文件中,代码如下:

<!-- 侧边栏 -->< div>< div class="c_right_0 right_con">< ul>< span class="dashicons-before dashicons-admin-post"></span>最新文章</ul>< ul>< ?php query_posts('posts_per_page=10&caller_get_posts=1&orderby=new'); while (have_posts()) : the_post(); echo '<a href="'.get_the_permalink().'" title="'.get_the_title().'">';echo get_the_title(); echo '</a>';endwhile; wp_reset_query(); ?> </ul></div>< div class="c_right_1 right_con">< ul>< span class="dashicons-before dashicons-admin-post"></span>热门文章</ul> < ?php query_posts('posts_per_page=8&caller_get_posts=1&orderby=comment_count'); while (have_posts()) : the_post(); ?>< ul>< div>< a href="< ?php the_permalink(); ?>">< ?php if(has_post_thumbnail()) { //如果有特色图片,就调用特色图片the_post_thumbnail( 'thumbnail' ,array( 'alt' => trim(strip_tags( $post->post_title )), 'title' => trim(strip_tags( $post->post_title )),'class' => 'home-thumb')); }else { //否则调用文章第一张图片echo '< img src="'.catch_first_image().'" alt="'.$post->post_title.'" width="150" height="150" />';}?></a></div>< div>< li>< a href="< ?php the_permalink(); ?>">< ?php the_title(); ?></a></li>< li>< span class="dashicons-before dashicons-calendar-alt">< ?php the_time("Y年m月d日"); ?> </span>< span class="dashicons-before dashicons-visibility">< ?php get_post_meta($post->ID,"views",true); ?> </span></li></div></ul> < ?php endwhile; wp_reset_query(); ?></div>< div class="c_right_2 right_con">< ul>< span class="dashicons-before dashicons-welcome-widgets-menus"></span>热门标签</ul>< ul> < ?php wp_tag_cloud('number=40&orderby=count&order=DESC&smallest=13&largest=13&unit=px'); ?></ul></div></div>

三、底部模板——footer.php

trans主题首页模板的底部效果如下图:


​在trans主题目录下创建一个footer.php文件,然后在首页index.php找到底部的代码,底部是包含在< footer></footer>这个标签里的。我们从< footer>开始,一直剪切到index.php模板的代码结尾,粘贴到footer.php文件中,代码如下:

<!-- 底部 -->< footer>< div>< ul><?php if(is_home()){ //如果是首页,就调用友情链接wp_list_bookmarks('title_li=&before=&after=');}else{ //否则就调用底部导航$menu = array( 'container' => false, //最外层标签名'echo' => false, //不让直接输出,而是以一个变量'theme_location' => 'menu_bottom', //菜单名 'depth' => 0, //菜单深度);echo strip_tags(wp_nav_menu( $menu ), '<a>' );}?></ul></div>< div>< ul>< li>© <?php echo date("Y"); ?> <?php bloginfo("name"); ?> | <?php echo get_option("beian"); ?> | < a href="<?php echo get_option("map"); ?>">网站地图</a></li>< li>Power by WordPress | Theme <?php echo wp_get_theme(); ?></li></ul></div></footer></body></html>

四、引入公共模板。

通过上面三步的操作,我们就把index.php模板的头部代码、右侧边栏代码、底部代码给独立出来了,做成了公共的模板:header.php、sidebar.php、footer.php 。在index.php模板中,我们剪切掉了这几部分,只剩下了左侧边主体列表的。这时,我们要做的就是,在index.php模板中引入这几个公共模板。

方法一:使用wordpress提供的函数来引入。

wordpress已经为我们提供了这几个公共模板的引入方法:

头部模板引入:<?php get_header(); ?>

侧边栏模板引入:<?php get_sidebar(); ?>

底部模板引入:<?php get_footer(); ?>

方法二:通过include()这个PHP原生函数来引入。

头部模板引入:<?php include("header.php"); ?>

侧边栏模板引入:<?php include("sidebar.php"); ?>

底部模板引入:<?php include("footer.php"); ?>

include()方法可以用来引入任何php文件,而wordpress提供的这几个函数就有所限制,只能引入指定名字的PHP文件。

能过上面的操作,我们就完成了wordpress主题trans首页模板的切割,把它切割成4个模板:index.php首页、header.php头部模板、sidebar.php侧边栏模板、footer.php底部模板。这样的好处是,以后,我们创建其它trans主题模板时,就不需要再写头部、侧边栏、底部的代码了,后期代码修改和维护也更加方便。