《响应式Web设计:HTML5和CSS3实战(第2版)》06章 - 学习笔记

响应式Web设计:HTML5和CSS3实战(第2版)

第六章 CSS3 高级技术

6.1 CSS3 文字阴影特效

  • 基本语法:
  .element{
      text-shadow: 1px 1px 1px #ccc;
  }
  • 缩写值的规则是“右偏移量,下偏移量,模糊距离(阴影从有到无的渐变距离),色值”
  • 想把阴影向左上方偏移,可以使用负值
  .element{
      text-shadow: -2px -3px 0px #ccc;
  }
  /* 去除阴影效果,可以用text-shadow: none; */
6.1.1 省略blur值
  • 如果不设置模糊距离,浏览器会自动取前两个值作为偏移量
  .element{
      text-shadow: 1px 1px #ccc;
  }
6.1.2 多文字阴影
  • 可以添加多个阴影效果,以逗号分隔,而且css可以忽略空白,可以如下书写增加可读性
  .element{
      text-shadow: 
      2px 3px #ccc, /* right and down */
      -3px -3px #999; /* left and up */
  }

6.2 盒阴影

  • 默认的box-shadow是设置在元素外部的
  • 可以设置inset来容许元素内部使用box-shadow
6.2.1 内阴影
  • inset关键字
  .element {
      box-shadow: inset 0 0 30px #999;
  }
6.2.2 多重阴影
  • 也是用逗号分隔
  • 会按照从底部到顶部(从最后一个到第一个)的顺序被添加
  • 即,代码中越接近顶层的效果在浏览器中展示的时候也越接近“顶层”
  .element{
      box-shadow: 
      inset 0 0 30px #ccc, /* up */
      inset 0 0 30px #999; /* down */
  }
6.2.3 阴影尺寸(偏移)
  • 可以让你在各个方向上缩小阴影效果
  • 原理是:模糊距离被负的阴影尺寸抵消了

6.3 背景渐变

6.3.1 线性渐变语法
  • 默认从顶部开始
  • 最简单的是:
  .element{
      background: linear-gradient(red, blue);
  }
  1. 确认渐变方向
    • 渐变将从你设定的反方向开始,当没有设置方向时,渐变默认从顶部到底部
    • 下边代码的渐变方向设定为顶部右侧,即底部左侧开始,红色变为蓝色
  .element{
      background: linear-gradient(to top right, red, blue);
      /*或者数学比较好,用角度*/
      background: linear-gradient(45deg, red, blue);
  }
  • 如果容器不是正方形,是一个矩形,那么45deg指的是右上角的顶点,而不是真真切切的45度
  • 也可以让渐变从不可见区域开始
    .element{
        background: linear-gradient(red -50%, blue);
    }
  1. 色标
    • 使用色标定义复杂的渐变效果
    • 建议不要混用单位
    • 可以在一个渐变效果中添加多个色标
      • 色标用逗号进行分隔
        • 第一部分是颜色
        • 第二部分是颜色的位置
    .element{
        background: linear-gradient(#f90 0, #f90 2%, #555 2%, #eee 50%, #555 98%, #f90 100%);
    }
  1. 兼容旧浏览器
    • 兼容不支持背景渐变效果的浏览器,只需要在之前定义一个背景颜色就可以
    • 目的是老旧浏览器至少会渲染一个背景
  .thing{
      background: red;
      background: linear-gradient(45deg, red, blue);
  }
6.3.2 径向渐变背景
  • 效果一般是从一个中心发散成为圆形或者椭圆的渐变效果
    .thing{
        background: radial-gradient(12em circle at bottom, red, orange, yellow);
    }
6.3.3 为响应式而生的关键字

6.4 重复渐变

  • background: repeating-radial-gradient(black, 0px, orange 5px, red 10px);
  • 标记色标之间的距离可以用像素值,也可以用百分比
  • 为了展示最佳效果,建议用同一种计量单位

6.5 渐变背景制作图案的使用场景

  • 渐变图案在小视口中比较好看
  • 视口较大时,纯色背景更好一些

6.6 多张背景图片

  • CSS3中可以在一个元素上堆叠多个背景图片
  • css中先出现的图片会被安置在越靠近用户的位置
  .element{
      /*img01离用户最近*/
      background: 
      url('../img01.jpg'),
      url('../img02.jpg'),
      url('../img03.jpg') left bottom, black;
  }
6.6.1 背景大小
  • 使用 background-size 为每个图片设置大小
  • 可以使用百分比,像素或者以下关键词
    • auto 让图片保持原有大小
    • cover 保持图片比例,拓展至覆盖整个元素
    • contain 保持图片比例,拓展图片让其最长边保持在元素内部
6.6.2 背景位置
  • background-position: top 50px right 100px, 40px 40px, top center;
  • 上面代码表示为三张图片各自设置位置
  • 背景位置默认在左上角
6.6.3 背景属性的缩写
  • 首先不建议使用缩写
  • 建议顺序
    • 多重背景图片
    • 声明背景大小
    • 然后声明背景位置
    • 最后声明背景重复与否

6.7 高分辨率背景图

  • 不同视口下加载不同分辨率的图像
    .bg{
        background-image: url('bg.jpg');
    }
    @media (min-resolution: 1.5dppx) {
        .bg {
            background-image: url('bg@1_5x.jpg');
        }
    }

6.8 CSS滤镜

  • 可以用滤镜中的drop-shadow创建三角形阴影
  • drop-shadow语法和box-shadow相似
    .filter{
        filter: drop-shadow(8px 8px 6px #333);
    }
  • 常见filter
    • blur(3px) 模糊
    • grayscale(.8) 灰度
    • invert(.9) 反转
    • opacity(.2) 透明度
  • 滤镜属于渲染前必须进行的计算工作,所以对性能影响很大
  • 因此慎重使用滤镜效果
  • 选择器对性能的影响可以忽略不计

第八章 CSS3过渡、变形和动画

  • 过渡——transition
  • 变形——transform
  • 动画——animation

8.1什么是CSS3过渡以及如何使用它

  • 当元素的CSS状态改变时,过渡是最简单的创造视觉效果的方式。
    • 如:我们在给超链接设置样式的时候,一般都会设置一个悬停状态的效果
    • transition: box-shadow 1s;
    • 在box-shadow上,将会耗时1秒,从现存状态切换到悬停状态。
8.1.1 过渡的简写语法
  • 倾向使用缩写版,
    • 这样我只要定义过渡的时长和需要过渡的属性即可。
  • transition: all 1s ease 0s;
    • 第一个和时间相关的值会被应用给transition-duration
    • 第二个则会被应用到transition-delay上
8.1.2 在不同时间段内过渡不同属性
  • 多个属性过渡时,这些属性不必步调一致
  .style { 
      /* ...(其他样式)... */ 
      transition-property: border, color, text-shadow; 
      transition-duration: 2s, 3s, 8s; 
      }
8.1.3 过渡调速函数
  • 贝塞尔曲线,本质上是缓动函数
  • ease(默认)、linear、ease-in、ease-out、ease-in-out和cubic-bezier

8.2 CSS的2D变形

  • 过渡是从一种状态平滑转换到另一种状态
  • 变形则定义了元素将会变成什么样子
  • 想象一下《变形金刚》里的擎天柱,他通过变形来变成一部卡车。而在机器人与卡车之间的阶段,我们称之为过渡(从一个状态过渡到另一个状态)。
  • 变形是在文档流外发生的
    • 一个变形的元素不会影响它附近未变形的元素的位置。
8.2.1 scale
  • 因为变形在文档流之外,所以如下设置的样式变形,并不会导致同类位置的变动
  .scale:hover { 
      transform: scale(1.4); 
  }
8.2.2 translate
  • translate会告知浏览器按照一定的度量值移动元素,可以使用像素或者百分比
    • 第一个值是X轴上偏移的距离
    • 第二个是Y轴上偏移的距离
    • 正值会让元素向右或者向下移动,负值则会让元素向左或者向上移动。
  .translate:hover { 
      transform: translate(-20px, -20px); 
  } 
 + 如果你只传入一个值,它会被应用到X轴上。
 + 如果你想指定一个轴进行移动,可以使用translateX或者translateY。
  • 解决绝对居中
  .inner { 
      position: absolute; 
      width: 200px; 
      background-color: #999; 
      top: 50%; 
      left: 50%; 
      transform: translate(-50%, -50%); 
  }
8.2.3 rotate
  • rotate允许你旋转一个元素
    • 括号中的值只能以度为单位(如90deg)。正值时会进行顺时针旋转,而负值则会逆时针旋转。
  .rotate:hover { 
      transform: rotate(30deg); 
  }
8.2.4 skew
  • skew(斜切)会让元素在一个或者两个轴上变形偏斜。
    • 第一个值是X轴上的斜切(本例中是40度)
    • 第二个值是Y轴上的斜切(本例中是12度)
    • 忽略第二个值意味着仅有的值只会应用在X轴上(水平方向)。
  .skew:hover { 
      transform: skew(40deg, 12deg); 
  } 
8.2.5 matrix
  • matrix(矩阵)变形的语法超级复杂
  .matrix:hover { 
      transform: matrix(1.678, -0.256, 1.522, 2.333, -51.533, -1.989); 
  } 
8.2.6 transform-origin属性
  • 在CSS里,默认的变形原点(浏览器中作为变形中心的点)是在正中心:
    • 元素X轴的50%和Y轴的50%处
    • 这和SVG默认的左上角(或者0 0)是不同的。
  • 使用transform-origin,我们可以修改变形原点
  .matrix:hover { 
      transform: matrix(1.678, -0.256, 1.522, 2.333, -51.533, -1.989); 
      transform-origin: 270px 20px; 
  } 

8.3 CSS3的3D变形

  • 使用perspective属性来设置用户视点到3D场景的距离。
  • 结构:
  <div class="flipper">
    <span class="flipper-object flipper-vertical"> 
          <span class="panel front">The Front</span>
      <span class="panel back">The Back</span>
    </span>
  </div> 
  • 样式:
  .flipper { 
      perspective: 400px; 
      position: relative; 
  } 
  /* 我们将父元素设置为相对定位,从而创造一个上下文来放置flipper-object。 */
  .flipper-object { 
      position: absolute; 
      transition: transform 1s; 
      transform-style: preserve-3d; 
  } 
  • 使用backface-visibility属性把它设置为hidden来隐藏元素的背面

8.4 CSS3动画效果

  • 相较于3D变形,CSS3动画的支持度更高。
  • 将在元素翻转后为其添加脉冲动画效果。
    • 这里只定义了一个简单的关键帧选择器:100%。
      • 也可以设置多个关键帧选择器(推荐你使用百分比)。你可以把它们想象成时间轴上的点。
  @keyframes pulse { 
      100% { 
          text-shadow: 0 0 5px #bbb; 
          box-shadow: 0 0 3px 4px #bbb; 
      } 
  } 
  • 最好使用一个能代表动画效果的名字,因为一个关键帧声明可以在项目中多处复用。
    • 使用:
  .flipper:hover .flipper-horizontal { 
      transform: rotateY(180deg); 
      animation: pulse 1s 1s infinite alternate both; 
  }
  • animation-fill-mode属性
    • animation-fill-mode: forwards;
    • 这指使元素保留动画结束时的值。

第九章 表单

9.1-2 理解HTML5表单中的元素

  • 每一个输入元素都有一个对应的label元素
  • 然后一并被包裹在div元素中(我们也可以把用label把input包裹起来)。
<fieldset>
  <legend>About the offending film (part 1 of 3)</legend>
  <div>
    <label for="film">The film in question?</label>
    <input id="film" name="film" type="text" placeholder="e.g. King 
Kong" required>
  </div>
9.2.1 placeholder
  • 为占位符文本添加样式
    • 可以使用:placeholder-shown伪类选择器来为placeholder属性添加样式
    • 要用前缀添加工具来兼容各种版本
  input:placeholder-shown { 
      color: #333; 
  }
9.2.2 required
  • 用于多种类型的输入元素来确保表单域中必须输入值
  • range、color、button和hidden类型的输入元素不能使用required,
    • 这几种输入类型几乎都有默认值。
9.2.3 autofocus
  • 可以让表单在加载完成时即有一个表单域被默认选中
  • 如果多个表单域都添加了autofocus属性,在不同的浏览器上表现是不一致的
    • 在Safari上,最后一个添加autofocus的表单域会被选中,
    • 在Firefox和Chrome上会选中第一个添加autofocus属性的元素。
  • 带有autofocus的表单域,则会阻止空格键的默认行为
9.2.4 autocomplete
  • 禁用自动补全功能的表单项
    <div> 
        <label for="tel">Telephone</label> 
        <input id="tel" name="tel" type="tel" placeholder="1-234-546758" autocomplete="off" required> 
    </div>
  • 也可以给整个表单(不是fieldset)设置属性来禁用自动补全功能

<form id="redemption" method="post" autocomplete="off">

9.2.5 list及对应的datalist元素
  • 可以在用户开始在输入框中输入值的时候,显示一组备选值
  • list属性中的值(awards)同时也是datalist元素的id
    • 这样就可以让datalist与输入框关联起来
  <div>
    <label for="awardWon">Award Won</label>
    <input id="awardWon" name="awardWon" type="text" list="awards">
    <datalist id="awards">
      <select>
        <option value="Best Picture"></option>
        <option value="Best Director"></option>
        <option value="Best Adapted Screenplay"></option>
        <option value="Best Original Screenplay"></option>
      </select>
    </datalist>
  </div> 

9.3 HTML5的新输入类型

9.3.1 email
  • 当与required组合使用时,如果提交一个不符合格式的地址,浏览器会生成警告信息
  <div>
    <label for="email">Your Email address</label>
    <input id="email" name="email" type="email" placeholder="dwight.schultz@gmail.com" required>
  </div>
  • 许多触摸屏设备(如安卓、iPhone等)会根据输入类型改变键盘模式
9.3.2 number
  • 如果你输入的不是数字
    • Chrome和Firefox会在表单提交的时候在表单域上弹出一个警告框
    • 而Safari则相反,它什么都不会做,并且让其顺利提交。
    • IE11则会在输入框失焦的时候快速清除其中的内容。
  <div> 
      <label for="yearOfCrime">Year Of Crime</label> 
      <input id="yearOfCrime" name="yearOfCrime" type="number" min="1929" max="2015" required> 
  </div> 
9.3.3 url
  <div> 
      <label for="web">Your Web address</label> 
      <input id="web" name="web" type="url" placeholder="www.mysite.com"> 
  </div>
9.3.4 tel
  • IE11、Chrome和Firefox等现代浏览器上,tel类型都设计为数字类型格式
  • 它的表现和普通文本输入框一样。
  • 当输入无效值,它们都 没有 在输入框失焦或表单提交时提供任何合理的警告信息。
  <div>
    <label for="tel">Telephone</label>
    <input id="tel" name="tel" type="tel" placeholder="1-234-546758" autocomplete="off" required>
  </div>
9.3.5 search
  • 移动设备上经常会提供一个更富有针对性的键盘
  <div>
    <label for="search">Search the site...</label>
    <input id="search" name="search" type="search" placeholder="Wyatt Earp">
  </div>
9.3.6 pattern
  • 让输入域只接受某种特定格式的输入
  <div>
    <label for="name">Your Name (first and last)</label>
    <input id="name" name="name" pattern="([a-zA-Z]{3,30}\s*)+[a-zA- Z]{3,30}" placeholder="Dwight Schultz" required>
  </div>
9.3.7 color
  • 让输入域接受颜色输入
  <div> 
      <label for="color">Your favorite color</label> 
      <input id="color" name="color" type="color"> 
  </div>
9.3.8 日期和时间输入类型
  • date
  <input id="date" type="date" name="date">
  • month
<input id="month" type="month" name="month">
  • week
  <input id="week" type="week" name="week"> 
  • time
  <input id="time" type="time" name="time"> 
9.3.9 范围值
  • range输入类型会生成一个滑动条
  <input type="range" min="1" max="10" value="5"> 
  • 一大问题是它从来不给用户显示当前的输入值
    • 可以通过JavaScript实现。我们将上例中的代码稍作修改
    • 获取滑动条当前的输入值,将其显示在id为range的元素(span标签)中
    <input id="howYouRateIt" name="howYouRateIt" type="range" min="1" max="10" value="5" onchange="showValue(this.value)">
    <span id="range">5</span>

    <script> 
    function showValue(newValue) 
    { 
    document.getElementById("range").innerHTML=newValue; 
    } 
    </script> 

9.4 如何给不支持新特性的浏览器打补丁

  • 在一些老式浏览器或不支持的浏览器上使用这些新特性
    • 可以考虑使用Webshims Lib (http://afarkas.github.io/webshim/demos )
      • Webshims最便捷的地方就是按需打补丁
      • 如果在原生支持HTML5新特性的浏览器上查看网页,则仅会给网页加入一丁点儿的冗余代码。
      • 而对于老版本浏览器,虽然它们需要加载更多的代码
    <script src="js/jquery-2.1.3.min.js"></script> 
    <script src="js-webshim/minified/polyfiller.js"></script>
    <script> 
        // 引入你需要的功能
        webshim.polyfill('forms'); 
    </script>

9.5使用CSS美化HTML5表单

9.5.1 显示必填项
  • 仅通过CSS就告诉用户此输入域为必填项
    input:required { 
    /* 样式*/ 
    }
  • 来标记被聚焦的必填项
    input:focus:required { 
    /* 样式*/ 
    }
  • 当鼠标悬停于item上时,如果item-general-sibling是与其拥有共同父元素并且位于它后方的兄弟元素,那么样式会被应用到item-general-sibling上
    input:focus:required { 
    /* 样式*/ 
    }
  • 当鼠标悬停于item上时,如果item-general-sibling是与其拥有共同父元素并且位于它后方的兄弟元素,那么样式会被应用到item-general-sibling上
    .item:hover ~ .item-general-sibling {} { 
    /* 样式*/ 
    }
  • 当鼠标悬停在元素上时,如果item-adjacent-sibling是紧跟item的兄弟元素,那么样式会被应用到item-adjacent-sibling上。
    .item:hover + .item-adjacent-sibling {} { 
    /* 样式*/ 
    }
  • 为相关的label元素添加样式(重要)
    <div class="form-Input_Wrapper">
      <label for="film">The film in question?</label>
      <input id="film" name="film" type="text" placeholder="e.g. King Kong" required/>
    </div>
    input: required + label: after {
      content: "*";
      font - size: 2.1em;
      position: relative;
      top: 6 px;
      display: inline - flex;
      margin-left: .2 ch;
      transition: color, 1s;
    }
    input: required: invalid + label: after {
      color: red;
    }
    input: required: valid + label: after {
      color: green;
    }
9.5.2 创造一个背景填充效果
  • 我们不能在两个背景图片间添加过渡效果(因为浏览器要将声明光栅化为图片)
  • 然而,我们可以在相关属性的值中间添加过渡效果
    • 如background-position和background-size
  • 使用上面的办法来创造一个填充效果,告知用户input或者textarea被聚焦。
    input: not([type = "range"]), textarea {
        min-height: 30 px;
        padding: 2 px;
        font-size: 17 px;
        border: 1 px solid# ebebeb;
        outline: none;
        transition: transform .4s, box-shadow .4s, background-position .2s;
        background: radial-gradient(400 px circle, #fff 99 % , transparent 99 % ), #f1f1f1;
        background-position: -400 px 90 px, 0 0;
        background-repeat: no-repeat, no-repeat;
        border-radius: 0;
        position: relative;
      }
    input: not([type = "range"]): focus, textarea: focus {
        background-position: 0 0, 0 0;
      }
  • 解析
    • 在第一个规则里,我们生成了一个白色径向渐变,但是它被放置在视线外。
    • 定义在其后侧的背景颜色(紧跟在radial-gradient后的HEX值)并没有被偏移,所以它能提供一个默认的颜色。
    • 当输入域被聚焦时,radial-gradient上的背景位置会设定为默认。
      • 因为我们给背景图片设置了过渡,所以可以在两者之间看到漂亮的过渡效果。
    • 最终我们实现了在用户输入时,输入域被填充为不同的颜色。

第十章 实现响应式Web设计

10.1 尽快让设计在浏览器和真实设备上运行起来

  • 让设计决定断点
    • 总是从最小的屏幕尺寸开始设计,渐渐地使视口尺寸增大
      • 这样你就能知道在哪个地方加入断点。
      • 首先为最小的视口编写CSS,然后在媒体查询中修改其在较大视口下的表现。
    .rule {
      /* 小型视口样式*/
    }
    @media(min - width: 40e m) {
      .rule {
        /* 中型视口样式*/
      }
    }
    @media(min - width: 70e m) {
      .rule {
        /* 大型视口样式*/
      }
    }

10.2 在真实设备上观察和使用设计

  • 早测试,常测试!
  • 使用像BrowserSync这样的工具来同步你的工作 ( https://browsersync.io/
    • 配置完成后,当你保存你的工作时,诸如CSS等的变化就会被注入到浏览器上,而无需你不断地刷新屏幕。
    • 它还能通过WIFI将在不同设备上的浏览器刷新。
    • 这节省了拿起每个测试设备点击刷新的时间。
    • 它甚至能同步滚动和点击

10.3 拥抱渐进增强

  • 应该编写能够精确描述你的内容的HTML5标记
    • 基于文本和内容的网站
      • 正确使用main、header、footer、article、section和aside等元素
    • 构建Web应用或者图形化UI组件
      • 需要思考一下如何提炼成有效的标记
      • 在HTML上的优化越多
      • 你在CSS和JavaScript上为老式浏览器所做的优化就越少

10.4 确定需要支持的浏览器

  • 有的时候根据项目需要,你要从更为高级的浏览器开始编写
    • 如,在你的项目中JavaScript是必需的
10.4.1 等价的功能,而不是等价的外观
  • 网站在每个浏览器上的外观和工作方式一样是不现实也是不可取的
  • “支持老式浏览器”并不意味着“在老式浏览器上看起来一模一样”。
10.4.2 选择要支持的浏览器
  • 如果这是个新项目,并且没有统计数据
    • 我通常会遵循“前两个版本”策略
      • 即是指当前的浏览器版本和之前的两个浏览器版本。
      • 如果IE12是目前的浏览器版本,那么你就要兼容IE10和IE11(前两个版本)。

10.5 分层的用户体验

  • 基本体验是站点的最小可行版本
  • 增强体验则是包括所有功能并且最为美观的版本
  • 然后通过Modernizr,我们可以根据浏览器的兼容性优化体验。
  • 实现体验分层
    • Modernizr为基于浏览器兼容性的优化提供了最为稳健的方式
    • 当编写CSS的时候,“基础”版本代码由以下内容组成
      • 没有被媒体查询包裹的代码
      • 没有被Modernizr添加选择器的代码

10.6将CSS断点与JavaScript联系起来

  • JavaScript总是返回宽度的像素值而不是REM值
    @media(min-width: 20rem) {
      body::after {
        content: "Splus";
        font-size: 0;
      }
    }
    @media(min-width: 47.5rem) {
      body::after {
        content: "Mplus";
        font-size: 0;
      }
    }
    @media(min-width: 62.5rem) {
      body::after {
        content: "Lplus";
        font-size: 0;
      }
    }
  • 在每一个我们想和JavaScript沟通的断点处,我们使用了after伪元素
    • 你也可以使用before伪元素
    • 将其内容设置为断点的名称
    • 在JavaScript中,我们可以阅读这个值
      • 我们将这个值赋给一个变量
    var size = window.getComputedStyle(document.body,':after'). 
    getPropertyValue('content'); 
  • 下面是一个简单的自我调用函数(自我调用意味着它在浏览器解析它的时候马上被调用)
    • 来根据视口大小弹出不同的信息
    ;(function alertSize() {
      if (size.indexOf("Splus") != -1) {
        alert('I will run functions for small screens');
      }
      if (size.indexOf("Mplus") != -1) {
        alert('At medium sizes, a different function could run');
      }
      if (size.indexOf("Lplus") != -1) {
        alert('Large screen here, different functions if needed');
      }
    })();

10.7 避免在生产中使用CSS框架

  • 最为有名的两个是Bootstrap(http://getbootstrap.com/ )和Foundation(http://foundation.zurb.com/
  • 在快速制作原型方面有巨大的优势
    • 例如,把交互方式展现给客户看
  • 在生产中应该避免使用它们
    • 首先,从技术上看,添加一个框架会为你的项目带来过多的冗余代码。
    • 其次,从美学的角度上看,因为这种框架十分普及,所以你的项目会和无数个其他项目看起来一模一样。
    • 最后,如果你只是在你的项目里复制粘贴代码,然后调整至符合你的需求,那么你就不可能充分理解它们的原理。

10.8 尽可能使用最简单的代码

  • 需要为列表中的第五个元素添加不同的样式
  • 并且你能操作标记,那就不要像下面这样使用nth-child选择器:
    .list-item:nth-child(5) { 
    /* 样式*/ 
    } 
  • 直接在标记上添加HTML类是更为明智的做法
    <li class="list-item specific-class">Item</li> 
  • 然后使用类来添加样式:
    • 不仅更易懂,而且支持度也更高(旧版本的IE浏览器并不支持nth-child选择器)
    .specific-class { 
    /* 样式*/ 
    }

10.9 根据视口隐藏、展示和加载内容

  • 响应式Web设计中有一个常用的准则:
    • 如果你在小屏幕上不加载某一部分,那么在大屏幕上也不应该加载。
      • 意味着在每一个视口下用户都应该能达到同样的目的(购买产品、阅读文章、完成交互)
      • 随着屏幕的尺寸越来越大,我们也没有必要去增加额外的部分(窗口小部件、广告、链接等)来填充空白。
    • 将复杂的可视化工作交给CSS
      • JavaScript可以实现单独使用CSS无法实现的交互效果
      • 如果可能的话,在涉及视觉效果的时候,我们仍然应该将工作交给CSS来完成,这意味着:
        • 不要单独使用JavaScript实现菜单移入、移出、打开、关闭的动画效果
          • jQuery的show和hide
      • 相反,应该使用JavaScript在相关的部分上做简单的类变换,然后让类去触发CSS展示相关的动画效果。

10.10 验证器和代码检测工具

10.11 性能

  • 基础条例:
    • (1) 减少你的资源数(例如,不要加载15个JavaScript文件,而应该将它们拼成一个)。
    • (2) 减小你的页面大小(如果你能压缩图片,那么请压缩)。
    • (3) 延迟加载非必需资源(如果你可以将CSS和JavaScript的加载延迟到页面加载完成后,就可以大幅缩短初始化时间)。
    • (4) 保证页面尽快可用(通常是上述所有步骤的副产物)。
  • 有很多工具可以度量和优化性能
    • 我最喜欢的是https://www.webpagetest.org/
      • 会显示出一份完整的页面分析
      • 还会按照幻灯片的方式显示出页面的加载过程,让你知道如何改进页面加载速度
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容