整合营销服务商

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

免费咨询热线:

HTML5基础入门

.标签

1.1meta标签

meta主要用于设置网页中的一些元数据,元数据不是给用户看 charset 指定网页的字符集 name 指定的数据的名称 content 指定的数据的内容

keywords 表示网站的关键字,可以同时指定多个关键字,关键字间使用,隔开

<meta name="Keywords" content="网上购物,网上商城,手机,笔记本,电脑,MP3,CD,VCD,DV,相机,数码,配件,手表,存储卡,京东"/>

description 用于指定网站的描述

<meta name="description" content="京东JD.COM-专业的综合网上购物商城,销售家电、数码通讯、电脑、家居百货、服装服饰、母婴、图书、食品等数万个品牌优质商品.便捷、诚信的服务,为您提供愉悦的网上购物体验!"/>
<meta http-equiv="refresh" content="3;url=https://www.mozilla.org">

将页面重定向到另一个网站

1.2title标签

title标签的内容会作为搜索结果的超链接上的文字显示

<title>Document</title>

1.3标题

  • h1 ~ h6 一共有六级标题
  • 从h1~h6重要性递减,h1最重要,h6最不重要
  • h1在网页中的重要性仅次于title标签,一般情况下一个页面中只会有一个h1
  • 标题元素是块元素
  • <h1>一级标题</h1>
    <h2>二级标题</h2>
    <h3>三级标题</h3>
    <h4>四级标题</h4>
    <h5>五级标题</h5>
    <h6>六级标题</h6>

  • hgroup标签用来为标题分组,可以将一组相关的标题同时放入到hgroup
  • <hgroup>
    <h1>回乡偶书二首</h1>
    <h2>其一</h2>
    </hgroup>
  • 其他标签
    • p标签表示页面中的一个段落
    • <p>在p标签中的内容就表示一个段落</p>
    • em标签用于表示语音语调的一个加重
    • <p>今天天气<em></em>不错!</p>
    • strong表示强调,重要内容!
    • <p>你今天必须要<strong>完成作业</strong></p>
    • blockquote 表示一个长引用
    • <blockquote>
      这句话我是从来没有说过的!
      </blockquote>
    • q表示一个短引用
    • 子曰<q>学而时习之,乐呵乐呵!</q>
    • br标签表示页面中的换行
    • <br>

1.4布局标签

header 表示网页的头部 main 表示网页的主体部分(一个页面中只会有一个main) footer 表示网页的底部 nav 表示网页中的导航 aside 和主体相关的其他内容(侧边栏) article 表示一个独立的文章 section 表示一个独立的区块,上边的标签都不能表示时使用section

div 没有语义,就用来表示一个区块,目前来讲div还是我们主要的布局元素

span 行内元素,没有任何的语义,一般用于在网页中选中文字

<header></header>
    <main></main>
    <footer></footer>

    <nav></nav>
    <aside></aside>
    <article></article>

    <section></section>

    <div></div>

    <span></span>

1.5列表

1.1.1分类

1.1.1.1有序列表

使用ol标签来创建无序列表,使用li表示列表项

<ul>
       <li>结构</li>
       <li>表现</li>
       <li>行为</li>
   </ul>

1.1.1.2 无序列表

使用ul标签来创建无序列表,使用li表示列表项

<ol>
       <li>结构</li>
       <li>表现</li>
       <li>行为</li>
   </ol>

1.1.1.3定义列表

使用dl标签来创建一个定义列表, 使用dt来表示定义的内容,使用dd来对内容进行解释说明

<dl>
       <dt>结构</dt>
       <dd>结构表示网页的结构,结构用来规定网页中哪里是标题,哪里是段落</dd>
       <dd>结构表示网页的结构,结构用来规定网页中哪里是标题,哪里是段落</dd>
       <dd>结构表示网页的结构,结构用来规定网页中哪里是标题,哪里是段落</dd>
   </dl>

1.1.1.4列表之间可以互相嵌套

<ul>
       <li>
          aa
           <ul>
               <li>aa-1</li>
               <li>aa-2
                   <ul>
                       <li>aa-1</li>
                       <li>aa-2</li>
                   </ul>
               </li>
           </ul>
       </li>
   </ul>

1.6超链接

1.6.1 作用

超链接可以让我们从一个页面跳转到其他页面, 或者是当前页面的其他的位置

1.6.2 定义

使用 a 标签来定义超链接

<a href="https://www.baidu.com">超链接</a>

1.6.3 属性

1.6.3.1属性1:href

指定跳转的目标路径

值可以是一个外部网站的地址

也可以写一个内部页面的地址

超链接是也是一个行内元素,在a标签中可以嵌套除它自身外的任何元素

1.6.3.2 属性2:target

用来指定超链接打开的位置

_self 默认值 在当前页面中打开超链接

_blank 在一个新的要么中打开超链接

<a href="07.列表.html" target="_blank">超链接</a>

1.6.4其他

将#作为超链接的路径的展位符使用

javascript:; 来作为href的属性,此时点击这个超链接什么也不会发生

将超链接的href属性设置为#,这样点击超链接以后 页面不会发生跳转,而是转到当前页面的顶部的位置

跳转到页面的指定位置,只需将href属性设置 #目标元素的id属性值

<a href="#bottom">去底部</a>
   <br><br>
<a href="#p3">去第三个自然段</a>
   <br><br>
<p>
  内容多一点
</p>
<a href="#">这是一个新的超链接</a>
   <br><br>
<a href="javascript:;">这是一个新的超链接</a>
   <br><br>
<a id="bottom" href="#">回到顶部</a>

1.7图片标签

img标签来引入外部图片,img标签是一个自结束标签

属性:src 属性指定的是外部图片的路径(路径规则和超链接是一样的)

alt 图片的描述,这个描述默认情况下不会显示,有些浏览器会图片无法加载时显示

<img src="./img/1.gif" alt="松鼠">

1.8内联框架

用于向当前页面中引入一个其他页面

  • src 指定要引入的网页的路径
  • frameborder 指定内联框架的边框
<iframe src="https://www.qq.com" width="800" height="600" frameborder="0"></iframe>

1.8 音视频标签

1.8.1音频

audio 标签用来向页面中引入一个外部的音频文件的

1.8.1.1 属性

  • controls 是否允许用户控制播放
  • autoplay 音频文件是否自动播放
    • 如果设置了autoplay 则音乐在打开页面时会自动播放
  • loop 音乐是否循环播放
<audio src="./source/audio.mp3" controls autoplay loop></audio>

除了通过src来指定外部文件的路径以外,还可以通过source来指定文件的路径

<audio controls>
       <!-- 对不起,您的浏览器不支持播放音频!请升级浏览器!-->
       <source src="./source/audio.mp3">
       <source src="./source/audio.ogg">
       <embed src="./source/audio.mp3" type="audio/mp3" width="300" height="100">
   </audio>

1.8.2视频

与 audio 相似

<video controls>
       <source src="./source/flower.webm">
       <source src="./source/flower.mp4">
       <embed src="./source/flower.mp4" type="video/mp4">
   </video>


2.表格table

  • 在table中使用tr表示表格中的一行,有几个tr就有几行
  • 在tr中使用td表示一个单元格,有几个td就有几个单元格
  • rowspan 纵向的合并单元格
  • colspan 横向的合并单元格
<table border="1" width='50%' align="center">
      <tr>
          <td>A1</td>
          <td>B1</td>
          <td>C1</td>
          <td>D1</td>
      </tr>
      <tr>
          <td>A2</td>
          <td>B2</td>
          <td>C2</td>
          <td rowspan="2">D2</td>
      </tr>
      <tr>
          <td>A3</td>
          <td>B3</td>
          <td>C3</td>
      </tr>
      <tr>
          <td>A4</td>
          <td>B4</td>
          <td colspan="2">C4</td>
      </tr>
  </table>

长表格

  • 可以将一个表格分成三个部分:
    • 头部 thead
    • 主体 tbody
    • 底部 tfoot
  • th 表示头部的单元格
<table border="1" width='50%' align="center">  
      <thead>
          <tr>
              <th>日期</th>
              <th>收入</th>
              <th>支出</th>
              <th>合计</th>
          </tr>
      </thead>
      <tbody>
          <tr>
              <td>2000.1.1</td>
              <td>500</td>
              <td>200</td>
              <td>300</td>
          </tr>
          <tr>
              <td>2000.1.1</td>
              <td>500</td>
              <td>200</td>
              <td>300</td>
          </tr>
          <tr>
              <td>2000.1.1</td>
              <td>500</td>
              <td>200</td>
              <td>300</td>
          </tr>
          <tr>
              <td>2000.1.1</td>
              <td>500</td>
              <td>200</td>
              <td>300</td>
          </tr>
      </tbody>
      <tfoot>
          <tr>
              <td></td>
              <td></td>
              <td>合计</td>
              <td>300</td>
          </tr>
      </tfoot>

  </table>

表格样式

  • border-spacing: 指定边框之间的距离
border-spacing: 0px;
  • border-collapse: collapse; 设置边框的合并
border-collapse: collapse;
  • 如果表格中没有使用tbody而是直接使用tr,那么浏览器会自动创建一个tbody,并且将tr全都放到tbody中tr不是table的子元素

3.表单(form)

  • 使用form标签来创建一个表单
  • action 表单要提交的服务器的地址
  • 数据要提交到服务器中,必须要为元素指定一个name属性值
<input type="text" name="username">
  • 单选按钮
    • 像这种选择框,必须要指定一个value属性,value属性最终会作为用户的填写的值传递给服务器
    • checked 可以将单选按钮设置为默认选中
<input type="radio" name="hello" value="a">
<input type="radio" name="hello" value="b" checked>
  • 多选框
<input type="checkbox" name="test" value="1">
      <input type="checkbox" name="test" value="2">
      <input type="checkbox" name="test" value="3" checked>
  • 下拉列表
<select name="haha">
          <option value="i">选项一</option>
          <option selected value="ii">选项二</option>
          <option value="iii">选项三</option>
      </select>
  • 提交按钮
<input type="submit" value="注册">

属性

  • autocomplete="off" 关闭自动补全
  • readonly 将表单项设置为只读,数据会提交
  • disabled 将表单项设置为禁用,数据不会提交
  • autofocus 设置表单项自动获取焦点
<form action="target.html">
      <input type="text" name="username" value="hello" readonly>
      <br><br>
      <input type="text" name="username" autofocus>
      <br><br>
      <input type="text" name="b">

      <br><br>

      <!-- <input type="color"> -->
      <br><br>
      <!-- <input type="email"> -->
      <br><br>

      <input type="submit">
      <!-- 重置按钮 -->
      <input type="reset">
      <!-- 普通的按钮 -->
      <input type="button" value="按钮">

      <br><br>
       

      <button type="submit">提交</button>
      <button type="reset">重置</button>
      <button type="button">按钮</button>
  </form>

4.注释

<!--
我是注释中的注释 注释不能嵌套
-->

5.属性

  • 属性,在标签中(开始标签或自结束标签)还可以设置属性
  • 属性是一个名值对(x=y)
  • 属性用来设置标签中的内容如何显示
  • 属性和标签名或其他属性应该使用空格隔开
  • 属性不能瞎写,应该根据文档中的规定来编写,有些属性有属性值,有些没有。如果有属性值,属性值应该使用引号引起来

6.文档声明

<!doctype html>

内容是《Web前端开发之Javascript视频》的课件,请配合大师哥《Javascript》视频课程学习。

HTML5规范围绕着如何使用新增标记定义了大量Javascript API;其中一些API与DOM重叠,定义了浏览器应该支持的DOM扩展;

从HTML4开始,在Web开发领域,有一个非常大的应用,就是滥用class属性,一方面可以通过它为元素添加样式,另一方面还可以用它表示元素的语义;于是,开发人员会用大量的Javascript代码来操作CSS类,比如动态修改类或者搜索文档中具有给定类或给定的一组类的元素,等等这些操作;为了让开发人员适应并增加对class属性的新的认识,HTML5新增了很多API,致力于简化CSS类的用法;

getElementsByClassName(names)方法:

该方法是基于元素class属性值中的类名来选取成组的文档元素,可以通过document对象或Element元素调用这个方法;该方法最早出现在第三方Javascript类库中,是通过既有的DOM功能实现的,而现在,原生的实现具有极大的性能优势;

该方法接收一个names参数,即一个包含一个或多个类名的字符串,多个类名使用空格隔开,返回带有指定类的所有元素的HTMLCollection;

var elts = document.getElementsByClassName("myclass");
console.log(elts);  // HTMLCollection
console.log(elts[0]);  // 第一个元素

传入多个类名时,类名的先后顺序不重要;如:

// 取得所有类中同时包括username和current的元素,类名的先后顺序无所谓
var allCurrentUsernames = document.getElementsByClassName("username current");
console.log(allCurrentUsernames);
var selected = document.getElementById("mydiv").getElementsByClassName("selected");
console.log(selected);

它返回的HTMLCollection集合,可以借用Array的方法,如:

var elts = document.getElementsByClassName("selected");
var eltDivs = Array.prototype.filter.call(elts, function(ele){
    return ele.nodeName === 'DIV';
});
console.log(eltDivs);  // 返回拥有selected类名的所有div元素

使用这个方法可以更方便地为带有某些类的元素添加事件处理程序,从面不必再局限于使用ID或标签名;

<style>
.zr{background-color: rosybrown;}
@keyframes rotate{
    0%{transform: rotate(0deg);}
    50%{transform: rotate(45deg);}
    100%{transform: rotate(0deg);}
}
.animating{
    animation: rotate 2s ease-in-out;
}
</style>
<p class="zr">this is ok</p>
<!-- 添加若干个class为zr的元素 -->
<script>
var elts = document.getElementsByClassName("zr");
for(var i=0,len=elts.length; i<len; i++){
    elts[i].addEventListener("click",function(e){
        this.classList.add("animating");
    },false);
    elts[i].addEventListener("animationend",function(e){
        this.classList.remove("animating");
        console.log("end");
    });
}
</script>

如此,我们就可以为某些需要执行动画的元素添加一个名为zr的class类即可;当然,此处是一个动画效果,也可以是其他的某些操作;

getElementsByClassName()方法与querySelector()和querySelectorAll()方法很类似,但用法及返回类型不同;

var elts = document.getElementsByClassName("myclass outer");
console.log(elts);  // HTMLCollection
var elts = document.querySelectorAll(".myclass,.outer");
console.log(elts);  // NodeList

getElementsByClassName()参数只能是类名,且多个类名用空格隔开,多个类名是并的关系,而且不分顺序,即只有所有class都匹配的元素才会被返回,其返回类型是HTMLCollection,是动态的集合;

querySelector()参数是CSS选择器,并且可以使用复杂的CSS选择器,只要是合法的CSS选择器都可以,但多个选择器必须使用逗号分隔,它们是或的关系,其返回类型是NodeList,并且这个NodeList是静态的;

目前,获取元素集合共有四个方法,要注意它们的不同点;

var elts = document.getElementsByClassName("myclass outer");
console.log(elts);  // HTMLCollection
var elts = document.getElementsByTagName("div");
console.log(elts);  // HTMLCollection
var elts = document.getElementsByName("myname");
console.log(elts);  // NodeList
var elts = document.querySelectorAll(".myclass,.outer,.current");
console.log(elts);  // NodeList

另外,需要注意的是,getElementsByClassName()方法返回的是动态HTMLCollection,所以使用这个方法与使用getElementsByTagName()以及其他返回动态集合的DOM方法都具有同样的性能问题;

元素滚动:

Element.scrollIntoView(alignToTop | scrollIntoViewOptions)方法:

DOM对滚动页面没有做出规定;各浏览器分别实现了相应的方法,用于以不同方式控制滚动,最终HTML5选择了scrollIntoView()作为标准方法;

该方法是作为Element类型的扩展存在的,因此可以在所有元素上使用,通过滚动浏览器窗口或某个容器元素,使调用该方法的元素出现在视口中;

该方法接收一个布尔值参数alignToTop或Object型(scrollIntoViewOptions)参数,如果为true或者省略,那么窗口会尽可能滚动到自身顶部与元素顶部平齐,如果为false,调用元素会尽可能全部出现在视口中,不过顶部不一定对齐;

var mybtn = document.getElementById("mybtn");
mybtn.onclick = function(){
    var img = document.getElementById("myimg");
    img.scrollIntoView(false);
}

Object型参数scrollIntoViewOptions:一个包含下列属性的对象:

  • behavior:可选,定义动画过渡效果,"auto"或 "smooth" 之一,默认为 "auto";
  • block:可选,定义垂直方向的对齐,"start", "center", "end", "nearest"之一,默认为 "start";
  • inline:可选,定义水平方向的对齐,"start", "center", "end", "nearest"之一,默认为 "nearest";
img.scrollIntoView({behavior:"smooth",block:"nearest",inline:"center"});

但是IE与Edge对scrollIntoViewOptions这个参数并不友好,比如不支持behavior:”smooth”等;

var btn = document.getElementById("btn");
btn.onclick = function(){
    var img = document.querySelector("img");
    // 以下三行是等同的
    img.scrollIntoView();
    img.scrollIntoView(true);
    img.scrollIntoView({behavior:"auto",block:"start"});
    // 以下两行是等同的,但IE与Edge似乎不识别end
    img.scrollIntoView(false);
    img.scrollIntoView({behavior:"auto",block:"end"});
}

另外,CSS3中有个平滑滚动的属性scroll-behavior,如;

<style>
        html,body{scroll-behavior: smooth;}
</style>

只要页面有滚动行为,自动进行平常处理;但IE与Edge不支持;

当页面发生变化时,一般会用这个方法来吸引用户的注意力;实际上,为某个元素设置焦点也会导致浏览器滚动并显示出获得焦点的元素;

var username = document.getElementById("username");
username.focus();

Element.scrollIntoViewIfNeeded()方法:

用来将不在浏览器窗口的可见区域内的元素滚动到浏览器窗口的可见区域,如果该元素已经在浏览器窗口的可见区域内,则不会发生滚动,此方法是标准的Element.scrollIntoView()方法的专有变体,不属于任何规范,是一种WebKit专有的方法;

var btn = document.getElementById("btn");
btn.onclick = function(){
    var elt = document.getElementById("elt");
    elt.scrollIntoViewIfNeeded(true);
}

目前,除了Chrome和Opera支持,其他都不支持;

应用的场景:

对URL中hash标记的进化;比如:回到顶部(#);

<a href="javascript:void(0)" id="topA" style="position:fixed;right:50px;bottom:50px;display:block; width:50px;height:50px;background-color:purple;">回到顶部</a>
<script>
// 回到顶部
var topA = document.getElementById("topA");
topA.onclick = function(){
    document.body.scrollIntoView({behavior:"smooth",block:"start"});
}
</script>

滚动到指定位置(#xxx);

如:一个单页导航的应用;

<style>
*{margin:0; padding: 0;}
html,body{
    -ms-overflow-style: none; scrollbar-width: none;
}
::-webkit-scrollbar{ display: none; }
ul,li{list-style-type: none;}
header{
    position: fixed; top:0; left: 0;;
    width: 100%; height: 2rem; background-color: rgba(0, 0, 0, .5);
}
nav ul li{padding: 0 2rem; line-height: 2rem; float: left;}
nav ul li a{color:#FFF; text-decoration: none;}
section{width: 100%; height: 100vh; box-sizing: border-box; padding: 10%; background-size:cover;}
section#banner{background: url(images/1.jpg) no-repeat center; background-size:cover;}
section#service{background:url(images/2.jpg) no-repeat center; background-size:cover;}
section#contact{background: url(images/3.jpg) no-repeat center; background-size:cover;}
footer{
    width:100%;height: 2rem; background-color: rgba(0, 0, 0, .8); color:rgba(255, 255, 255, .8);
    position: fixed; left: 0; bottom: 0;
}
</style>
<header>
    <nav>
        <ul>
            <li><a href="dom1.html">首页</a></li>
            <li><a href="#news" data-name="news">新闻</a></li>
            <li><a href="#service" data-name="service">服务</a></li>
            <li><a href="#about" data-name="about">关于</a></li>
            <li><a href="#contact" data-name="contact">联系</a></li>
        </ul>
    </nav>
</header>
<section id="banner">
    <h2>零点程序员</h2>
    <h3>zeronetwork</h3>
</section>
<section id="news"><h2>新闻中心</h2></section>
<section id="service"><h2>服务领域</h2></section>
<section id="about"><h2>关于我们</h2></section>
<section id="contact"><h2>联系我们</h2></section>
<footer><p>北京零点网络科技有限公司,www.zeronetwork.cn 零点程序员</p></footer>
<script>
window.onload = function(){
    scrollPage();
    var navs = document.querySelectorAll("nav a");
    for(var i=0,len=navs.length; i<len; i++){
        (function(){
            var item = navs[i];
            item.addEventListener("click",function(event){
                event.preventDefault();
                scrollPage(event.target.dataset.name);
            },false);
        })();
    }
}
function scrollPage(id){
    console.log(id);
    var section = id ? document.querySelector("#" + id) : document.body;
    section.scrollIntoView({behavior:"smooth",block:"start"});
}
</script>

聊天窗口滚动显示最新的消息;

<style>
*{margin: 0px; padding: 0;}
html,body{font-size: 14px;}
ul,li{list-style-type: none;}
li{margin: 1.5vh 0;}
#app{
    width: 400px; height: 400px; border: 10px solid purple;
    position: relative; background-color: rosybrown; 
    padding-bottom: 40px;
}
#message{ width: 100%; height:100%; padding:15px; padding-bottom: 0; 
    box-sizing: border-box; overflow-y: scroll;
}
#message ul{padding-bottom: 15px;}
#message ul li{display: flex;}
#message ul li.me{flex-direction: row-reverse;}
#message ul li a{display: inline-block;}
#message ul li a img{width: 2vw; height: 2vw; border-radius: 50%;}
#message ul li p{
    background-color: #FFF; border-radius: 3px; padding:0.5vw; margin:0 3vw 0 1vw;
}
#message ul li.me p{background-color:#09ce44;margin: 0 1vw 0 3vw;}
#inputdiv{
    position: absolute; left: 0; bottom: 0; width: 100%; height: 40px; 
    background-color:rgba(0, 0, 0, 1); padding: 5px; box-sizing: border-box;
    display:flex;
}
#txtInput{flex-grow: 3;}
#btn{flex-grow: 1;}
</style>
<div id="app">
    <div id="message">
        <ul>
            <li><a href="#"><img src="images/1.jpg" /></a><p>...</p></li>
            <li class="me"><a href="#"><img src="images/1.jpg" /></a><p>...</p></li>
            <li class="me"><a href="#"><img src="images/1.jpg" /></a><p>..</p></li>
            <li><a href="#"><img src="images/1.jpg" /></a><p>...</p></li>
            <li class="me"><a href="#"><img src="images/1.jpg" /></a><p>...</p></li>
        </ul>
    </div>
    <div id="inputdiv"><input type="text" id="txtInput" name="txtInput" />
    <input type="button" value="发送" id="btn" /></div>
</div>
<script>
window.onload = function(){
    var ul = document.querySelector("#message>ul");
    if(navigator.userAgent.indexOf("Trident") != -1){
        ul.scrollIntoView(false);
    }else{
        ul.scrollIntoView({behavior:"smooth", block:"end"});
    }
    var btn = document.querySelector("#btn");
    btn.addEventListener("click",function(e){
        var txtInput = document.querySelector("#txtInput");
        if(txtInput.value){
            var html = "<li class=\"me\"><a href=\"#\"><img src=\"images/1.jpg\" /></a>";
            html += "<p>" + txtInput.value + "</p></li>";
            document.querySelector("#message ul").insertAdjacentHTML("beforeend", html);
            txtInput.value = "";
        }
        if(navigator.userAgent.indexOf("Trident") != -1){
            ul.scrollIntoView(false);
        }else{
            ul.scrollIntoView({behavior:"smooth", block:"end"});
        }
    },false);
}
</script>

焦点管理:

HTML5也添加了辅助管理DOM焦点的功能;

document.activeElement属性:

该属性始终会引用DOM中当前获得了焦点的元素;

元素获得焦点的方式有页面加载、用户输入和在代码中调用focus()方法,如:

console.log(document.activeElement);
var btn = document.getElementById("myButton");
btn.focus();
console.log(document.activeElement === btn);  // true

默认情况下,文档刚刚加载完成时,document.activeElement中保存的是document.body元素的引用,文档加载期间,其该属性的值为null;

一般情况下,都是在一个表单控件上应用焦点管理,比如,在一个input或textarea上选择文本时,activeElement属性就会返回该元素;

在现实中,该属性在控件中使用时,一般会与选择控件中的文本操作配合使用,比如,调用该控件的selectionStart()和selectionEnd()方法来获取选择的文本内容;

<input type="text" id="myinput" value="北京零点网络科技有限公司" /><br/>
<textarea id="mytextarea" rows="5" cols="40">北京零点网络科技有限公司推出零点程序员品牌,专门从事IT培训,主讲是大师哥王唯。</textarea>
<p>获得焦点的元素:<b id="outputelement"></b></p>
<p>选择的文本:<b id="outputtext"></b></p>
<script>
function selectText(e){
    var activeEl = document.activeElement;
    var selection = activeEl.value.substring(
        activeEl.selectionStart, activeEl.selectionEnd
    );
    var outputelement = document.getElementById("outputelement");
    var outputtext = document.getElementById("outputtext");
    outputelement.innerHTML = activeEl.id;
    outputtext.innerHTML = selection;
}
var myinput = document.getElementById("myinput");
var mytextarea = document.getElementById("mytextarea");
myinput.addEventListener("mouseup", selectText,false);
mytextarea.addEventListener("mouseup", selectText,false);
</script>

小示例:

// 获取焦点的控件自动滚到页面中间
window.addEventListener("click",function(e){
    var elt = document.activeElement;
    if(elt.tagName == "INPUT" || elt.tagName == "TEXTAREA")
        elt.scrollIntoView({behavior:"smooth", inline:"center"});
},false);

解决由于窗口缩放、键盘弹出后遮挡表单的问题:

<!-- 按tab切换到input,再缩放窗口大小 -->
<h1 tabindex="1">Web前端开发</h1>
<div style="height: 1000px; background-color: purple;" id="mydiv" tabindex="2">div</div>
<input type="text" />
<script>
window.addEventListener("resize",function(e){
    if(document.activeElement.tagName === 'INPUT' ||
        document.activeElement.tagName === 'TEXTAREA'){
        setTimeout(function(){
            document.activeElement.scrollIntoView({behavior:"smooth"});
        },100);
    }
});
</script>

activeElement属性是只读的,如果想让某个元素获取焦点,可以调用该元素的focus()方法,如:

var myinput = document.getElementById("myinput");
document.activeElement = myinput;  // 失效
myinput.focus();
console.log(document.activeElement);  // input

document.hasFocus()方法:

该方法用于表明当前文档或者当前文档内的节点是否获得取焦点,该方法可以用来判断当前文档中的活动元素是否获得了焦点,如:

console.log(document.hasFocus());

当查看一个文档时,当前文档中获得焦点的元素一定是当前文档的活动元素,但一个文档中的活动元素不一定获得了焦点,例如,一个在后台窗口中的活动元素一定没有获得焦点;

通过检测文档是否获得了焦点,可以知道用户是不是正在与页面交互;

<input id="btn" type="button" value="打开窗口" /><br/>
<script>
function openWin(){
    window.open("about:blank","newwin","width=400,height=300");
}
var btn = document.getElementById("btn");
btn.addEventListener("click", openWin, false);
function checkPageFocus(){
    if(document.hasFocus())
        console.log("该页面获得了焦点");
    else
        console.log("该页面失去了焦点");
}
setInterval(checkPageFocus, 1000);
</script>

查询文档获知哪个元素获得了焦点,以及确定文档是否获得了焦点,这两个功能最重要的用途是提高Web应用的无障碍性;无障碍Web应用的一个主要标志就是恰当的焦点管理,而确切地知道哪个元素获得了焦点是一个比较重要的操作;

HTMLDocument的增强:

HTML5扩展了HTMLDocument,增加了新的功能;

document.readyState属性:

该属性描述了document 的加载状态,当该属性值发生变化时,会在 document 对象上触发 readystatechange事件;

IE4最早为document对象引入了readyState属性,然后,其他浏览器也都陆续实现了这个属性,最终HTML5把这个属性纳入了标准之中。

该属性有三个可能的值:

  • loading:正在加载文档;
  • interactive:可交互的,文档已被解析,"正在加载"状态结束,但是诸如图像,样式表和框架之类的资源仍在加载;
  • complete:文档和所有资源已完成加载,表示load状态的事件即将被触发;
console.log(document.readyState);  // loading

为什么要使用document.readyState属性?目的就是通过它来实现一个指示文档已经加载完成的指示器;在这个属性没有得到广泛支持前,要实现这样的一个指示器,必须借助onload事件处理程序,表明文档已经加载完毕;

window.onload = function(){
    console.log("文档加载完毕")
    console.log(document.readyState);  // complete
}
现在可以直接使用document.readyState属性来判断,如:
// 不会被执行,因为代码运行到此处,readySate状态为loading
if(document.readyState == "complete"){
    console.log("文档已加载完毕");
    console.log(document.readyState);
}

但并没有执行,因为代码执行到此处,readyState的状态为loading,而后它又不能自己更新,所以要实时的取得readyState的状态;当该属性值发生变化时,会在 document 对象上触发 readystatechange事件,所以使用该事件就可以实时监听它的状态;

document.onreadystatechange = function(e) {
    // if(document.readyState == "loading"){
    //     console.log("Loading");
    // }else if(document.readyState == "interactive"){
    //     var span = document.createElement("span");
    //     span.textContent = "资源正在加载";
    //     document.body.appendChild(span);
    //     console.log("Interactive");
    // }else if(document.readyState == "complete"){
    //     var span = document.querySelector("span");
    //     document.body.removeChild(span);
    //     console.log("Complete");
    // }
    // 或者
    switch(document.readyState){
        case "loading":
            console.log("Loading");
            break;
        case "interactive":
            // 文档已经结束了“正在加载”状态,DOM元素可以被访问。
            // 但是像图像,样式表和框架等资源依然还在加载。
            var span = document.createElement("span");
            span.textContent = "资源正在加载";
            document.body.appendChild(span);
            console.log("Interactive");
            break;
        case "complete":
            // 页面所有内容都已被完全加载
            var img = document.getElementsByTagName("img")[0];
            console.log("图片等资源加载完成:" + img.src);
            break;
    }
}

一个简单小示例,loading页

<style>
*{margin: 0; padding: 0;}
#loading{
    width: 100vw; height: 100vh; background-color: rgba(0, 0, 0, .6);
    position: absolute; top: 0; left: 0;
}
@keyframes rotate{
    0%{transform: rotate(0deg);}
    100%{transform: rotate(360deg);}
}
#loading img{
    width: 5vw;
    position: absolute; left: 50%; top:50%;
    margin-left: -5vw; margin-top:-5vh;
    animation: rotate 1s linear infinite;  /* [ˈɪnfɪnət] */
}
#loading.loading-none{display: none;}
</style>
<div id="loading"><img src="images/loading.png" /></div>
<script>
document.onreadystatechange = function(e) {
    if(document.readyState == "complete")
        document.getElementById("loading").className = "loading-none";
    else
        document.getElementById("loading").className = ""
}
</script>

compatMode兼容模式:

页面的渲染有两种方式,Standards mode标准模式和Quirks mode混杂模式(也称为怪异模式);

这两种模式主要影响CSS内容的呈现,某些情况下也会影响JavaScript的执行;所以,在开发时,确定浏览器处于何种模式很重要;

起先,是从IE6开始区分渲染页面的模式是Standards mode还是Quirks mode;IE为此给document对象添加一个名为compatMode属性,该属性即用于识别浏览器处于什么模式;如果是标准模式,返回CSS1Compat,反之返回BackCompat;后来,其他浏览器也实现了这个属性,最终HTML5也把这个属性纳入标准;

console.log(document.compatMode);  // CSS1Compat

目前,存在以下几种情况:

浏览器都是根据是否有DOCTYPE声明判断,有则为标准模式,值为CSS1Compact,无则为混杂模式,值为BackCompact;因此,一条好习惯就是每个html文档都要有doctype声明;

对于有DOCTYPE声明,但浏览器不能正确识别,则使用混杂模式,值为BackCompact;

如果有xml声明 <?xml version="1.0" encoding="utf-8"?>也是混杂模式;

另外,如果文档的第一行是标签或文本,也为混杂模式;

对于IE来说,这两种模式差别很大,但对其他浏览器来说,差别很小,因此,这两种模式的判断和差别主要是针对IE;

两种模式的具体差别:

在Standards Mode下对于盒模型的解释所有浏览器都是基本一致的,但在Quirks Mode模式下则有很大差别;

在Standards mode中:

元素真正的宽度 = margin + border-width + padding + width;

在Quirks mode中:

元素真正的宽度 = width,而其内容宽度 = width - (margin – padding - border-width);

在标准模式下,所有尺寸都必须包含单位,否则会被忽略,而在混杂模式下,可以不带单位,如:style.width = "20",相当于"20px";

当一个div元素中包含的内容只有图片时,在标准模式下的所有浏览器中,在图片底部都有4像素的空白;但在混杂模式下,div距图片底部默认没有空白;

两种模式获取视口的方式是不同的;

console.log(document.body.clientHeight);
console.log(document.documentElement.clientHeight);

就是说,在BackCompact模式下,取得document的某些属性,如clientWidth、scrollLeft等,使用的是document.body,而标准模式下,使用的是document.documentElement,如:

var height = document.compatMode == "CSS1Compat" ? document.documentElement.clientHeight : document.body.clientHeight;
console.log(height);

documentMode文档模式:

IE8为document对象添加了documentMode属性,即文档模式(document mode),该属性与compatMode属性紧密相关,但该属性不是标准属性,除了IE,其它浏览器都不支持;

console.log(document.documentMode);  // 11

页面的文档模式决定了可以使用什么功能,如,文档模式决定了可以使用哪个级别的CSS,可以在Javascript中使用哪些API,以及如何对待文档类型;

在IE8中,有三种不同的呈现模式:

  • 为5,则为混杂模式(IE5),IE8或更高版本中的新功能无法使用;
  • 为7,表示IE7仿真模式,IE8或更高版本中的新功能无法使用;
  • 为8,表示IE8标准模式,IE8中的新功能都可以使用,如可以使用Selectors API,更多CSS2级选择器和某些CSS3功能,还有一些HTML5的功能;不过IE9中的新功能无法使用;

从IE8往后,都遵循了这一规律,比如,为9,表示IE9标准模式,支持ES5,CSS3和更多HTML5的功能;

有了这个属性,就能准确的判断IE的各种版本了,如:

var isIE = !!(window.ActiveXObject || "ActiveXObject" in window);
var ieMode = document.documentMode;
var isIE7 = isIE && ieMode && ieMode == 7;
var isIE8 = isIE && ieMode && ieMode == 8;
var isIE9 = isIE && ieMode && ieMode == 9;
var isIE10 = isIE && ieMode && ieMode == 10;
console.log(isIE);  // true
console.log(isIE10);  // 切换到10版本,返回true

X-UA-Compatible:

开发者还可以主动要求客户端按照什么文档模式进行渲染,也就是强制浏览器以某种模式渲染页面,此时可以使用HTTP头部信息X-UA-Compatible,或通过等价的<meta>标签来设置:

<meta http-equiv="X-UA-Compatible" content="IE=IEVersion">

IEVersion有可能有以下值:

  • Edge:始终以最新的文档模式来渲染页面;忽略文档类型声明;
  • EmulateIE9(8、7):如果有文档声明,则以IE9(8、7)标准模式渲染页面,否则将文档模式设置为IE5;
  • 9、8、7、5:强制以IE9(8、7、IE5模式)标准模式渲染页面,忽略文档类型声明;

如:让文档模式像在IE7中一样,可以:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">

如果不考虑文档类型声明,而直接使用IE8标准模式,可以:

<meta http-equiv="X-UA-Compatible" content="IE=8">

再如,强制以IE5混杂模式渲染:

<meta http-equiv="X-UA-Compatible" content="IE=5" />

如果在IE8以下的浏览器中设置,是无效的,因为该设置是在IE8才开始有的;

使用最新的文档模式:

<meta http-equiv="X-UA-Compatible" content="IE=edge"/>

IE浏览器将总是使用最新版本的文档模式;

另外,也可以同时设置多个值,中间用逗号隔开;

<meta http-equiv="X-UA-Compatible" content="IE=IEVersion">

注意,由右向左进行尝试,即先使用IE8模式,如果失败,则使用IE模式;

最流行的设置:

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>

chrome=1表示可以激活Chrome Frame;

如果安装了Google Chrome Frame(谷歌浏览器內嵌框架)则使用谷歌浏览器内核模式,甚至会使用Chrome的控制台,否则使用最新的IE模式;

head属性:

在HTML5规范中新增了document.head属性,引用文档的<head>元素,属于HTMLHeadElement类型;

console.log(document.head);
console.log(document.head === document.querySelector("head"));

各主流浏览器均支持,但为了兼容低版本的,也可以结合备用方式,如:

var head = document.head || document.getElementsByTagName("head")[0];

如果有多个<head>元素,则返回第一个;

document.head 是个只读属性,为该属性赋值只会静默失败,如果在严格模式中,则会抛出TypeError异常;

字符集属性:

HTML5新增了几个与文档字符集有关的属性,其中,charset属性表示实际使用的字符集,也可以用来指定新字符集;可以通过<meta>元素、响应头部或直接设置charset属性修改这个值,但实际上是只读的,现在已经被characterSet替代,该属性是只读属性,返回当前文档的字符编码,该字符编码是用于渲染此文档的字符集,如:

console.log(document.charset);  // UTF-8

此时,可以修改文档的字符集设置,如:

// IE与老版的Edge返回gb2312,其它默认失败
document.charset = "gbk";
console.log(document.charset);  // UTF-8
console.log(document.characterSet);
// 同上,但所有浏览器静默失败
document.characterSet = "gbk";
console.log(document.characterSet);

另一个属性是defaultCharset,表示根据默认浏览器及操作系统的设置,当前文档默认的字符集应该是什么,该属性不是标准属性,没什么用处;

console.log(document.defaultCharset);  // 只有IE与Safari有值

data-自定义数据属性:

HTML5定义了一种标准的、附加额外数据的方法,即在HTML5文档中,任意以”data-”为前缀的小写的属性名称都是合法的,这样的属性被称为数据集属性,目的是为元素提供与渲染无关的信息,或者提供语义信息;这些属性可以任意添加、随便命名,只要以data-开头即可,如:

<div id="mydiv" data-appId="1234" data-myname="wangwei"></div>

HTMLElement.dataset属性:

在Javascript中也为Element对象上定义了dataset属性,该属性指代一个对象,是元素的data-特性的实时、双向的接口;

dataset属性的值是DOMStringMap接口的一个实例,被用于容纳和展示元素的自定义属(特)性,它就是一个名值对的映射,在这个映射中,每个data-name形式的属性都会有一个对应的属(特)性,只不过属性名没有data-前缀,比如,dataset.x保存的就是data-x属(特)性的值;带连字符的属(特)性对应于驼峰命名属性名,如:data-web-test属(特)性就变成dataset.webTest属性;如:

<div id="mydiv" data-appId="001" data-subtitle="zeronetwork" data-web-description="零点程序员"> 
// Javascript
var mydiv = document.getElementById("mydiv");
console.log(mydiv.dataset);  // DOMStringMap
console.log(mydiv.dataset.subtitle);  // zeronetwork
console.log(mydiv.dataset.webDescription);  // 零点程序员
console.log(mydiv.dataset.appid);  // 只能小写,不能是appId 

设置或删除dataset的一个属性就等同于设置或移除对应元素的data-属(特)性,并且在将键值转换为一个属性的名称时会使用相反的转换;

// 判断有没有该属性
if(mydiv.dataset.myname){
    console.log(mydiv.dataset.myname);
}
mydiv.dataset.subtitle = "wangwei";  // 修改
mydiv.dataset.imgurl = "images/1.jpg";  // 添加
mydiv.dataset.userName = "wangwei";  // 添加,被转换为data-user-name
delete mydiv.dataset.subtitle;  // 删除
遍历DOMStringMap对象;
for(var k in mydiv.dataset){
    console.log(k + ":" + mydiv.dataset[k]);
}

与getAttribute()和setAttribute()相比:

在效率上,dataset没有上述两个方法高,但是,这个影响可以忽略不计;从操作上来看,虽然使用dataset不能提高代码的性能,但是对于简洁代码,提高代码的可读性和可维护性是很有帮助的,如:

<div class="user" data-id="123" data-user-name="wangwei" data-sex="男" data-date-of-birth="1998/8/8"></div>
<div class="user" data-id="124" data-user-name="jingjing" data-sex="女" data-date-of-birth></div>
<div class="user" data-id="125" data-user-name="juanjuan" data-sex="女" data-date-of-birth="1995/5/5"></div>
<script>
var users = document.querySelectorAll(".user");
// 使用getAttribute()和setAttribute()
for(var i=0,len=users.length; i<len; i++){
    var user = users[i];
    var id = user.getAttribute("data-id");
    var username = user.getAttribute("data-user-name");
    var sex = user.getAttribute("data-sex");
    if(!user.getAttribute("data-date-of-birth"))
        // user.setAttribute("data-date-of-birth","2020-1-1");
    var dateofbirth = user.getAttribute("data-date-of-birth");
    console.log("ID:" + id + ",username:" + username + ",sex:" + sex + ",dateofbirth:" + dateofbirth);
}
// 使用dataset
for(var i=0,len=users.length; i<len; i++){
    var user = users[i];
    var id = user.dataset.id;
    var username = user.dataset.userName;
    var sex = user.dataset.sex;
    if(!user.dataset.dateOfBirth)
        user.dataset.dateOfBirth = "2020/1/1";
    var dateofbirth = user.dataset.dateOfBirth;
    console.log("ID:" + id + ",username:" + username + ",sex:" + sex + ",dateofbirth:" + dateofbirth);
}
</script>

另外,dataset属性在IE中,只有IE11支持,所以在低版本的IE中,如果要使用dataset属性,必须做兼容性处理;

if(mydiv.dataset){
    console.log(mydiv.dataset.subtitle);
    console.log(mydiv.dataset.webDescription);
}else{
    console.log(mydiv.getAttribute("data-subtitle"));
    console.log(mydiv.getAttribute("data-web-description"));
}
// 封装一个函数
function getDataset(elt){
    if(elt.dataset)
        return elt.dataset;
    var attrs = elt.attributes,  // 元素的属性集合
        dataset = {},   // 包装的一个属性集对象
        name,   // 要获取的特性名
        matchStr;  // 匹配结果
    for(var i=0, len = attrs.length; i<len; i++){
        // 匹配data-自定义属性
        matchStr = attrs[i].name.match(/^data-(.+)/);
        if(matchStr){
            // 转成小驼峰
            name = matchStr[1].replace(/-([\da-z])/gi, function(all, letter){
                return letter.toUpperCase();
            });
            dataset[name] = attrs[i].value;
        }
    }
    return dataset;
}
var dataset = getDataset(mydiv);
console.log(dataset);

另外data-属性并不是只在Javascript中使用,在CSS中应用的场景也很多,如:

<style>
p[data-font-size='2em']{font-size: 2em;}
p[data-font-size='3em']{font-size: 3em;}
</style>
<p data-font-size="3em">零点程序员</p>
<p data-font-size="2em">王唯</p>
// 又如
<style>
#mydiv::after{background-color: rgba(0,0,0,.2); content: attr(data-content);}
</style>
<div id="mydiv" data-content="王唯是好人">大师哥</div>

dataset应用的场景还是非常多的,一般来说,为了给元素添加一些不可见的数据,并要进行后续的处理,就可以用到自定义数据属性;比如,配合CSS开发一些动画效果,或在跟踪链接等应用中,通过自定义数据属性能方便地知道点击来自页面中的哪个部分;

<a href="https://www.zeronetwork.cn" data-title="零点网络">零点网络</a>
<script>
window.onload = function(){
    var aElts = document.querySelectorAll("a");
    for(var i=0,len=aElts.length; i<len; i++){
        aElts[i].addEventListener("click",function(e){
            e.preventDefault();
            doDataset(this);
        },false);
    }
    var aDataset = [];
    function doDataset(elt){
      var o = {title:elt.dataset.title, href:elt.href, page:location.pathname};
        aDataset.push(o);
        console.log(aDataset);
    }
}
</script>
// 小示例
<style>
.banner{
    background:url("images/2.jpg") no-repeat center; background-size:cover;
}
.fadeInDown{opacity: 0; transform: translateY(20px);}
</style>
<div class="banner"> 
    <h2 class="fadeInDown" data-duration=".8" data-delay="400">零点程序员</h2>
    <h3 class="fadeInDown" data-duration="1" data-delay="800">大师哥王唯</h3>
    <p class="fadeInDown" data-duration="1" data-delay="1000"><a href="#">更多</a></p>
</div>
<script>
window.onload = function(){
    var elts = document.getElementsByClassName("fadeInDown");
    // for(var i=0,len=elts.length; i<len; i++){
    //  (function(){
    //      var elt = elts[i];
    //      var dataset = elt.dataset;
    //      setTimeout(function(){
    //          elt.style.opacity = 1;
    //          elt.style.transform = "translateY(-20px)";
    //          elt.style.transition = "all " + dataset.duration + "s linear";
    //      }, dataset.delay);
    //  })();
    // }
    Array.prototype.forEach.call(elts, function(v,k){
        console.log(v);
        var dataset = v.dataset;
        setTimeout(function(){
            v.style.opacity = 1;
            v.style.transform = "translateY(-10px)";
            v.style.transition = "all " + dataset.duration + "s linear";
        }, dataset.delay);
    });
}
</script>

Web前端开发之Javascript

、盒模型

我们在上篇文章<html5前端开发之基础篇>中已经对HTML有了基础的了解,都说‘盒模型’非常神奇,但是很多朋友始终不能掌握其原理。此事无碍,且看此图。

我们把这个盒子,类比成我们中秋节的时候包装月饼的月饼盒子。

其中两个月饼盒子之间的距离就是咱们要介绍的-->margin(外边距).

而咱们每个月饼都要有最外层的包装盒,

这个包装盒的厚度,就是咱们的--> border(边框).

那咱们的月饼不可能都是直接挨在一起的,对吧,

那每个月饼之间的间距,咱们就叫做--> padding(内边距).

那咱们介绍了月饼盒,咱们的月饼总应该有吧。

对的,咱们月饼的宽度就是 --> width.

高度就是 --> height.

而咱们的月饼就叫做 --> element(元素).

“那我们的盒模型的距离又该怎么去计算呢?”看下图

在 CSS 中,width 和 height 指的是内容区域的宽度和高度。

增加内边距、边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸。

假设框的每个边上有 10 个像素的外边距和 5 个像素的内边距。

如果希望这个元素框达到 100 个像素,就需要将内容的宽度设置为 70 像素。

二、div标签

上篇文章中我们学习了 HTML 的入门基础,接下来我们该来一起学学最常用的标签 div了。

什么是div呢?说白了,div 是一个块级元素,在实际HTML文档应用中一个块通常是以<div>开头,以</div>结束,<div>的出现也意味着它的内容自动地开始一个新行。此外,还可以对 <div> 元素应用 class 或 id 属性。可以对同一个 <div>元素应用 class 或 id 属性,但是更常见的情况是只应用其中一种。这两者的主要差异是,class 用于元素组(类似的元素,或者可以理解为某一类元素),而 id 用于标识单独的唯一的元素。

三、块元素(block)

块元素基本特征

块元素会独占一行,多个block元素会各自新起一行。默认情况下,block元素宽度自动填满其父元素宽度。

块元素可以设置width,height属性。块级元素即使设置了宽度,仍然是独占一行。

块元素可以设置margin和padding属性。

块元素支持所有的 CSS 样式

块元素基本可以划分以下几类:

div

无意义,主要是配合界面布局(双标签)

p

语义:段落(双标签)

h1~h6

定义一级标题至六级标题

注意

h1 权重非常高,一般一个页面只有一个H1

h2 权重非常高,一般一个页面不要超过10个,大型网站除外

h3 随便用

都是双标签

但是需要注意一点,假如使用 p 标签的时候,里面嵌套了 div 标签,这样会导致 p 标签里面的样式被分割掉,这点需要注意。

除此之外,块元素还包括有序列表 ol,无序列表 ul ,以及列表dl,dt,dd。

注:所有的标签全部有特定的样式,我们可以通过 CSS 去清掉所有的样式,建立属于自己的 reset.css 文件。

/*margin的样式初始化*/body,h1,h2,h3,h4,h5,h6,p,ol,ul { margin:0;

}/*padding的样式初始化*/ol,ul { padding:0;

}/*列表点点的样式初始化*/ul,ol { list-style: none;

}

四、内联元素(inline)

内联元素基本特征

inline元素不会独占一行,多个相邻的行内元素会排列在同一行里,直到一行排列不下,才会新换一行

内容撑开宽度

inline元素设置width,height属性无效。

inline元素不支持上下的margin和padding,只支持左右的margin和padding

代码换行被解析

内联元素中,有一个我们最常见的标签,那就是超链接 a 标签。它能从一个页面中跳转到另外一个界面,同时也可以在同一个页面之中设置空间‘锚点’,实现特定位置的跳转

注意:a 标签中一定不能嵌套 a 标签

a标签的锚点设置方法:

可以通过设置 href = “# + 锚点名称” 的方式进行跳转,注意,一定要加 #

例如:

<!DOCTYPE html><html lang="en"><head>

<meta charset="UTF-8">

<title>Document</title></head><body>

<span id=“top”></span>

<p>asdnajsd</p>

<br>

<br>

<br>

<br>

<br>

<br>

<br>

<a href=“#top”>回到顶部</a></body></html>

标签的初始化

下划线的样式初始化/*下划线的样式初始化*/a { text-decoration: none;

}/*字体样式初始化*/em { font-style:normal;

}

五、内联块元素

内联块元素基本特性

1.支持所有css的样式

2.除块属性的标签以外,同属性以及行属性标签排在一排

3.代码换行被解析

内联块元素同时具有了块元素可以设置宽度和高度的特点,同时又可以像内联元素一样,可以和其他行属性标签处于同一行。

虽然内联块元素能同时拥有块元素和内联元素的特性,但很多时候,在页面中还是要使用不同标签对应的特性。其次就是,内联块也并不是完美无缺的。因为设置内联块的时候,它的换行会被解析。

如下文所示:

从下图可以看见,img 的边上,并没有 margin,但是实际展示的时候,会存在一条白的间隙。

而当我们把两个 img 标签连在一起写的时候,就正常了,如第一个 img 和第二个 img。

具体解决方法会在下一篇文章中介绍

图片标签的初始化

img { border:none;

}

当然,你在网页中看到块元素,不一定就是块元素,他有可能已经是一个内联块元素了。

display 可以对它原本的特性进行一个修改,可以让原本是块属性的元素变成行属性元素,同时内联属性也同样可以转化为块属性。

本文链接:http://hn.lanou3g.com/lozx/2890.html