从0开始学习HTML5CSS3(一)

2019-02-21  本文已影响0人  xinhongwu

什么是h5c3

数字是版本号,指的是第几套标准。H5就是指HTML的第五套正式发布的标准,CSS3就是CSS标准的第三套

h5中新增的内容

1.新增的标签(布局标签)

新标签其实也是一个块级元素,不给样式是看不到的。所以可以理解为新标签也是一个div,它比div更有语义

新标签存在兼容问题,解决办法导入html5shiv.js就可以所有浏览器都支持,使用css hack按条件导入

<!--[if lte IE 8]>
        <script src="html5shiv.js"></script>
    <![endif]-->

2.h5的自定义属性写法

以前写自定义属性存在的问题:
1.一眼看过去,不太好区分什么是自带属性,什么是自定义属性
2.取值和赋值不方便,也无法一下子拿到所有自定义属性来遍历在H5里面又新增了关于自定义属性的一部分功能
在H5里建议,所有的自定义属性前面都要加一个data-
如果你加了data-,那么在JS里就可以通过元素.dataset来取到这些自定义属性
JS取值时是没必要加data-的它会自动去掉data-
注意:自定义属性后还可以加-,但是JS取值时不用加-,并把-后面的首字母大写,有几个-就去掉几个-,并把每个-后面的首字母大写

<body>
    <!-- 对于div而言,name也是自定义属性,name在表单元素里才是自带属性 -->
    <!-- <div id="box" shengao="175cm" tizhong="70kg" name="andy"></div> -->
    <div id="box" data-shengao="175cm" data-tizhong="70kg" data-name="andy" data-nick-user-name="小安"></div>
    <input type="text" name="">
</body>
</html>

<script>

    var box = document.getElementById('box');

    //以前获取自定义属性
    // console.log(box.getAttribute('shengao'));
    //以前设置自定义属性
    // box.setAttribute('shengao','186cm');

    // 我要获取所有的自定义属性并遍历
    
    // console.log(box.dataset);

    console.log( box.dataset.nickUserName );
    // console.log(box.dataset.shengao);
    // console.log(box.dataset.tizhong);
    // console.log(box.dataset['name']);

    //赋值
    // box.dataset.shengao = "185cm";

    // for(var key in box.dataset){

    //     console.log(box.dataset[key]);
        
    // }    
  
</script>

3.新增的表单元素

行内属性:required必填项,加上表示不能为空

<form action="">

     <!-- 既能显示日期又能显示时间的元素:格式:YYYY-MM-DDThh:mm -->
     <input type="datetime-local">
     <!-- 跟上面的区别在于:它只有日期,没有时间 -->
     <input type="date">
     <!-- 会出现一个弹出颜色选择的框 -->
     <input type="color">
     <!-- 专门用来输入邮箱的,外观跟文本框是一样的,区别在于:点击提交时会自动帮你验证内容格式是否为邮箱的格式 -->
     <!-- <input type="email" required> -->

     <!-- 专门用来输入网址的 -->
     <!-- <input type="url"> -->

     <!-- 滑块 -->
     <input type="range">

     <!-- 专门用来输入数字的 -->
     <input type="number">
    
     <!-- 搜索:在PC端跟普通文本框是一样的,区别只在移动端 -->
     <input type="search">
     
     <!-- 输入电话号码的,在PC端跟普通文本框是一样的,在移动端有效果:弹出键盘的时候弹出的数字键盘 -->
     <input type="tel">

     <input type="submit">

   </form>

4.classList

方便的获取所有的类, 以及操作类,classList是一个伪数组,里面有所有的类

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 
        classList:h5里面新增的一个api,可以获得一个元素的所有的类名,以及很方便的添加一个类,删除一个类等


        classList:是一个伪数组,可以获得所有的类,每个类就是数组中的一个元素,通过下标很方便的取出某个类
            方法:
                add: 添加一个类
                remove: 删除一个类
                toggle:切换一个类
                replace:替换一个类 参数1:被替换的类, 参数2:要替换的新的类
     -->

    <style>
        .box {
            width: 100px;
            height: 100px;
        }

        .red {
            background-color: #f00;
        }

        .border{
            border: 10px solid #000;
        }

        .blue{

            background-color: blue;
        }
    </style>
</head>

<body>
    <div class="box red"></div>

    <input type="button" value="获得所有类" id="btn1">
    <input type="button" value="添加边框" id="btn2">
    <input type="button" value="删除边框" id="btn3">

    <input type="button" value="切换边框" id="btn4">
    <input type="button" value="变成蓝色" id="btn5">


    <input type="button" value="添加多个类" id="btn6">
    <input type="button" value="判断是否有border这个类" id="btn7">




</body>

</html>

<script>
    // 找到div
    var box = document.querySelector('div');

    // 获得所有类的点击事件
    document.getElementById('btn1').onclick = function () {

        // console.log(box.className);
        console.log(box.classList[0]);
        console.log(box.classList[1]);
    }

    // 添加边框的点击事件
    document.getElementById('btn2').onclick = function () {

        // box.className = "box red border";

        // 以前加一个类,可以用+=,但是要记得加空格,不方便
        // box.className += " border";  // box.className = "box red" + " border"

        box.classList.add('border');
    }

    document.getElementById('btn3').onclick = function () {

        //不能这样删掉一个类,这样会得到NaN
        //box.className -= " border"; // box.className = box.className - " border";

        //因为它现在有多少个类,就要写多少个类,不能单独去删掉border
        // box.className = "box red";

        box.classList.remove('border');
    }

    document.getElementById('btn4').onclick = function () {

        //如果以前没有border这个类就加上,有这个类就移出掉
        box.classList.toggle('border');
    }


    document.getElementById('btn5').onclick = function () {

        //参数1:被替换的类
        //参数2:要替换的新的类
        box.classList.replace('red', 'blue');
    }


    document.getElementById('btn6').onclick = function () {

        // 下面这个是错的!这种链式编程的写法在jQuery里有,JS原生没有
        // box.classList.add('border').add('big');

        //下面这两句话可以
        // box.classList.add('border');
        // box.classList.add('big');

        // 下面这个也不可以,会报错!一个都加不上
        // box.classList.add('border big');

        // 下面这个也不可以!
        // box.classList.add('border,big');

        // 如果想一次性加好几个类,那么要加几个类就要有几个参数
        // 比如下面三个参数,就会加三个类
        box.classList.add('border', 'big', 'test');
    }

    document.getElementById('btn7').onclick = function () {

        console.log(box.classList.contains('border'));

    }
</script>

5 地理定位

<script>
//可以获取到当前的经纬度
    //会去服务器请求当前经纬度,如果获取到了,会自动调用你这个函数,并且把位置信息发送到这个形参里
    //谷歌服务器被墙了
    //电脑默认没有开定位,你要先把定位开了
    navigator.geolocation.getCurrentPosition(function(loc){

        console.log(loc);

        // 纬度
        console.log(loc.coords.latitude);
        // 经度
        console.log(loc.coords.longitude);
        
    });

</script>

6 localstorage

概念:本地存储,用来把数据存储在浏览器
应用场景: 需要长久保存一些数据时可以用localStorage,例:换网站皮肤、保存搜索历史记录

长久保存,只要自己不删就一直存在
按网站域名保存数据,不同网站之间不能访问彼此数据
只能存基本类型,如果要存复杂类型,需要先转成JSON再存

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 

        localStorage:可以把数据存储在浏览器,可以做一些数据的缓存,只要自己不删,数据一直存在
            如果要长久缓存数据,用localStorage,只要自己不写代码给服务器,那么都不会自动把数据发给服务器

            每个网站都有自己的本地存储,不同网站之间不能互相访问(网站是按域名区分的)

        cookie也可以把数据存在浏览器
            cookie特点:
                    1.有失效时间
                    2.每次访问网站都会自动把cookie发送给服务器

        方法:
            setItem:保存一个数据,参数1:键,参数2:值
            getItem:获取一个数据,根据键来获取
            removeItem:删除一个数据,根据键来删除
            clear:清空本网站的所有本地存储

        localStorage特点:
                1.没有有效期
                2.不会自动发给服务器
                3.它也只能存基本类型,如果直接存复杂类型,会调用复杂类型的toString方法,再来存储
                4.如果要存复杂类型,可以先把复杂类型转成JSON字符串,再来存储
    -->
</head>

<body>

    <input type="button" value="保存基本类型" id="btn1">
    <input type="button" value="获取基本类型" id="btn2">
    <input type="button" value="删除一个本地存储" id="btn3">
    <input type="button" value="清空本地存储" id="btn4">

    <input type="button" value="保存数组" id="btn5">
    <input type="button" value="保存对象" id="btn6">

    <input type="button" value="获取数组" id="btn7">
    <input type="button" value="获取对象" id="btn8">



</body>

</html>

<script>


    document.getElementById('btn1').onclick = function () {

        //保存一段数据到localStorage里
        //参数1:键
        //参数2:真正要保存的值
        localStorage.setItem('name', 'jack');
        localStorage.setItem('age', 321);
        localStorage.setItem('gender', true);
    }

    document.getElementById('btn2').onclick = function () {

        //只有一个参数:键
        var res = localStorage.getItem('name');
        console.log(res);
    }

    document.getElementById('btn3').onclick = function () {

        //删除一个数据,根据键来删
        localStorage.removeItem('age');
    }

    document.getElementById('btn4').onclick = function () {

        //清除(删掉本网站里所有的本地存储)
        localStorage.clear();
    }

    //保存数组
    document.getElementById('btn5').onclick = function () {

        var arr = [10, 20, 30, 40];
        // localStorage.setItem('arr', arr);
        //转成字符串
        // console.log(arr.toString());

        var json = JSON.stringify(arr);
        localStorage.setItem('arr', json);
    }

    //保存对象
    document.getElementById('btn6').onclick = function () {

        var obj = { name:"jack", age:16};

        // localStorage.setItem('obj', obj);
        // console.log(obj.toString());

        var json = JSON.stringify(obj);
        localStorage.setItem('obj',json);
        
    }

    //获取数组
    document.getElementById('btn7').onclick = function(){

        var res = localStorage.getItem('arr');
        // console.log(res);

        console.log(JSON.parse(res));
        
        
    }

    //获取对象
    document.getElementById('btn8').onclick = function(){

        var res = localStorage.getItem('obj');
        // console.log(res);
        console.log(JSON.parse(res));
    }
</script>

7 sessionStorage

也是把数据存储在浏览器,几乎跟localStorage都是一样的(包括用法),你可以把sessionStorage理解为是一个短命版的localStorage
关闭浏览器,数据就删除了。除了这个意外,其他都是跟localStorage是一样的
应用场景:在一些需要临时保存数据的地方就用sessionStorage,多个页面传值

    document.getElementById('btn1').onclick = function(){

        sessionStorage.setItem('name','jack');
        sessionStorage.setItem('age',16);
        sessionStorage.setItem('gender',true);
    }

    document.getElementById('btn2').onclick = function(){

        var res = sessionStorage.getItem('name');
        console.log(res);
        
    }

    document.getElementById('btn3').onclick = function(){

        sessionStorage.removeItem('name');
    }

    document.getElementById('btn4').onclick = function(){

        sessionStorage.clear();
    }
</script>

8 拖拽事件

网页里面的元素可以被拖拽
但是元素不是你想拖,想拖就能拖
强行拖:给元素加一个行内属性:draggable="true"
跟被拖拽元素有关的事件
ondragstart 拖拽开始事件
ondrag 拖拽中
ondragend 拖拽结束的事件

把元素拖拽到另一个容器
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>

  <!-- 

      之前学的事件是跟被拖拽元素有关的

      现在要学的事件跟容器元素(目标元素)有关的事件
          ondragenter:有元素拖进来
          ondragleave:有元素拖出去

          ondrop: 有元素在容器范围内松手触发
          ondragover:主要是为了让drop能够被触发,这个事件里只要做一件事:阻止事件默认行为


      在JS里所有的事件名都是小写,不遵从驼峰
  -->

  <style>
      .box{
          width: 100px;
          height: 100px;
          background-color: #f00;
      }

      .container{

          width: 350px;
          height: 500px;
          border: 1px solid #000;
          position: absolute;
          right:20px;
          top:20px;
      }
  </style>
</head>
<body>
  <div class="box" draggable="true"></div>
  <div class="container"></div>
</body>
</html>


<script>
  var box = document.querySelector('.box');
  var container = document.querySelector('.container');

  //给被拖拽元素加拖拽结束事件
  // box.ondragend = function(){
  //     //加到容器里
  //     container.appendChild(box);
  // }

  //有元素进入时触发
  container.ondragenter = function(){

      console.log('进来了');
      // container.appendChild(box);   
  }

  //有元素离开时触发
  container.ondragleave = function(){

      console.log('出去了');
      
  }


  // 当有元素在容器内松手时触发的事件
  // 如果你想ondrop事件能够被触发,还需要再写一个事件叫ondragover事件,并且在over事件里阻止事件的默认行为
  container.ondrop = function(){

      // console.log('drop');
      container.appendChild(box);
  }


  //下面这个事件主要是为了让drop能够被触发
  container.ondragover = function(e){

      //这个事件在检测是否有元素在我的范围内
      //只要有元素拖拽到我的范围内不断触发
      //这个事件默认有个行为:当检测到右元素在我范围内时,不断的阻止它放进来

      //默认情况下,任何元素都不允许有东西放置进来
      console.log('over');
      
      e = e || window.event;
      e.preventDefault();
  }
</script>
上一篇下一篇

猜你喜欢

热点阅读