<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          首頁

          前端基礎-HTML5新特性

          seo達人

          html5的新特點

          1.語法更簡單

          a) 頭部聲明


          <!doctype html>


          b) 簡化了字符集聲明


          <meta charset="utf-8">


          2.語法更寬松

          a) 可以省略結束符的標簽


          li、dt、dd、p、optgroup、option、tr、td、th


          b) 可以完全省略的標簽


          html、head、body


          3.標簽語義化

          增加了很多標簽,在作頁面的時候更加具有語義(定義了一些原本沒有語義的div模塊為有鮮明結構的語義模塊)


          a) <header>標記定義一個頁面或一個區域的頭部


          b) <nav>標記定義導航鏈接


          c) <article>標記定義一篇文章內容


          d) <section>標記定義網頁中一塊區域


          e) <aside>標記定義頁面內容部分的側邊欄


          f) <footer>標記定義一個頁面或一個區域的底部


          語義化標簽圖示


          4.表單新增常用屬性------要求掌握

          required:必填


          placeholder:輸入內容提示


          autofocus:自動獲取焦點-----自動幫我們將光標點進去


          <form method="post" action="http://www.baidu.com">

          <!-- required 必填,必須的 -->

          <!-- 自動獲取焦點----自動將光標定位到表單中 -->

          <input type="text" placeholder="請輸入用戶名" autofocus="autofocus" required="required" />

             <input type="submit" />

          </form>



          5.input新增type屬性值

          a) type=“email”,文本框中只能輸入email地址




          b) type=“date”,日期控件




          c) type=“time”




          d) type=“month”




          e) type=“week”




          f) type=“number”,喚醒數字鍵盤




          g) type=“range”,滑塊




          h) type=“color”



          H5之外部瀏覽器喚起微信分享

          seo達人

          最近在做一個手機站,要求點擊分享可以直接打開微信分享出去。而不是jiathis,share分享這種的點擊出來二維碼。在網上看了很多,都說APP能喚起微信,手機網頁實現不了。也找了很多都不能直接喚起微信。

          總結出來一個可以直接喚起微信的。適應手機qq瀏覽器和uc瀏覽器。

          下面上代碼,把這些直接放到要轉發的頁面里就可以了:

          html部分:

          
          
          1. <script src="mshare.js"></script>//引進mshare.js
          2. <button data-mshare="0">點擊彈出原生分享面板</button>
          3. <button data-mshare="1">點擊觸發朋友圈分享</button>
          4. <button data-mshare="2">點擊觸發發送給微信朋友</button>

          js部分:

          
          
          1. <script>
          2. var mshare = new mShare({
          3. title: 'Lorem ipsum dolor sit.',
          4. url: 'http://m.ly.com',
          5. desc: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat inventore minima voluptates.',
          6. img: 'http://placehold.it/150x150'
          7. });
          8. $('button').click(function () {
          9. // 1 ==> 朋友圈 2 ==> 朋友 0 ==> 直接彈出原生
          10. mshare.init(+$(this).data('mshare'));
          11. });
          12. </script>

          下面是mshare.js的代碼分享,把這些代碼新建一個js文件放進去,然后在頁面中引進就ok了。

          
          
          1. /**
          2. * 此插件主要作用是在UC和QQ兩個主流瀏覽器
          3. * 上面觸發微信分享到朋友圈或發送給朋友的功能
          4. */
          5. 'use strict';
          6. var UA = navigator.appVersion;
          7. /**
          8. * 是否是 UC 瀏覽器
          9. */
          10. var uc = UA.split('UCBrowser/').length > 1 ? 1 : 0;
          11. /**
          12. * 判斷 qq 瀏覽器
          13. * 然而qq瀏覽器分高低版本
          14. * 2 代表高版本
          15. * 1 代表低版本
          16. */
          17. var qq = UA.split('MQQBrowser/').length > 1 ? 2 : 0;
          18. /**
          19. * 是否是微信
          20. */
          21. var wx = /micromessenger/i.test(UA);
          22. /**
          23. * 瀏覽器版本
          24. */
          25. var qqVs = qq ? parseFloat(UA.split('MQQBrowser/')[1]) : 0;
          26. var ucVs = uc ? parseFloat(UA.split('UCBrowser/')[1]) : 0;
          27. /**
          28. * 獲取操作系統信息 iPhone(1) Android(2)
          29. */
          30. var os = (function () {
          31. var ua = navigator.userAgent;
          32. if (/iphone|ipod/i.test(ua)) {
          33. return 1;
          34. } else if (/android/i.test(ua)) {
          35. return 2;
          36. } else {
          37. return 0;
          38. }
          39. }());
          40. /**
          41. * qq瀏覽器下面 是否加載好了相應的api文件
          42. */
          43. var qqBridgeLoaded = false;
          44. // 進一步細化版本和平臺判斷
          45. if ((qq && qqVs < 5.4 && os == 1) || (qq && qqVs < 5.3 && os == 1)) {
          46. qq = 0;
          47. } else {
          48. if (qq && qqVs < 5.4 && os == 2) {
          49. qq = 1;
          50. } else {
          51. if (uc && ((ucVs < 10.2 && os == 1) || (ucVs < 9.7 && os == 2))) {
          52. uc = 0;
          53. }
          54. }
          55. }
          56. /**
          57. * qq瀏覽器下面 根據不同版本 加載對應的bridge
          58. * @method loadqqApi
          59. * @param {Function} cb 回調函數
          60. */
          61. function loadqqApi(cb) {
          62. // qq == 0
          63. if (!qq) {
          64. return cb && cb();
          65. }
          66. var script = document.createElement('script');
          67. script.src = (+qq === 1) ? '//3gimg.qq.com/html5/js/qb.js' : '//jsapi.qq.com/get?api=app.share';
          68. /**
          69. * 需要等加載過 qq 的 bridge 腳本之后
          70. * 再去初始化分享組件
          71. */
          72. script.onload = function () {
          73. cb && cb();
          74. };
          75. document.body.appendChild(script);
          76. }
          77. /**
          78. * UC瀏覽器分享
          79. * @method ucShare
          80. */
          81. function ucShare(config) {
          82. // ['title', 'content', 'url', 'platform', 'disablePlatform', 'source', 'htmlID']
          83. // 關于platform
          84. // ios: kWeixin || kWeixinFriend;
          85. // android: WechatFriends || WechatTimeline
          86. // uc 分享會直接使用截圖
          87. var platform = '';
          88. var shareInfo = null;
          89. // 指定了分享類型
          90. if (config.type) {
          91. if (os == 2) {
          92. platform = config.type == 1 ? 'WechatTimeline' : 'WechatFriends';
          93. } else if (os == 1) {
          94. platform = config.type == 1 ? 'kWeixinFriend' : 'kWeixin';
          95. }
          96. }
          97. shareInfo = [config.title, config.desc, config.url, platform, '', '', ''];
          98. // android
          99. if (window.ucweb) {
          100. ucweb.startRequest && ucweb.startRequest('shell.page_share', shareInfo);
          101. return;
          102. }
          103. if (window.ucbrowser) {
          104. ucbrowser.web_share && ucbrowser.web_share.apply(null, shareInfo);
          105. return;
          106. }
          107. }
          108. /**
          109. * qq 瀏覽器分享函數
          110. * @method qqShare
          111. */
          112. function qqShare(config) {
          113. var type = config.type;
          114. //微信好友 1, 微信朋友圈 8
          115. type = type ? ((type == 1) ? 8 : 1) : '';
          116. var share = function () {
          117. var shareInfo = {
          118. 'url': config.url,
          119. 'title': config.title,
          120. 'description': config.desc,
          121. 'img_url': config.img,
          122. 'img_title': config.title,
          123. 'to_app': type,
          124. 'cus_txt': ''
          125. };
          126. if (window.browser) {
          127. browser.app && browser.app.share(shareInfo);
          128. } else if (window.qb) {
          129. qb.share && qb.share(shareInfo);
          130. }
          131. };
          132. if (qqBridgeLoaded) {
          133. share();
          134. } else {
          135. loadqqApi(share);
          136. }
          137. }
          138. /**
          139. * 對外暴露的接口函數
          140. * @method mShare
          141. * @param {Object} config 配置對象
          142. */
          143. function mShare(config) {
          144. this.config = config;
          145. this.init = function (type) {
          146. if (typeof type != 'undefined') this.config.type = type;
          147. try {
          148. if (uc) {
          149. ucShare(this.config);
          150. } else if (qq && !wx) {
          151. qqShare(this.config);
          152. }
          153. } catch (e) {}
          154. }
          155. }
          156. // 預加載 qq bridge
          157. loadqqApi(function () {
          158. qqBridgeLoaded = true;
          159. });
          160. if (typeof module === 'object' && module.exports) {
          161. module.exports = mShare;
          162. } else {
          163. window.mShare = mShare;
          164. }

          好了,這樣就可以直接喚起微信進行分享啦

          jQuery超詳細總結

          前端達人

          jQuery超詳細總結

          文章目錄

          jQuery超詳細總結

          一 選擇器

          特殊選擇器

          二 篩選器

          用在 jQuery 選擇的元素后面

          都是方法,對選擇出來的元素進行二次篩選

          三 文本操作

          總結

          四 元素類名操作

          五 元素屬性操作

          在 H5 的標準下, 給了一個定義, 當你需要寫自定義屬性的時候,最好寫成 data-xxx="值",當大家看到 data-xxx 的時候, 就知道這是一個自定義屬性

          六 元素樣式操作

          七 綁定事件

          1. on()方法是專門用來綁定事件
          2. one() 方法是專門用來綁定一個只能執行一次的方法
          3. off() 方法是專門用來解綁一個元素的事件的
          4. trigger() 方法是專門用來觸發事件的方法
          5. hover()
          6. 常用事件

            八 節點操作
          7. 創建節點
          8. 插入節點
          9. 刪除節點
          10. 替換節點
          11. 克隆節點

            九 獲取元素尺寸

            尺寸: 元素的占地面積

            三套方法, 四種使用方式

            十 獲取元素位置
          12. offset()
          13. position()

            十一 獲取卷去的尺寸(頁面滾動條)

            scrollTop()

            scrollLeft()

            十二 jQuery中的函數

            ready() 事件

            each() 方法

            十三 jQuery中的動畫

            讓元素出現不同的移動, 改變

            標準動畫

            折疊動畫

            漸隱漸顯動畫

            綜合動畫

            停止動畫

            十四 jQuery發送ajax請求

            jQuery 里面幫我們封裝好了幾個方法

            專門用來發送 ajax 請求的

            jQuery 發送一個 GET 請求

            jQuery 發送一個 POST 請求

            jQuery 的 $.ajax 方法

            jQuery 的 ajax 全局鉤子函數

            十五 jQuery 發送一個 jsonp 請求

            十六 jQuery 的多庫并存機制

            十七 jQuery 的插件擴展機制

            十八 jQuery 的拷貝對象問題

            十九 jQuery 的插件

            jQuery 是一個前端庫,也是一個方法庫

            他里面封裝著一些列的方法供我們使用

            我們常用的一些方法它里面都有,我們可以直接拿來使用就行了

            jQuery 之所以好用,很多人愿意使用,是因為他的幾個優點太強大了

            優質的選擇器和篩選器

            好用的隱式迭代

            強大的鏈式編程

            因為這些東西的出現,很多時候我們要做的事情被 “一行代碼解決”

            接下來我們就來認識一下 jQuery

            一 選擇器

            $()

            css怎么獲取元素這里就怎么寫

            獲取的是一組元素,當里面是id時,這組元素只有一個內容

            特殊選擇器

            :first $('li:first') 獲取元素集合里的 第一個元素

            //  console.log($('li:first'))

            1

            :last $('li:last') 獲取元素集合里的 最后一個元素

            :eq() $('li:eq()')獲取元素集合里 索引為n 的那個元素,索引從0開始

            :odd $('li:odd') 獲取所有索引為 奇數 的元素

            :even $('li:even') 獲取所有索引為 偶數 的元素

            二 篩選器

            用在 jQuery 選擇的元素后面

            都是方法,對選擇出來的元素進行二次篩選

            first() 篩選 元素集合里面的 第一個元素

            //  console.log($('li').first())

            1

            last() 篩選 元素集合里面的 最后一個元素

            eq(n) 篩選元素集合里 索引為n 的那個元素

            next() 篩選出來 元素 的下一個 兄弟元素

            nextAll() 篩選出 元素后面的 所有 兄弟元素

            nextAll(選擇器) 篩選出元素后面的 所有兄弟元素 中符合選擇器的元素

            nextUntil(選擇器) 篩選出 元素后面的所有兄弟元素 直到 選中的元素為止 不包含選中的元素

            //  console.log($('span').nextUntil('.a10'))

            1

            prev() 篩選出來 元素 的上一個 兄弟元素

            prevAll() 篩選出 元素上面的 所有 兄弟元素 (元素集合中的元素 從上一個兄弟元素開始排序)

            prevAll(選擇器) 篩選出 元素上面的 所有兄弟元素 中符合選擇器的元素

            prevUntil(選擇器) 篩選出 元素上面的所有兄弟元素 直到 選中的元素為止 不包含選中的元素

            //  console.log($('span').prevUntil('.a10'))

            1

            parent() 篩選出元素的 父元素

            parents()篩選出元素的 所有祖先元素 直到html元素

            parents(選擇器)拿到 所有祖先元素中的符合選擇器的元素

            parentsUntil(選擇器)篩選出元素的 所有的祖先元素 直到某一個元素 不包含該元素

            //  console.log($('span').parents('body'))

            // console.log($('span').parentsUntil('html'))



            children() 篩選出元素的 所有子級元素



            children(選擇器) 篩選出元素 所有子級元素中的 符合選擇器的元素

            siblings() 篩選出所有的兄弟元素 不包含 自己



            siblings(選擇器) 篩選出所有的兄弟元素中的 符合選擇器的元素

            find(選擇器)



            篩選 一個元素后代中的 符合選擇器的元素

            在一個元素集合的每一個元素中 查找后代元素 符合選擇器的元素

            index() 獲取元素的索引位置



            索引位置是指 是該父元素下的第幾個元素 拿到的是 數字

            三 文本操作

            html() 一個讀寫的屬性

            html()不傳遞 參數的時候 就是獲取元素內部的超文本內容

            html(參數)傳遞 參數的時候 就是設置元素內部的超文本內容

            text() 一個讀寫的屬性

            text()不傳遞 參數的時候 就是獲取元素內部的超文本內容

            text(參數)傳遞 參數的時候 就是設置元素內部的超文本內容

            val() 一個讀寫的屬性 操作 input 標簽

            val()不傳遞參數的時候, 就是獲取標簽的 value 值

            val(參數)傳遞一個參數的時候, 就是設置標簽的 value 值

            總結

            獲取

            html() 只能獲取第一個元素的超文本內容

            text() 能獲取元素集合內所有元素的文本內容合

            val() 只能獲取第一個元素的 value 值

            設置

            html() 給元素集合內所有元素設置超文本內容

            text() 給元素集合內所有元素設置文本內容

            val() 給元素集合內所有元素設置 value 值

            四 元素類名操作

            addClass() 添加類名

            執行這個方法會給元素集合里面所有的元素添加上固定的類名

            如果有就不添加, 不存在這個類名時添加

            removeClass() 移除類名

            執行這個方法刪除 元素集合里面所有元素 的指定類名

            toggleClass()切換類名

            執行這個方法會給元素集合里面的所有元素切換類名

            本身存在這個類名, 刪除類名

            本身不存在這個類名, 添加類名

            hasClass() 判斷有沒有某一個類名

            返回的時一個布爾值, 表示這個類名是否存在

            五 元素屬性操作

            在 H5 的標準下, 給了一個定義, 當你需要寫自定義屬性的時候,最好寫成 data-xxx=“值”,當大家看到 data-xxx 的時候, 就知道這是一個自定義屬性

            attr() 和 removeAttr()



            attr: attribute 屬性

            attr()

            是一個讀寫的方法

            attr(要讀取的屬性名): 傳遞一個參數的時候是讀取

            attr(屬性名, 屬性值): 傳遞兩個參數的時候是設置

            removeAttr() 專門用來移除屬性的

            attr 這套方法的注意:

            所有的屬性都會顯示在標簽上(原生屬性和自定義屬性)

            不管你設置的是什么數據類型, 都會給你變成字符串

            removeAttr 刪除 attr 設置的屬性, 有多少刪除多少(針對自定義屬性)

            prop() 和 removeProp()



            prop: property 屬性

            prop()

            一個讀寫的方法

            prop(要讀取的屬性名): 傳遞一個參數的時候是讀取

            prop(屬性名, 屬性值): 傳遞兩個參數的時候是設置

            removeProp()專門用來移除屬性的

            prop 這套方法的注意:

            非原生屬性, 不會顯示在標簽上, 但是你可以獲取使用

            你存儲的是什么數據類型, 獲取的時候就是什么數據類型

            removeProp 刪除 prop 設置的屬性, 有多少刪除多少(針對自定義屬性)

            removeProp() 不能刪除原生屬性 id class style 等等

            data() 和 removeData()



            data: data 數據

            data()

            一個讀寫的方法

            data(要讀取的屬性名): 傳遞一個參數的時候是讀取

            data(屬性名, 屬性值): 傳遞兩個參數的時候是設置

            removeData() 專門用來刪除數據的

            data 這套方法的注意:

            和元素的原生屬性沒有關系, 可以設置 id, 但是和元素的 id 沒關系

            就是在元素身上給你開辟一個地方, 存儲一些數據

            你設置的是什么數據類型, 拿到的就是什么數據類型

            removeData 刪除 data 設置的屬性

            data() 方法也能讀取寫在標簽上的 H5 標準自定義屬性

            三個方法存儲內容

            attr 設置的自定義屬性存儲在標簽身上

            prop 設置的自定義屬性存儲在元素對象里面

            data 設置的自定義屬性存儲在元素對象里面單獨開辟的一個對象

            六 元素樣式操作

            css()

            一個讀寫的屬性

            不同操作需要 傳遞 不同的參數

            css('樣式名稱')

            css('width')

            獲取元素的樣式值, 不管是行內樣式還是非行內樣式都能獲取

            css('樣式名稱', '樣式的值')

            css('width', '200px')

            設置元素的樣式值, 元素集合能獲取多少個元素就置多少個元素

            設置的時候, 所有的單位都可以不寫, 默認添加 px為單位

            css(對象)

            css({ width: 100, 不寫單位默認是 px height: '200px', opacity: 0.5 })

            批量設置 css 樣式

            給元素集合里面的所有元素, 批量設置樣式

            七 綁定事件
          14. on()方法是專門用來綁定事件

            jQuery 里面通用的事件綁定方式

            不同操作 傳遞 不同參數

            on方法的各種參數描述

            on('事件類型', 事件處理函數)

            給元素集合內所有的元素綁定一個事件

            // 給 $('li') 獲取到的所有元素綁定一個點擊事件

                // $('li').on('click', function () {

                //   console.log('我被點擊了')

                // })



            on('事件類型', '事件委托', 事件處理函數)

            把 事件委托 位置的元素的事件 委托給了前面元素合

                // 給所有的 li 標簽設置事件委托, 委托給了 ul

                // $('ul').on('click', 'li', function () {

                //   console.log('我被點擊了, 事件委托')

                // })



            on('事件類型', 復雜數據類型, 事件處理函數)

            給每一個元素綁定一個事件, 復雜數據類型是發事件時候傳遞的參數

             //   每一個 li 點擊的時候, 都能得到中間那個對象

                //   就是事件對象了面

                // $('li').on('click', { name: 'Jack', age: 18 }, function (e) {

                //   console.log('我被點擊了, li')

                //   console.log(e)

                // })

            1

            2

            3

            4

            5

            6

            on('事件類型', '事件委托', 任意數據類型, 件處函數)

            做一個事件委托的形式, 第三個參數位置的數據

            是觸發事件的時候, 可以傳遞進去的數據

            on(對象)

            給一個元素綁定多個事件的方式 不能傳參數

             // $('ul').on({

                //   click: function () { console.log('點擊事件') },

                //   mouseover: function () { console.log('移入事件') },

                //   mouseout: function () { console.log('移出事件') }

                // })


          15. one() 方法是專門用來綁定一個只能執行一次的方法

            傳遞的參數個數和意義 于 on 方法一摸一樣

            綁定上的事件只能執行一次
          16. off() 方法是專門用來解綁一個元素的事件的

            使用方式

            off('事件類型') : 給該事件類型的所有事件處理函數解綁

            off('事件類型', 事件處理函數) : 解綁指定事件處理函數

            注意:on 和 one 綁定的事件它都能移除
          17. trigger() 方法是專門用來觸發事件的方法

            不通過點擊, 通過代碼把事件觸發了

            trigger('事件類型') : 把該元素的事件給觸發了
          18. hover()

            jQuery 里面唯一一個很特殊的事件函數

            表示一個鼠標懸停動作

            只有一個使用方式

            hover(鼠標移入的時候觸發, 鼠標移出的時候觸發)

             // hover 事件

                //   如果你只傳遞一個函數, 那么移入移出都觸發這一個函數

                $('ul')

                  .hover(

                    function () { console.log('鼠標移入') },

                    function () { console.log('鼠標移出') }

                  )


          19. 常用事件

            jQuery 把一些常用事件直接做成了函數



            click()

            mouseover()

            . . . . . .

            直接使用就可以了



            使用 click 舉一個例子



            click(事件處理函數)

            click(參數, 事件處理函數)

            參數: 觸發事件的時候傳遞到事件里面的數據

                // 常用事件

                // 給 ul 綁定了一個點擊事件

                // $('ul').click([1, 2, 3, 4, true], function (e) {

                //   console.log('你好 世界')

                //   console.log(e)

                // })

            1

            2

            3

            4

            5

            6

            八 節點操作
          20. 創建節點

            對應原生 js 里面的 createElement()

            $('html 格式的文本')

            // 創建一個 div 元素

                console.log($('<div>我是一個創建出來的節點</div>'))

            1

            2
          21. 插入節點

            對應原生 js 里面的 appendChild()

            內部插入

            放在頁面元素的子元素位置, 放在末尾

            頁面元素.append(要插入的元素)

            要插入的元素.appendTo(頁面元素)

            放在頁面元素的子元素位置, 放在最前

            頁面元素.prepend(要插入的元素)

            要插入的元素.prependTo(頁面元素)

            外部插入

            放在頁面元素的下一個兄弟元素位置

            頁面元素.after(要插入的元素)

            要插入的元素.insertAfter(頁面元素)

            放在頁面元素的上一個兄弟元素位置

            頁面元素.before(要插入的元素)

            要插入的元素.insertBefore(頁面元素)
          22. 刪除節點

            對應原生 js 里面的 removeChild()

            頁面元素.empty() -> 把自己變成空標簽,將所有子元素移除

            頁面元素.remove() -> 把自己移除

            沒有刪除某一個子節點的方法,因為 jQuery 的選擇器的強大,直接找到要刪除的節點, remove()
          23. 替換節點

            對應原生 js 里面的 replaceChild()

            頁面元素.replaceWith(替換元素)

            替換元素.replaceAll(頁面元素)
          24. 克隆節點

            對應原生 js 里面的 cloneNode()

            元素.clone()

            兩個參數的值為 true或false

            第一個參數: 自己的事件是否克隆

            第二個參數: 子節點的事件是否克隆

            如果第一個參數的值為false,那么第二個參數不起作用,沒有意義。

            不管你是否傳遞參數, 都會把所有后代元素都克隆下來

            元素 + 文本內容 + 屬性 + 行內樣式

            參數只決定是否克隆元素身上的事件

            九 獲取元素尺寸

            尺寸: 元素的占地面積

            width 和 height

            padding

            border

            margin

            三套方法, 四種使用方式

            這些方法都是不考慮盒模型的狀態(不管是什么型, 都是固定區域)

            width() 和 height()

            獲取元素的 內容 區域的尺寸

            innerWidth() 和 innerHeight()

            獲取元素的 內容 + padding 區域的尺寸

            outerWidth() 和 outerHeight()

            獲取元素的 內容 + padding + border 區域的尺寸

            outerWidth(true) 和 outerHeight(true)

            獲取元素的 內容 + padding + border + margin 區域的尺寸

            十 獲取元素位置
          25. offset()

            offset: 偏移量

            是一個讀寫的屬性

            讀取

            不傳遞參數就是讀取

            讀到的元素相對于頁面的位置關系

            返回值是一個對象 { left: xxx, top: xxx }

            書寫

            傳遞一個對象就是寫入 { left: xxx, top: xxx }

            注意: 絕對寫入

            不管你本身和頁面的尺寸是什么樣,寫多少就是多少
          26. position()

            postition: 定位

            只讀的方法

            讀取:

            元素相對于定位父級的位置關系

            得到的也是一個對象 { left: xxx, top: xxx }

            如果你寫的是 right 或者 bottom, 會自動計算成 left 和 top 值給你

            十一 獲取卷去的尺寸(頁面滾動條)

            scrollTop()

            原生 js 里面 document.documentElement.scrollTop

            讀寫的方法

            不傳遞參數的時候就是獲取卷去的高度

            傳遞一個參數就是設置卷去的高度

            scrollLeft()

            原生 js 里面 document.documentElement.scrollLeft

            讀寫的方法

            不傳遞參數的時候就是獲取卷去的寬度

            傳遞一個參數的時候就是設置卷去的寬度

            十二 jQuery中的函數

            ready() 事件

            類似于 window.onload 事件,但是有所不同

            window.onload 會在頁面所有資源加載行

            ready() 會在頁面 html 結構加載完畢后執行

            也叫做 jQuery 的入口函數

            有一個簡寫的形式 $(function () {})

            each() 方法

            類似于 forEach(), 遍歷數組的

            jQuery 的元素集合, 是一個 jQuery 數組, 不是一個數組, 不能使用 forEach()

            forEach語法: forEach(function (item, index) {})

            each語法:each(function (index, item) {})

            比較少用到, 因為 jQuery 隱式迭代 自動遍歷

            十三 jQuery中的動畫

            讓元素出現不同的移動, 改變

            transition -> 過渡動畫

            animation -> 幀動畫

            標準動畫

            show() 顯示元素

            語法: show(時間, 運動曲線, 運動結束的函數)

            hide() 隱藏元素

            語法: hide(時間, 運動曲線, 運動結束的函數)

            toggle() 改變元素顯示或隱藏(如果顯示就隱藏,如果隱藏就顯示)

            語法: toggle(時間, 運動曲線, 運動結束的函數)

            三個方法的參數都可以選填,不需要每個都填寫

            折疊動畫

            slideDown() 下滑顯示

            語法: slideDown(時間, 運動曲線, 運動結束的函數)

            slideUp() 上滑隱藏

            語法: slideUp(時間, 運動曲線, 運動結束的函數)

            slideToggle() 切換滑動和隱藏

            語法: slideToggle(時間, 運動曲線, 運動結束的函數)

            漸隱漸顯動畫

            實質是透明的opacity的變化

            fadeIn() 逐漸顯示

            fadeIn(時間, 運動曲線, 運動結束的函數)

            fadeOut() 逐漸消失

            fadeOut(時間, 運動曲線, 運動結束的函數)

            fadeToggle() 切換顯示和消失

            fadeToggle(時間, 運動曲線, 運動結束的函數)

            以上三個方法的參數,均有默認值

            fadeTo() 設置元素透明度變為你指定的數字

            fadeTo(時間, 你指定的透明度, 運動曲線, 運動結束的函數)

            綜合動畫

            animate()

            基本上大部分的 css 樣式都可以動畫

            transform 不行, 顏色不行

            語法: animate({}, 時間, 運動曲線, 運動結束的函數)

            { }里面就寫你要運動的 css 屬性,默認單位為px

            停止動畫

            讓當前的動畫結束

            因為 jQuery 的動畫你一直點擊,就會一直觸發。即使不再點擊讓事件發生,還是會把沒執行完的動畫執行完畢。

            你點擊 10 次, 他就會觸發 10 次, 直到 10 次全都完畢才結束

            stop()

            當這個函數觸發的時候, 就會讓運動立刻停下來

            你運動到哪一個位置了就停止在哪一個位置

            finish()

            當這個函數觸發的時候, 就會讓運動立刻停下來

            不管你運動到了哪一個位置, 瞬間到達運動完成位置

            十四 jQuery發送ajax請求

            jQuery 里面幫我們封裝好了幾個方法

            專門用來發送 ajax 請求的

            $.get() -> 專門用來發送 get 請求的

            $.post() -> 專門用來發送 post 請求的

            $.ajax() ->

            發送什么請求都可以(get, post, put, delete)

            并且還可以發送一個 jsonp 請求

            jQuery 發送一個 GET 請求

            語法: $.get(請求地址, 需要攜帶到后端的參數, 成功的回調函數, 期望后端返回的數據類型)

            請求地址: 你要請求的后端接口地址(必填)

            攜帶參數: 你需要給后端傳遞的參數

            可以是一個固定格式的字符串 ‘key=value&key=value’

            也可以是一個對象 { a: 100, b: 200 }

            成功回調: 當請求成功的時候會執行的函數

            期望數據類型: 就是你是不是需要 jQuery 幫你解析響應體

          前端基礎-HTML文字滾動

          seo達人

          1.文字滾動

          <html>

          <head>

          <title>我的第一個頁面</title>

          </head>

          <body>

          <marquee behavior="scroll" direction="up" height="30" style="overflow:hidden;" scrollamount="1" width="300" onMouseOver="stop()" onMouseOut="start()">

          雷電黃色預警!<br />

          大雨黃色預警!<br />

          </marquee>

          </body>

          </html>



          direction:方向



          up:上 down:下 left:左 right:右



          scrollamount:滾動速度-----------------scroll:滾動 amount:數值



          width:寬度 height:高度



          onmouseover:當鼠標移上去



          onmouseout:當鼠標離開



          stop():停止



          start():開始



          behavior:



          scroll 循環滾動



          alternate 來回滾動



          slide 滾動一次停止




          簡單的驗證跳轉

          seo達人

          一.有關于內置對象的作用域

          主要說明2個對象,request,session

          1、request 對象

          request 對象是 javax.servlet.httpServletRequest類型的對象。 該對象代表了客戶端的請求信息,主要用于接受通過HTTP協議傳送到服務器的數據。(包括頭信息、系統信息、請求方式以及請求參數等)。

          request只在2個頁面之間傳遞,每一次新的請求都會新建一個request對象,也就是說可能會request對象不一致導致空指針異常。

          2、session 對象

          session 對象是由服務器自動創建的與用戶請求相關的對象。服務器為每個用戶都生成一個session對象,用于保存該用戶的信息,跟蹤用戶的操作狀態。session對象內部使用Map類來保存數據,因此保存數據的格式為 “Key/value”。 session對象的value可以使復雜的對象類型,而不僅僅局限于字符串類型。

          session對象在整個會話只有一個,也就是說session對象的數據會一直保留直到主動進行數據更改。



          二.表單提交

          在index.jsp中使用form進行數據的提交,action的目標是check.jsp,method是post



          三.驗證跳轉

          當form提交信息后交給check.jsp驗證,使用getParameter來得到form的信息,并使用setAttribute保存。在check.jsp中判斷賬號密碼是否正確后,使用



          <jsp:forward page=".jsp"></jsp:forward>

          1

          進行跳轉,
          .jsp是想要跳轉的頁面路徑。



          四.詳細代碼

          index.jsp



          <%@ page language="java" import="java.util." pageEncoding="UTF-8"%>

          <%

          String path = request.getContextPath();

          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

          %>



          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

          <html>

            <head>

              <base href="<%=basePath%>">

              

              <title>登陸</title>

              

          <meta http-equiv="pragma" content="no-cache">

          <meta http-equiv="cache-control" content="no-cache">

          <meta http-equiv="expires" content="0">    

          <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

          <meta http-equiv="description" content="This is my page">

          <!--

          <link rel="stylesheet" type="text/css" href="styles.css">

          -->



            </head>

            

            <body>



             <form action="check.jsp" method="post">

          請輸入用戶名:

          <input type = "text" name = "username"><br/>

          請輸入密碼:

          <input type = "password" name = "passwd"><br/>

          <input type="submit" name="submit" value="登錄">

          </form>

           

            </body>

          </html>





          check.jsp



          <%@ page language="java" import="java.util.
          " pageEncoding="UTF-8"%>

          <%

          String path = request.getContextPath();

          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

          %>



          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

          <html>

            <head>

              <base href="<%=basePath%>">

              

              <title>驗證</title>

              

          <meta http-equiv="pragma" content="no-cache">

          <meta http-equiv="cache-control" content="no-cache">

          <meta http-equiv="expires" content="0">    

          <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

          <meta http-equiv="description" content="This is my page">

          <!--

          <link rel="stylesheet" type="text/css" href="styles.css">

          -->



            </head>

            

            <body>

             

          <%

            String username = (String)request.getParameter("username");

            String passwd = (String)request.getParameter("passwd");

            request.setAttribute("username", username);

            request.setAttribute("passwd", passwd);

           

            if(username.equals("admin")&&passwd.equals("123")){

          %>

          <jsp:forward page="succeed.jsp"></jsp:forward> 

          <%}else{ %>

          <jsp:forward page="failed.jsp"></jsp:forward> 

          <%} %>

            </body>

          </html>



          succeed.jsp



          <%@ page language="java" import="java.util." pageEncoding="UTF-8"%>

          <%

          String path = request.getContextPath();

          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

          %>



          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

          <html>

            <head>

              <base href="<%=basePath%>">

              

              <title>登陸成功</title>

              

          <meta http-equiv="pragma" content="no-cache">

          <meta http-equiv="cache-control" content="no-cache">

          <meta http-equiv="expires" content="0">    

          <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

          <meta http-equiv="description" content="This is my page">

          <!--

          <link rel="stylesheet" type="text/css" href="styles.css">

          -->



            </head>

            

          <body>

          <% 

          String username = (String)request.getAttribute("username");

          String passwd = (String)request.getAttribute("passwd");



          %>

          <%=username %>登陸成功



          </body>

          </html>



          failed.jsp



          <%@ page language="java" import="java.util.
          " pageEncoding="UTF-8"%>

          <%

          String path = request.getContextPath();

          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

          %>



          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

          <html>

            <head>

              <base href="<%=basePath%>">

              

              <title>登陸失敗</title>

              

          <meta http-equiv="pragma" content="no-cache">

          <meta http-equiv="cache-control" content="no-cache">

          <meta http-equiv="expires" content="0">    

          <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

          <meta http-equiv="description" content="This is my page">

          <!--

          <link rel="stylesheet" type="text/css" href="styles.css">

          -->



            </head>

          <body>

          <% 

          String username = (String)request.getAttribute("username");

          String passwd = (String)request.getAttribute("passwd");



          %>

          <%=username %>登陸失敗

          </body>

          </html>



          五.注意事項

          在jsp中使用form提交表單不能直接進行跳轉,否則操作不慎就容易出現空指針異常,建議交由單獨的跳轉頁面處理


          【HTML&&CSS】CSS解決高度塌陷問題&&實現簡單的導航效果

          seo達人

          下面這段代碼是實現簡單的導航效果:



          在這里插入代碼片<!DOCTYPE html>

          <html>

          <head>

          <meta charset="utf-8">

          <title></title>

          <style>

          *{

             margin:0px;

             padding:0px;

             list-style:none;

          }

          .nav{

          width:700px;

          margin:100px auto;



          }



          .nav ul li{

          float:left;

          margin-right:5px;

          }



          .nav ul li a{



          width:100px;

          height:30px;

          color:#fff;

          display:block;

          line-height:30px;

          margin-right:5px;

          text-decoration:none;

          background:red;

          text-align:center;



          }

          .clearfix:after {

          content: ".";

          display: block;

          height: 0;

          clear: both;

          visibility: hidden;

          }

          .nav ul li a:hover{

          background:yellow;

          color:blue;

          text-decoration:underline;

          }



          </style>

          </head>

          <body>

          <div class="nav">

          <ul class="clearfix">

          <li><a href="#">導航</a></li>

          <li><a href="#">導航</a></li>

          <li><a href="#">導航</a></li>

          <li><a href="#">導航</a></li>

          <li><a href="#">導航</a></li>

          </ul>

          </div>

          </body>

          </html>





          實現效果如圖:

          容易犯錯的地方:剛開始我把display:block;屬性寫在最前面,結果一直出不來,后來發現display屬性應該放在height和width屬性后面



          我還學到一個知識點:關于父元素塌陷問題:



          在文檔流中,父元素的高度默認是被子元素撐開的,也就是說父元素多高,子元素就多高



          但是為子元素設置浮動以后,子元素就會完全脫離文檔流,此時將會導致子元素無法撐起父元素的高度,導致父元素的高度塌陷



          由于父元素的高速塌陷了,則父元素下所有的元素都會向上移動,這樣會導致頁面布局混亂



            所以我們在開發中一定要避免出席那高度塌陷的問題,這時候我們可以將父元素的高度寫死,這樣可避免塌陷的問題出現,但是一當高度寫死,父元素的高度將不能自動適應子元素的高度,所以這種方式是不推薦使用的

          1

          解決的方案:

          根據W3C標準,在頁面中元素有一個隱含的屬性叫做Block Formatting Context



          方案一:*(設置zoom為1和overflow為hidden)

          當開啟元素的BFC后,元素會有以下特性:



          父元素的垂直外邊距不會和子元素重疊

          開啟BFC的元素不會被浮動元素所覆蓋

          開啟BFC的元素可以包含浮動的子元素

          那如何開啟元素的BFC呢?



          設置元素浮動

          設置元素的絕對定位

          設置元素為inline-block(但是設置inline-block可以解決問題,但是會導致寬度丟失,所以不推薦使用這種方式)

          將元素的overflow設置為一個非visible的值(推薦方式:將overflow:hidden這個是副作用最小的開啟BFC方式,所以可以這么說,以后若是再塌陷,就給父元素加上overflow:hidden屬性)

          但需要注意的是:



          在IE6以及以下的瀏覽器中并不支持BFC,所以使用這種方式并不能兼容IE6,在IE6中雖然沒有BFC,但有另一個隱藏屬性叫做hasLayout該屬性作用和和BFC類似。但在IE6瀏覽器可以通過開hasLayout來解決問題

          開啟方式很多,我們可以直接用一種副作用最小的直接將元素的zoom設置為1,比如父元素是box1,我們可以在父元素中加上zoom:1;



          在這里解釋一下zoom表示放大的意思,后邊跟著一個數值,寫幾就可以將元素放大幾倍,所以zoom:1表示不放大元素,但是可以通過該樣式可以開啟hasLayout.

          但需要注意的是zoom屬性放IE6可以,別的瀏覽器比如Chrome就不行



          ****所以重頭戲來了:若我們想要兼容所有瀏覽器?


          1. 設置:zoom:1;
          2. 設置overflow:hidden;



            兩者缺一不可(zoom這個樣式,只在IE中支持)

            1

            方案二:(添加一個空白的div,參考下面的box3)

            我們可以直接在高度塌陷的父元素的最后,添加一個空白的div,由于這個div并沒有浮動,所以它是可以撐開父元素高度的,然后再對其清除浮動,這樣可以通過這個空白的div撐開父元素的高度,基本沒有副作用

            例如:

            *



            <style>

             .box1{border:1px solid red;}

             .box2{

             width:100px;

             hejght:100px;

             background-color:blue;

             }

             .box3{clesr:both;}/
            清除兩端浮動對當前元素的影響/

             

            body里面是:

            <div class="box1">

                <div class="box2"></div>

                     <div class="box3"></div>

              </div>

              (這里面box3是我們自己添加用來解決高度塌陷問題的)



            但使用這種方法雖然可以解決問題,但會在頁面中產生多余的結構,所以此時方法三就出來了,這種方法我們最推薦,因為他沒有副作用



            方法三:(通過after偽類)

            我們先來看一段代碼:



            <style>

            .clearfix:after{

                               content:" ";/
            添加一個內容*/

                               display:block;

                               clear:both;

                               

            }

            </style>

            <body>

            <div class="box1 clearfix">

            <div class="box2"></div>

            </div>

            </body>



            我來總結一下方法三:

            我們可以通過after偽類向元素的最后添加一個空的塊元素,然后對其清楚浮動,這樣做和添加一個div原理一樣,可以達到一個相同的效果,而且不會在頁面中添加多余的div,這是我們最推薦使用的方式,幾乎沒有任何副作用




          uniapp中的一個完全相似Vue-router的路由插件

          seo達人



          1.引入

          三種引用方式

          第一種 npm安裝

          項目根目錄命令行執行



          npm install uni-simple-router

          1

          第二種 插件市場(使用HBuilderX導入插件)



          第三種 ZIP下載 解壓



          2.項目中引入



          import Vue from 'vue'

          import {RouterMount} from 'uni-simple-router';

          import Router from './router'

          Vue.use(Router)

          //...后續代碼



          引入之后就開始我們的正式使用。

          第一步先在項目的根目錄下創建一個router文件夾。

          格式為:



          router

          |---modules

          |---index.js

          |---index.js



          router中的modules文件夾是用來放路由表模板的。modules中的index.js內容為



          const files = require.context('.', false, /.js$/)

          const modules = []



          files.keys().forEach(key => {

            if (key === './index.js') return

            const item = files(key).default

            modules.push(...item)

          })



          export default modules



          這個文件用來把同目錄下的js文件讀取并整合所有路由。

          在這里創建的js文件代碼示例:



          const home = [

          {

                  //注意:path必須跟pages.json中的地址對應,最前面別忘了加'/'哦

                path: '/pages/home/index',

                aliasPath:'/',  //對于h5端你必須在首頁加上aliasPath并設置為/

                name: 'index',

                  meta: {

                  title: '首頁',

              },

              },

              {

              path: '/pages/home/list',

                  name: 'list',

                  meta: {

                  title: '列表',

              },

          },

          ]

          export default home



          第二步配置router下的index.js



          import modules from './modules'

          import Vue from 'vue'

          //這里僅示范npm安裝方式的引入,其它方式引入請看最上面【安裝】部分

          import Router from 'uni-simple-router'



          Vue.use(Router)

          //初始化

          const router = new Router({

              routes: [...modules]//路由表

          });



          //全局路由前置守衛

          router.beforeEach((to, from, next) => {

            next()

          })

          // 全局路由后置守衛

          router.afterEach((to, from) => {

          })

          export default router;



          第三步 就是配置main.js



          import Vue from 'vue'

          import App from './App'

          import router from './router'

          import { RouterMount } from 'uni-simple-router'



          App.mpType = 'app'



          const app = new Vue({

          ...App

          })

          //v1.3.5起 H5端 你應該去除原有的app.$mount();使用路由自帶的渲染方式

          // #ifdef H5

          RouterMount(app,'#app');

          // #endif



          // #ifndef H5

          app.$mount(); //為了兼容小程序及app端必須這樣寫才有效果

          // #endif



          這樣你的路由就配置好了。



          如果不想繁瑣的配置modules下的文件,可以用webpack自動構建路由表

          安裝



          npm install uni-read-pages

          1

          配置 vue.config.js (可能需要手動創建)



          const TransformPages = require('uni-read-pages')

          const tfPages = new TransformPages({

          //如果你需要獲取更多參數,那么請配置參數!

          includes:['path','name','meta']

          })

          module.exports = {

              configureWebpack: {

                  plugins: [

                      new tfPages.webpack.DefinePlugin({

                          ROUTES: JSON.stringify(tfPages.routes)

                      })

                  ]

              }

          }



          然后去pages.json里面更改配置,加入所需要的內容

          最后配置路由表



          import Vue from 'vue'

          //這里僅示范npm安裝方式的引入,其它方式引入請看最上面【安裝】部分

          import Router from 'uni-simple-router'



          Vue.use(Router)

          //初始化

          const router = new Router({

              routes:ROUTES //路由表

          });



          //全局路由前置守衛

          router.beforeEach((to, from, next) => {

            next()

          })

          // 全局路由后置守衛

          router.afterEach((to, from) => {

          })

          export default router;




          Echarts餅圖之數據展示

          seo達人

          Echarts餅圖之數據展示

          1、組件簡介

          ECharts,一個使用 JavaScript 實現的開源可視化庫,可以流暢的運行在 PC 和移動設備上,兼容當前絕大部分瀏覽器(IE8/9/10/11,Chrome,Firefox,Safari等),底層依賴矢量圖形庫 ZRender,提供直觀,交互豐富,可高度個性化定制的數據可視化圖表。


          官網鏈接:Echarts官網

          W3C教程:W3C–Echarts教程


          2、前端代碼實現

          首先,下載庫,并引入到項目文件;


          話不多說,直接上代碼。


          /* 封裝的組件 HTML代碼

          <div class="echart-wrap-box">

             <div class="echart-content"></div>

          </div>

          */

          let echarts = require("echarts/echarts.min");


          defaults: {

            option: {

                echartsObj: {},

                tooltip: {//提示框浮層內容。

                    trigger: 'item',//數據項圖形觸發,主要在散點圖,餅圖等無類目軸的圖表中使用。

                    formatter: " : {c}萬人"http://提示框浮層內容格式器,{a}(系列名稱),(數據項名稱),{c}(數值), vf55rzz(百分比)

                },

                //如果系列沒有設置顏色,則會依次循環從默認列表中取顏色作為系列顏色。

                color: ["#369DFD", "#32C8CA", "#49C872", "#F6CE36", "#EE607A", "#935CE3", "#3436C7", "#3E4D86"],

                legend: {//圖例組件。

                    orient: 'vertical',//圖例列表的布局朝向:垂直的

                    x: '80%',//圖例組件離容器左側的距離。

                    y: '60%',//圖例組件離容器上側的距離。

                    // width: 100,

                    textStyle: {},//圖例文字的樣式

                    // left: 'right',//圖例組件離容器左側的距離。

                    top: 'center',//圖例組件離容器上側的距離。

                    data: [],//右側圖例小組件信息數據

                },

                series: [{//餅圖信息

                    name: '',

                    type: 'pie',//餅狀圖

                    radius: 140,//餅圖的半徑。

                    center: ['50%', '50%'],

                    minAngle: 5,  //最小的扇區角度(0 ~ 360),用于防止某個值過小導致扇區太小影響交互

                    label: {//展示文本設置

                        normal: {

                            show: true,

                            formatter: " : {c}萬人",//視覺引導線內容格式器,{a}(系列名稱),(數據項名稱),{c}(數值), vpj5l5n(百分比)

                        },

                        emphasis: {    //文本樣式

                            show: true,    //展示

                            textStyle: {    //文本樣式

                                fontSize: '16',

                                fontWeight: '600',

                            }

                        }

                    },

                    labelLine: {//視覺引導線設置

                        normal: {

                            show: true

                        }

                    },

                    data: [],//餅狀圖信息數據,value(數量)和 name為默認數據;

                    itemStyle: {

                        emphasis: {

                            shadowBlur: 10,

                            shadowOffsetX: 0,

                            shadowColor: 'rgba(0, 0, 0, 0.5)'

                        }

                    }

                }],

            },

            onInit(event) {

                vm = event.vmodel;            

                let data;//假設這里通過ajax獲取到了需要展示的數據;

                if (data.length == 0) {

                    return

                }

                data = data.sort((a, b) => { return b.number - a.number });//數據根據數量number從大到小排序


                if (data.length > 7) {//從大到小的第八個新增粉絲數量的年份 開始統一歸為 其他年份新增粉絲數量

                    let arr = data.slice(7);

                    let num = 0, rate = 0;

                    for (let i = 0; i < arr.length; i++) {//第七個之后累數量和比率

                        num += Number(arr[i].number);

                        rate += Number(arr[i].rate);

                    };

                    let objOtherYear = {

                        value: num,

                        name: '其他年份__nana新增粉絲數量',

                        rate: rate

                    };

                    let arr2 = data.slice(0, 7);

                    arr2.push(objOtherYear);

                    data = arr2;

                    data = data.sort((a, b) => { return b.number - a.number });//數據根據數量number從大到小排序

                }


                this.option.series[0].data = [];

                this.option.legend.data = [];

                for (let i = 0; i < data.length; i++) {

                    let seriesData = {

                        value: 0,

                        name: '',

                        rate: ''

                    };

                    seriesData.value = data[i].number;

                    seriesData.name = data[i].year;

                    seriesData.rate = data[i].rate;

                    this.option.series[0].data.push(seriesData);//給餅圖賦值數據


                    let legendData = {

                        name: '',

                        icon: 'circle',//強制設置圖形為:圓形

                        textStyle: {

                            color: '#000'

                        }

                    }

                    legendData.name = data[i].year;

                    this.option.legend.data.push(legendData);//給圖例組件賦值數據

                }

            },

            callFun: avalon.noop,//點擊餅狀圖后的回調

            isClickEchartsOUt: avalon.noop,//是否為餅圖外的點擊,父組件進行判斷后傳過來

            onReady(event) {

                this.echartsObj = echarts.init(event.target.children[0]);//初始化

                this.echartsObj.setOption(this.option);


                $(window).resize(() => {

                    this.echartsObj.resize();

                });


                let dataIndex;//保存選中扇區的序號

                let _this = this;


                this.$watch('isClickEchartsOUt', () => {

                    if (this.isClickEchartsOUt) {//如果不是餅狀圖扇區的點擊,則取消選中;

                        _this.echartsObj.dispatchAction({

                            type: 'pieUnSelect',//取消選中指定的餅圖扇形。

                            // 可選,系列 index,可以是一個數組指定多個系列

                            seriesIndex: 0,

                            // 可選,數據的 index

                            dataIndex: dataIndex,

                        })

                    }

                });


                // 處理點擊餅圖內部的事件

                this.echartsObj.on('click', function (params) {


                    if (params.dataIndex != dataIndex) {//如果不是前一次選中的扇區,則取消選中

                        _this.echartsObj.dispatchAction({

                            type: 'pieUnSelect',//取消選中指定的餅圖扇形。

                            // 可選,系列 index,可以是一個數組指定多個系列

                            seriesIndex: 0,

                            // 可選,數據的 index

                            dataIndex: dataIndex,

                        })

                    }


                    dataIndex = params.dataIndex;


                    _this.echartsObj.dispatchAction({

                        type: 'pieSelect',//選中指定的餅圖扇形。

                        // 可選,系列 index,可以是一個數組指定多個系列

                        seriesIndex: 0,

                        // 數據的 index,如果不指定也可以通過 name 屬性根據名稱指定數據

                        dataIndex: dataIndex,

                    })


                    vm.callFun(params);//回調,傳點擊獲取到的數據給父組件

                });

            },

            onDispose() {}

          }


          純CSS實現“文本溢出截斷省略”的幾種方法

          seo達人

          在我們的日常開發工作中,文本溢出截斷省略是很常見的一種需考慮的業務場景細節??瓷先?“稀松平常” ,但在實現上卻有不同的區分,是單行截斷還是多行截斷?多行的截斷判斷是基于行數還是基于高度?這些問題之下,都有哪些實現方案?他們之間的差異性和場景適應性又是如何?



          一般來說,在做這樣文字截斷效果時我們更多是希望:



          兼容性好,對各大主流瀏覽器有好的支持

          響應式截斷,根據不同寬度做出調整

          文本超出范圍才顯示省略號,否則不顯示省略號

          省略號位置顯示剛好

          基于上述的準則,下面我們通過編碼實踐,給出一些答案。



          單行文本溢出省略

          核心 CSS 語句



          overflow: hidden;(文字長度超出限定寬度,則隱藏超出的內容)

          white-space: nowrap;(設置文字在一行顯示,不能換行)

          text-overflow: ellipsis;(規定當文本溢出時,顯示省略符號來代表被修剪的文本)

          優點



          兼容性好,對各大主流瀏覽器有好的支持

          響應式截斷,根據不同寬度做出調整

          文本溢出范圍才顯示省略號,否則不顯示省略號

          省略號位置顯示剛好

          短板



          只支持單行文本截斷,并不支持多行

          適用場景



          適用于單行文本溢出顯示省略號的情況

          Demo



          <div class="demo">

                床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光

          </div>



          .demo {

            white-space: nowrap;

            overflow: hidden;

            text-overflow: ellipsis;

          }







          多行文本溢出省略(-webkit-line-clamp)

          核心 CSS 語句



          overflow: hidden;(文本溢出限定的寬度就隱藏內容)

          -webkit-line-clamp: 2;(用來限制在一個塊元素顯示的文本的行數, 2 表示最多顯示 2 行。 為了實現該效果,它需要組合其他的WebKit屬性)

          display: -webkit-box;(和 -webkit-line-clamp: 2;結合使用,將對象作為彈性伸縮盒子模型顯示 )

          -webkit-box-orient: vertical;(和 -webkit-line-clamp: 2;結合使用 ,設置或檢索伸縮盒對象的子元素的排列方式 )

          text-overflow: ellipsis;(多行文本的情況下,用省略號“…”隱藏溢出范圍的文本)

          優點



          響應式截斷,根據不同寬度做出調整

          文本溢出范圍才顯示省略號,否則不顯示省略號

          瀏覽器原生實現,所以省略號位置顯示剛好

          短板



          兼容性一般: -webkit-line-clamp 屬性只有 WebKit 內核的瀏覽器才支持





          適用場景



          多適用于移動端頁面,因為移動設備瀏覽器更多是基于 WebKit 內核

          Demo



          <div class="demo">

                床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光

          </div>



          .demo {

            display: -webkit-box;

            overflow: hidden;

            -webkit-line-clamp: 2;

            -webkit-box-orient: vertical;

          }









          多行文本溢出省略(偽元素 + 定位)

          核心 CSS 語句



          position: relative; (為偽元素絕對定位)

          overflow: hidden; (文本溢出限定的寬度就隱藏內容)

          position: absolute;(給省略號絕對定位)

          line-height: 18px; (結合元素高度,高度固定的情況下,設定行高, 控制顯示行數)

          height: 36px; (設定當前元素高度)

          ::after {} (設置省略號樣式)

          word-break: break-all; (如果文本中有英文,可以使一個單詞能夠在換行時進行拆分)

          優點



          兼容性好,對各大主流瀏覽器有好的支持

          響應式截斷,根據不同寬度做出調整

          短板



          無法識別文字的長短,無論文本是否溢出范圍,一直顯示省略號

          省略號顯示可能不會剛剛好,有時會遮住一半文字,跟文字沒有貼合的很緊密

          適用場景



          文字內容較多,確定文字內容一定會超過容器的

          Demo



          <div class="demo">

                床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光

          </div>

          1

          2

          3

          .demo {

              position: relative;

              line-height: 18px;

              height: 36px;

              overflow: hidden;

              word-break: break-all;

          }

          .demo::after {

              content:"...";

              font-weight:bold;

              position:absolute;

              bottom:0;

              right:0;

              padding:0 20px 1px 45px;

              

              / 為了展示效果更好 /

              background: -webkit-gradient(linear, left top, right top, from(rgba(255, 255, 255, 0)), to(white), color-stop(50%, white));

              background: -moz-linear-gradient(to right, rgba(255, 255, 255, 0), white 50%, white);

              background: -o-linear-gradient(to right, rgba(255, 255, 255, 0), white 50%, white);

              background: -ms-linear-gradient(to right, rgba(255, 255, 255, 0), white 50%, white);

              background: linear-gradient(to right, rgba(255, 255, 255, 0), white 50%, white);

          }



          多行文本溢出省略(Float)

          核心 CSS 語句



          line-height: 20px;(結合元素高度,高度固定的情況下,設定行高, 控制顯示行數)

          overflow: hidden;(文本溢出限定的寬度就隱藏內容)

          float: right/left;(利用元素浮動的特性實現)

          position: relative;(根據自身位置移動省略號位置, 實現文本溢出顯示省略號效果)

          word-break: break-all;(如果文本中有英文,可以使一個單詞能夠在換行時進行拆分)

          優點



          兼容性好,對各大主流瀏覽器有好的支持

          響應式截斷,根據不同寬度做出調整

          文本溢出范圍才顯示省略號,否則不顯示省略號

          短板



          省略號顯示可能不會剛剛好,有時會遮住一半文字,跟文字沒有貼合的很緊密

          適用場景



          文字內容較多,確定文字內容一定會超過容器的

          Demo



          <div class="demo">

                <div class="text">

                  床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光床前明月光

                </div>

          </div>



          .demo {

            height: 40px;

            line-height: 20px;

            overflow: hidden;

          }

          .demo .text {

            float: right;

            margin-left: -5px;

            width: 100%;

            word-break: break-all;

          }

          .demo::before {

            float: left;

            width: 5px;

            content: "";

            height: 40px;

          }

          .demo::after {

            float: right;

            content: "...";

            height: 20px;

            line-height: 20px;

            padding-right: 5px;

            text-align: right;

            width: 3em;

            margin-left: -3em;

            position: relative;

            left: 100%;

            top: -20px;

            padding-right: 5px;

              

            / 為了展示效果更好 /

            background: -webkit-gradient(

              linear,

              left top,

              right top,

              from(rgba(255, 255, 255, 0)),

              to(white),

              color-stop(50%, white)

            );

            background: -moz-linear-gradient(

              to right,

              rgba(255, 255, 255, 0),

              white 50%,

              white

            );

            background: -o-linear-gradient(

              to right,

              rgba(255, 255, 255, 0),

              white 50%,

              white

            );

            background: -ms-linear-gradient(

              to right,

              rgba(255, 255, 255, 0),

              white 50%,

              white

            );

            background: linear-gradient(

              to right,

              rgba(255, 255, 255, 0),

              white 50%,

              white

            );

          }


          利用鍵盤控制小方塊的移動

          前端達人

          原理

          1. 利用鍵盤控制移動,則需要了解onkeydown函數,表示某個按鍵被按下,可以以此綁定一個事件響應函數,當鍵盤被按下時候,觸發此事件,進行移動
          2. keyCode 對于keypress 事件,該屬性聲明了被敲擊的鍵生成的 Unicode 字符碼。對于 keydown 和 keyup 事件,它指定了被敲擊的鍵的虛擬鍵盤碼。虛擬鍵盤碼可能和使用的鍵盤的布局相關。 因此我們可以根據keycode返回的字符碼來判斷用戶所按下的鍵,下面就是一個用于測試上下左右按鍵的js代碼,經過我的測試之后,返回37 38 39 40;

            window.onload = function(){
                        var box = document.getElementById("box");
                        document.onkeydown = function(event){
                            event = event || window.event;
                            console.log(event.keyCode);
                        }           
                    };
            3



            3.方塊的移動實際上就是坐標的改變,因此需要offsetLeft 和offsetTop 來獲得當前方塊的坐標,然后將坐標進行一定的更改,就可以實現移動的效果了,下面給出代碼

            window.onload = function() {
                        document.onkeydown = function(event) {
                            event = event || window.event;
                            //設置移動速度
                            var speed = 10;
                            //當ctrl和方向按鍵同時按下時,提升移動速度
                            if(event.ctrlKey) {
                                speed = 50;
                            }
                            //獲取div
                            var box01 = document.getElementById("box01");
                            switch(event.keyCode) {
                                /*keyCode返回按下按鍵的編碼
                                 * 37 向左
                                 * 38向上
                                 * 39向右
                                 * 40向下
                                 */
                                case 37:
                                    box01.style.left = box01.offsetLeft - speed + "px";
                                    break;
                                case 39:
                                    box01.style.left = box01.offsetLeft + speed + "px";
                                    break;
                                case 38:
                                    box01.style.top = box01.offsetTop - speed + "px";
                                    break;
                                case 40:
                                    box01.style.top = box01.offsetTop + speed + "px";
                                    break;
            
                            }
                        };
            
                    };
            



            這樣就可以簡單實現方塊的移動,但是此時我們會發現一個問題,當我們進行移動的時候,按住按鍵不松手,理論上方塊應該直接平滑的進行移動,但實際上并非如此,第一下它會有一個小的停頓,這實際上是瀏覽器防止誤觸所設置的,因此我們需要對此進行優化
            解決方案

            這里我采用了定時器的做法來解決這個問題,因為控制移動的因素有兩個,一個是控制方向,一個是控制速度,控制方向沒有問題,因此我們需要改變速度
            setInterval(function(){},time);這是一個定時器,我們只需要在time時間內調用一次函數,就可以解決停頓的問題了
            下面附上修改后的完整代碼


            <!DOCTYPE html>
            <html>
            
            <head>
                <meta charset="UTF-8">
                <title></title>
                <style type="text/css">
                    #box01 {
                        width: 100px;
                        height: 100px;
                        background-color: #008000;
                        position: absolute;
                    }
                </style>
                <script type="text/javascript">
                    window.onload = function() {
            
                        //獲取div
                        var box01 = document.getElementById("box01");
                        //設置移動速度
                        var speed = 10;
                        //設置移動的方向
                        var dir = 0;
            
                        setInterval(function() {
                            switch(dir) {
                                /*keyCode返回按下按鍵的編碼
                                 * 37 向左
                                 * 38向上
                                 * 39向右
                                 * 40向下
                                 */
                                case 37:
                                    box01.style.left = box01.offsetLeft - speed + "px";
                                    break;
                                case 39:
                                    box01.style.left = box01.offsetLeft + speed + "px";
                                    break;
                                case 38:
                                    box01.style.top = box01.offsetTop - speed + "px";
                                    break;
                                case 40:
                                    box01.style.top = box01.offsetTop + speed + "px";
                                    break;
            
                            }
            
                        }, 50)
            
                        document.onkeydown = function(event) {
                            event = event || window.event;
            
                            //當ctrl和方向按鍵同時按下時,提升移動速度
                            if(event.ctrlKey) {
                                speed = 50;
                            } else {
                                speed = 10;
                            }
                            //使dir等于keycode的值
                            dir = event.keyCode;
            
                            //當鼠標松開時,停止移動         ---如果不寫這一個會造成無法停止移動的效果
                            document.onkeyup = function() {
                                dir = 0;
                            };
            
                        };
            
                    };
                </script>
            </head>
            
            <body>
                <div id="box01"></div>
            </body>
            

          </html>

          ————————————————

          版權聲明:本文為CSDN博主「loving-cat」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。

          原文鏈接:https://blog.csdn.net/weixin_42878211/article/details/104558443



          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合