92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

首頁

css的多行省略號處理

高勁

      在我們的頁面布局的時候,經常會有這樣的需求,超過指定行文本的時候會進行(省略號...)的處理,那么我們改怎么設置css呢?如下:

設置盒子的css為:

  • overflow:hidden;;
  • text-overflow:ellipsis;
  • white-space:nowrap;

       但是這樣只能顯示一行而不能實現指定行,所以還要其他的方法來實現指定行處理的。



     WebKit瀏覽器或移動端的頁面(大部分移動端都是webkit)

        可以直接使用WebKit的CSS擴展屬性(WebKit是私有屬性)-webkit-line-clamp ;注意:這是一個不規范的屬性,它沒有出現在 CSS 規范草案中。



        -webkit-line-clamp用來限制在一個塊元素顯示的文本的行數。 為了實現該效果,它需要組合其他的WebKit屬性。
       常見結合屬性:
  • display: -webkit-box; 必須結合的屬性 ,將對象作為彈性伸縮盒子模型顯示 。
  • -webkit-box-orient 必須結合的屬性 ,設置或檢索伸縮盒對象的子元素的排列方式 。
  • text-overflow: ellipsis;,可以用來多行文本的情況下,用省略號“…”隱藏超出范圍的文本 。

     css 代碼:

  • overflow:hidden;
  • text-overflow: ellipsis;
  • display: -webkit-box;
  • -webkit-line-clamp:2;/*這里控制著顯示多少行*/
  • -webkit-box-orient:vertical;


關于Vuex的全家桶狀態管理(一)

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

1:安裝

 npm install vuex --save
    
  • 1

2: 在main.js 主入口js里面引用store.js

import Vue from 'vue' import App from './App' import router from './router' import store from './vuex/store' //引用store.js Vue.config.productionTip = false //阻止在啟動時生成生產提示 //vue實例 new Vue({
 el: '#app',
 router,
 store, //把store掛在到vue的實例下面 template: '<App/>',
 components: { App }
})
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

3:在store.js里引用Vuex

import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) //注冊Vuex // 定義常量  如果訪問他的話,就叫訪問狀態對象 const state = {
  count: 1 } // mutations用來改變store狀態, 如果訪問他的話,就叫訪問觸發狀態 const mutations = { //這里面的方法是用 this.$store.commit('jia') 來觸發 jia(state){
    state.count ++
  },
  jian(state){
    state.count --
  },
} //暴露到外面,讓其他地方的引用 export default new Vuex.Store({
  state,
  mutations
})
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

4:在vue組件中使用

使用$store.commit(‘jia’)區觸發mutations下面的加減方法

<template> <p class="hello"> <h1>Hello Vuex</h1> <h5>{{$store.state.count}}</h5> <p> <button @click="$store.commit('jia')">+</button> <button @click="$store.commit('jian')">-</button> </p> </p> </template> <!-- 加上scoped是css只在這個組件里面生效,為了不影響全局樣式 --> <style scoped> h5{ font-size: 20px; color: red; } </style>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

這里寫圖片描述

5:state訪問狀態對象

使用computed計算

<template> <p class="hello"> <h1>Hello Vuex</h1> <h5>{{count}}</h5> <p> <button @click="$store.commit('jia')">+</button> <button @click="$store.commit('jian')">-</button> </p> </p> </template> <script> import {mapState} from 'vuex' export default{
  name:'hello', //寫上name的作用是,如果你頁面報錯了,他會提示你是那個頁面報的錯,很實用 // 方法一 // computed: { //  count(){ //   return this.$store.state.count + 6 //  } // } // 方法二 需要引入外部 mapState computed:mapState({
   count:state => state.count + 10 }) // ECMA5用法 // computed:mapState({ //  count:function(state){ //   return state.count //  } // }) //方法三 // computed: mapState([ //  'count' // ]) } </script>
藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

原生js的ajax請求

高勁

傳統方法的缺點:

      傳統的web交互是用戶觸發一個http請求服務器,然后服務器收到之后,在做出響應到用戶,并且返回一個新的頁面,,每當服務器處理客戶端提交的請求時,客戶都只能空閑等待,并且哪怕只是一次很小的交互、只需從服務器端得到很簡單的一個數據,都要返回一個完整的HTML頁,而用戶每次都要浪費時間和帶寬去重新讀取整個頁面。這個做法浪費了許多帶寬,由于每次應用的交互都需要向服務器發送請求,應用的響應時間就依賴于服務器的響應時間。這導致了用戶界面的響應比本地應用慢得多。

什么是ajax

       ajax的出現,剛好解決了傳統方法的缺陷。AJAX 是一種用于創建快速動態網頁的技術。通過在后臺與服務器進行少量數據交換,AJAX 可以使網頁實現異步更新。這意味著可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。

XMLHttpRequest 對象

       XMLHttpRequest對象是ajax的基礎,XMLHttpRequest 用于在后臺與服務器交換數據。這意味著可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。目前所有瀏覽器都支持XMLHttpRequest

方法
描述
abort()
停止當前請求
getAllResponseHeaders() 
 把HTTP請求的所有響應首部作為鍵/值對返回
getResponseHeader("header")
返回指定首部的串值
open("method","URL",[asyncFlag],["userName"],["password"])
建立對服務器的調用。method參數可以是GET、POST或PUT。url參數可以是相對URL或絕對URL。這個方法還包括3個可選的參數,是否異步,用戶名,密碼
send(content)
向服務器發送請求
setRequestHeader("header", "value") 
把指定首部設置為所提供的值。在設置任何首部之前必須先調用open()。設置header并和請求一起發送 ('post'方法一定要 )
五步使用法:

       1.創建XMLHTTPRequest對象
       2.使用open方法設置和服務器的交互信息
       3.設置發送的數據,開始和服務器端交互
       4.注冊事件
       5.更新界面

下面給大家列出get請求和post請求的例子

get請求:      

       //步驟一:創建異步對象
       var ajax = new XMLHttpRequest();
       //步驟二:設置請求的url參數,參數一是請求的類型,參數二是請求的url,可以帶參數,動態的傳遞參數starName到服務端
       ajax.open('get','getStar.php?starName='+name);
       //步驟三:發送請求
        ajax.send();
       //步驟四:注冊事件 onreadystatechange 狀態改變就會調用
        ajax.onreadystatechange = function () {
       if (ajax.readyState==4 &&ajax.status==200) {
       //步驟五 如果能夠進到這個判斷 說明 數據 完美的回來了,并且請求的頁面是存在的
       console.log(xml.responseText);//輸入相應的內容
         }
        } 

post請求:

       //創建異步對象  
       var xhr = new XMLHttpRequest();
       //設置請求的類型及url
       //post請求一定要添加請求頭才行不然會報錯
       xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
       xhr.open('post', '02.post.php' );
       //發送請求
       xhr.send('name=fox&age=18');
       xhr.onreadystatechange = function () {
       // 這步為判斷服務器是否正確響應
       if (xhr.readyState == 4 && xhr.status == 200) {
              console.log(xhr.responseText);
             }
        };    

為了方便使用,我們可以把他封裝進方法里面,要用的時候,直接調用就好了

       function ajax_method(url,data,method,success) {
       // 異步對象
       var ajax = new XMLHttpRequest();

      // get 跟post  需要分別寫不同的代碼
      if (method=='get') {
          // get請求
          if (data) {
              // 如果有值
              url+='?';
              url+=data;
          }else{

         }      

       // 設置 方法 以及 url
            ajax.open(method,url);

           // send即可
           ajax.send();
        }else{
             // post請求
             // post請求 url 是不需要改變
             ajax.open(method,url);

            // 需要設置請求報文
           ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");

           // 判斷data send發送數據
          if (data) {
            // 如果有值 從send發送
                ajax.send(data);
          }else{
               // 木有值 直接發送即可
              ajax.send();
            }
         }     

       // 注冊事件
       ajax.onreadystatechange = function () {
       // 在事件中 獲取數據 并修改界面顯示
            if (ajax.readyState==4&&ajax.status==200) {
                // console.log(ajax.responseText);

                // 將 數據 讓 外面可以使用
               // return ajax.responseText;

               // 當 onreadystatechange 調用時 說明 數據回來了
              // ajax.responseText;

              // 如果說 外面可以傳入一個 function 作為參數 success
              success(ajax.responseText);
             }
         }
      }

關于Vuex的全家桶狀態管理(二)

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

1:mutations觸發狀態 (同步狀態)

<template> <p class="hello"> <h1>Hello Vuex</h1> <h5>{{count}}</h5> <p> <button @click="jia">+</button> <button @click="jian">-</button> </p> </p> </template> <script> import {mapState,mapMutations} from 'vuex' export default{
  name:'hello', //寫上name的作用是,如果你頁面報錯了,他會提示你是那個頁面報的錯,很實用 //方法三 computed: mapState([ 'count' ]),
  methods:{
   ...mapMutations([ 'jia', 'jian' ])
  }
 } </script>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

2:getters計算屬性

getter不能使用箭頭函數,會改變this的指向

在store.js添加getters

 // 計算 const getters = {
  count(state){ return state.count + 66 }
} export default new Vuex.Store({
  state,
  mutations,
  getters
})
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

//count的參數就是上面定義的state對象 
//getters中定義的方法名稱和組件中使用的時候一定是一致的,定義的是count方法,使用的時候也用count,保持一致。 
組件中使用

<script> import {mapState,mapMutations,mapGetters} from 'vuex' export default{
  name:'hello',
  computed: {
   ...mapState([ 'count' ]),
   ...mapGetters([ 'count' ])
  },
  methods:{
   ...mapMutations([ 'jia', 'jian' ])
  }
 } </script>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3:actions (異步狀態)

在store.js添加actions

import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) // 定義常量 const state = { count: 1 } // mutations用來改變store狀態 同步狀態 const mutations = {
  jia(state){
    state.count ++
  },
  jian(state){
    state.count --
  },
} // 計算屬性 const getters = {
  count(state){ return state.count + 66 }
} // 異步狀態 const actions = {
  jiaplus(context){
    context.commit('jia') //調用mutations下面的方法
    setTimeout(()=>{
      context.commit('jian')
    },2000) alert('我先被執行了,然后兩秒后調用jian的方法') }, jianplus(context){ context.commit('jian') }
} export default new Vuex.Store({
  state,
  mutations,
  getters,
  actions
})
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

在組件中使用

<template> <p class="hello"> <h1>Hello Vuex</h1> <h5>{{count}}</h5> <p> <button @click="jia">+</button> <button @click="jian">-</button> </p> <p> <button @click="jiaplus">+plus</button> <button @click="jianplus">-plus</button> </p> </p> </template> <script> import {mapState,mapMutations,mapGetters,mapActions} from 'vuex' export default{
  name:'hello',
  computed: {
   ...mapState([ 'count' ]),
   ...mapGetters([ 'count' ])
  },
  methods:{ // 這里是數組的方式觸發方法 ...mapMutations([ 'jia', 'jian' ]), // 換一中方式觸發方法 用對象的方式 ...mapActions({
    jiaplus: 'jiaplus',
    jianplus: 'jianplus' })
  }
 } </script> <style scoped> h5{ font-size: 20px; color: red; } </style>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

4:modules 模塊

適用于非常大的項目,且狀態很多的情況下使用,便于管理

修改store.js

import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const state = { count: 1 } const mutations = {
  jia(state){
    state.count ++
  },
  jian(state){
    state.count --
  },
} const getters = {
  count(state){ return state.count + 66 }
} const actions = {
  jiaplus(context){
    context.commit('jia') //調用mutations下面的方法
    setTimeout(()=>{
      context.commit('jian')
    },2000) alert('我先被執行了,然后兩秒后調用jian的方法') }, jianplus(context){ context.commit('jian') }
}

//module使用模塊組的方式 moduleA const moduleA = { state, mutations, getters, actions }

// 模塊B moduleB const moduleB = { state: { count:108
  }
} export default new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB,
  }
})
藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

JS中作用域的銷毀和不銷毀的情況總結

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

window全局作用域->頁面關掉才銷毀
函數執行會形成私有的作用域

1)作用域的銷毀
一般情況下,函數執行形成一個私有的作用域,當執行完成后就銷毀了->節省內存空間

2)作用域的不立即銷毀
function fn(){
var i=10;
return function(n){
console.log(n+i++);
}
}
fn()(15);//->先執行fn,有一個私有的變量i=10,返回一個堆內存地址 xxxfff111,我們發現這個地址還用到了一次,那么當前的這個fn形成私有作用域(A)就不能立即銷毀了,xxxfff111(15)->輸出25,A中的i變為11;當xxxfff111執行完了,發現這個地址沒用了,瀏覽器就把A、xxxfff111都釋放了

fn()(20);//->在執行fn的時候一切都從新開始了,和上面的步驟是一樣的->輸出30

3)作用域的不銷毀:形成一個私有作用域,里面的內容被外面占用了
function fn(){
var i=10;
return function(n){
console.log(n+i++);
}
}
var f=fn();//->fn執行形成一個私有的作用域A,A中有一個私有的變量i=10,A中返回一個地址xxxfff11,被外面的f占用了,那么當前的A就不能銷毀了
f(15);//->輸出25,讓A中的i=11
f(20);//->輸出31,讓A中的i=12

當我們知道f用完的時候,為了優化性能,我們讓f=null,這樣的話A中的xxxfff111沒人占用了,瀏覽器會把A和xxxfff111都釋放了


幾種不銷毀常用到的形式:
1)函數執行,返回一個引用數據類型的值,并且在函數的外面被別人接收了,那么當前函數形成的私有作用域就不在銷毀了–>例如上面的案例

2)在函數執行的時候,里面的一個小函數的地址賦值給了我們的外面元素的點擊事件,那么當前小函數也相當于被外面占用了,大函數執行形成的私有的作用域也不銷毀了
//每一次循環都執行自執行函數形成一個私有的作用域(循環三次就有三個作用域,每一個作用域中都有一個i,第一個存儲的是0,第二個存數的是1..),在每一個私有的作用域中都把里面的函數綁定給了外面元素的點擊事件,這樣的話每一次形成的作用域都不銷毀了(三個不銷毀的作用域)
var oLis=document.getElementsByTagName(“li”);
for(var i=0;i<oLis.length;i++){
~function(i){
oLis[i].onclick=function(){
tabChange(i);
}
}(i);
}

3)在使用setTimeout實現輪詢動畫的時候,我們如果move需要傳遞參數值,那么像下面這樣的寫法會行成很多的不銷毀的作用域,非常的耗性能
function move(tar){
<js code>

//window.setTimeout(move,10); ->第二次執行move的時候我們沒有給它傳值(這樣寫不行)
window.setTimeout(function(){
move(tar);
},10);//->這樣寫實現了,但是每一次執行定時器都會形成一個私有的所用域(匿名函數形成的)A,在A中使用了上級作用域中的tar的值,而且執行了move又形成了一個小的作用域(而在小的作用域中會使用tar的值),這樣每一次定時器形成的A都不能銷毀了
}
move(100);//->第一次這樣執行傳遞100

//解決辦法:
function move(tar){
~function _move(){
<js code>
window.setTimeout(_move,10);
}();
}
move(100);//->第一次這樣執行傳遞100


JS中內存空間釋放的問題(堆內存、棧內存)
[谷歌瀏覽器]
我們開辟一個內存,可能或有一些其他的變量等占用了這個內存,谷歌瀏覽器都會間隔一段時間看這個內存還有沒有被占用,如果發現有沒有被占用的內存了,就自己幫我們回收了(內存釋放)

[火狐和IE]
我們開個內存,當我們引用了它,就在內存中記錄一個數,增加一個引用瀏覽器就把這個數+1,減少一個引用,瀏覽器就把這個數-1…當減到零的時候瀏覽器就把這個內存釋放了;但是有些情況下(尤其是IE)記著記著就弄亂了,內存就不能釋放了–>瀏覽器的內存泄露

var obj={};
我們養成一個好的習慣,當我們obj這個對象使用完成了,我們手動的obj=null (null空對象指針),瀏覽器會自己把剛才的堆內存釋放掉


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

前端常用class命名

高勁

頭:header

內容:content/container

尾:footer

導航:nav

側邊欄:sidebar

欄目:column

頁面外圍控制整體布局寬度:wrapper

左中右:left center right

登錄條:loginbar

標志:logo

版心:banner

頁面主體:main

熱點:hot

新聞:news

下載:download

子導航:subnav

菜單:menu

子菜單:submenu

搜索:search

友情鏈接:friendlink

頁腳:footer

版權:copyright

滾動:scroll

標簽頁:tab

文章列表:list

提示信息:msg

小技巧:tips

欄目標題:title

加入:joinUS

指南:guide

服務:service

注冊:regsiter

狀態:status

投票:vote

合作伙伴:partner

前端js中動態添加的元素不能觸發綁定事件解決方法

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

問題描述:在頁面選擇關鍵詞時,需要將關鍵詞元素綁定點擊事件使同一類型的關鍵詞只有一個固定class,使其隨點擊更換,目的是為了讓這一類型的關鍵詞的值可以由class獲取。在原本寫死的關鍵詞上綁定的事件是可用的,但是換成動態加載后發現只能適用于寫死的情況。很無奈,在網上搜索一番后花了點時間終于解決了,下面奉上。  

參考文章:https://blog.csdn.net/qq_35129893/article/details/78363211?locationNum=2&fps=1

原本綁定事件如下:

[javascript] view plain copy
  1. //查詢條件class的加載和移除(不能綁定動態加載的標簽)  
  2. $('.value_list').children.click(function(){     
  3.     $(this).addClass('a-time').siblings().removeClass('a-time');  

針對的HTML元素如下:

[html] view plain copy
  1. <div class="value_list value_list1" style="width: 80%;" id="subject">  
  2.     <span class="mr36" onclick="selectTopic(0)" value="0">全部</span>  
  3.     <a href="javascript:;" onclick="selectTopic("6eac9783353d40bba49e6b253e73f285")" value="dayu" types="subject" class="a-time">dayu</a>  
  4.     <a href="javascript:;" onclick="selectTopic("f9cbaa888cf34a99b6c50bf393e1a859")" value="天下會" types="subject" class="">天下會</a>  
  5.     <a href="javascript:;" onclick="selectTopic("3f4aa8924c88466dafc63d52aa57e7a6")" value="大雨" types="subject">大雨</a>  
  6.     <a href="javascript:;" onclick="selectTopic("87259765e9174a3b9d97f00a461e90bd")" value="士大夫" types="subject" class="">士大夫</a>  
  7. </div>  

但是發現,原先的事件不能用于動態加載的元素,如上面加載的,加載形式如下:

[javascript] view plain copy
  1. //獲取關鍵詞列表  
  2. function getlist(){  
  3.     $("#subject").html("");  
  4.     $.ajax({  
  5.         type: "POST",  
  6.         url:path+"/key/queryKeys.php",  
  7.         dataType : "json",  
  8.         success: function(result) {  
  9.             var data = result.data;  
  10.             console.log(data+" 888");  
  11.             if(data!=''){  
  12.                 var html='<span class="a-time mr36" onclick="selectTopic(0)" value="0">全部</span>';  
  13.                 for(var i=0;i<data.length;i++){//如果不加"則只能傳遞數字變量而不能傳遞帶有字母的變量,加上"則無影響  
  14.                 //  html+='<li class="fl"><i class="iconfont close" onclick="del("'+data[i].kw_id+'")"></i>'+data[i].kw_word+'</li>';  
  15.                     html+='<a href="javascript:;" onclick="selectTopic("'+data[i].kw_id+'")" value="'+data[i].kw_word+'" types="subject">'+data[i].kw_word+'</a>'  
  16.                 }                             
  17.                 $("#subject").html(html);  
  18.             }else{  
  19.                 alert("請先登陸!");   
  20.             }  
  21.         }  
  22.          });   
  23. }  

無奈,只能上網尋求萬能的大神了。

基本上提供的解決方案就兩個,使用

$('element').live('click',function(){})

或者

$('父元素').on('click', '子元素', function(){})

我先是使用.live嘗試了下,發現gg,心灰意冷ing;本著試一試不要錢的心態又用.on試了下,結果令人驚喜??!可以使用了,哎,這鬼玩意坑死人。

下面上針對我加載的界面元素寫的綁定事件:

[javascript] view plain copy
  1. //查詢條件class的加載和移除(適用于動態加載標簽的情況--on事件需要jquery在1.6以上)  
  2. $('.value_list').on('click','a,span',function(){  
  3.     $(this).addClass('a-time').siblings().removeClass('a-time');  
  4. ;  

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

懶加載封裝實現

高勁

1.什么是懶加載?
         當訪問一個頁面的時候,先把img元素背景圖片路徑替換成一張替代圖片的路徑(這樣就只需請求一次,占位圖),將圖片的真實路徑存儲在img自定義屬性中,只有當圖片出現在瀏覽器的可視區域內時,才設置圖片正真的路徑,讓圖片顯示出來。這就是圖片懶加載。
2.為什么要用懶加載?
       很多頁面,內容很豐富,頁面很長,圖片較多。比如說各種商城頁面。這些頁面圖片數量多,而且比較大,少說百來K,多則上兆。要是頁面載入就一次性加載完畢,提高首屏加載速度,可以減輕服務器壓力,節約流量,用戶體驗好。
3.懶加載實現封裝?

    lazyLoad由四個函數組成,init(初始化函數),checkShow(判斷圖片是否加載),shouldShow(將要展示的圖片),showImg(展示圖片)。

(1)初始化函數(init)  由于滾動事件太消耗性能,所以用定時器替換,不是滾動就觸發,而是滾動后200毫秒后觸發。

                var timer;
                function init(){
                    $(window).on("scroll",function(){
                        if(timer){
                            clearTimeout(timer);
                        }
                        timer = setTimeout(function(){
                            checkShow();  //
                        },200);
                    });
                }

(2)判斷”圖片是否加載“(checkshow)函數,如果圖片有isload屬性,就說明圖片已經加載過了,直接return。如果圖片沒有isload屬性,進入將要展示圖片shouldshow函數

                function checkShow(){
                    $lazyLoad.each(function(){
                        $cur = $(this);
                        if($cur.attr('isLoaded')){
                            return;
                        }
                        if(shouldShow($cur)){
                            showImg($cur);
                        }
                    });
                }

(3)將要展示圖片shouldshow函數,獲取屏幕可視寬度,滾動高度,要展示的元素到文檔的高度,如果元素到文檔的高度小于屏幕的可視高度加上滾動高度,說明元素已在可視區內,返回true,否則返回false。

               function shouldShow ($node){
                    var scrollH = $(window).scrollTop(),
                        windowH = $(window).height(),
                        top = $node.offset().top;
                    if(top < windowH + scrollH){
                        return true;
                    } else {
                        return false;
                    }

                }

(4)“展示圖片”函數,將元素的src屬性替換為自定義屬性data-src(真正圖片的地址)。

                function showImg ($node){
                    $node.find("img").attr("src",$node.data("src"));
                    $node.attr("isLoaded",true);
                }

(5)函數返回一個對象

              return {
                        init : init
           }

      這樣就實現懶加載封裝了!

微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

1.把wxParse文件全部放入項目。

2.在wxml中import wxParse.wxml,并把template插入到到對應的位置上

[html] view plain copy
  1. <!--wxml-->  
  2. <import src="../../../wxParse/wxParse.wxml"/>  
  3. <view class="view-title">{{title}}</view>  
  4. <view class="view-time-box">  
  5.   <text class="view-date">{{date}}</text>  
  6.   <text class="view-time">{{time}}</text>  
  7. </view>  
  8. <template is="wxParse" data="{{wxParseData:article.nodes}}"/>  

3.在wxss中import wxParse.wxss,并設置樣式;比如‘wxParse-image’是富文本圖片轉化成image組件之后的類名,‘wxParse-p’是p標簽轉化成view組件后設置的類名

[css] view plain copy
  1. <!--wxss-->  
  2. @import "../../../wxParse/wxParse.wxss";  
  3. page{  
  4.   background#fff;  
  5. }  
  6. .view-title{  
  7.   line-height80rpx;  
  8.   font-size48rpx;  
  9.   color:#0C0C0C;  
  10.   overflowhidden;  
  11.   text-overflow: ellipsis;  
  12.   display: -webkit-box;  
  13.   -webkit-line-clamp: 2;  
  14.   -webkit-box-orient: vertical;  
  15.   max-height190rpx;  
  16.   min-height80rpx;  
  17.   width:690rpx;  
  18.   padding:30rpx 30rpx 0;  
  19. }  
  20. .view-time-box{  
  21.   height66rpx;  
  22.   line-height66rpx;  
  23.   font-size30rpx;  
  24.   color:#999999;  
  25.   margin-bottom40rpx;  
  26.   padding:0 30rpx;  
  27. }  
  28. .view-date{  
  29.   margin-right20rpx;  
  30. }  
  31. .wxParse-img{  
  32.   margin-top:20rpx;  
  33.   displayblock;  
  34.   position:relative;  
  35.   top:0;  
  36.   left:50%;  
  37.   transform: translateX(-50%);  
  38. }  
  39. .wxParse-p{  
  40.   text-indent2em;  
  41.   margin-top:20rpx;  
  42.   color:#0C0C0C;  
  43.   line-height:50rpx;  
  44.   font-size:34rpx;  
  45.   padding:0 30rpx 30rpx;  
  46.   text-alignjustify;  
  47. }  

4.js

[javascript] view plain copy
  1. var WxParse = require('../../../wxParse/wxParse.js');  
  2. Page({  
  3.   
  4.   /** 
  5.    * 頁面的初始數據 
  6.    */  
  7.   data: {  
  8.     title: '',  
  9.     date: "",  
  10.     time: "",  
  11.     id: ''  
  12.   },  
  13.   
  14.   /** 
  15.    * 生命周期函數--監聽頁面加載 
  16.    */  
  17.   onLoad: function (options) {  
  18.     this.setData({  
  19.       id:options.id  
  20.     })  
  21.   },  
  22.   onShow: function () {  
  23.     wx.showLoading({  
  24.       title: '加載中...',  
  25.     })  
  26.     var that = this;  
  27.   
  28.     // 模擬獲取數據  
  29.     setTimeout(function () {  
  30.       that.setData({  
  31.         title:'僑寶柑普茶新會陳皮僑寶柑',  
  32.         date:"2018-03-01",  
  33.         time:"13:20:53"  
  34.       })  
  35.       var article = `  
  36.         <img src="../../../imgs/index/s.png"></img>  
  37.     <p>微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)</p>  
  38.     <p>微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)</p>  
  39.         <img src="../../../imgs/index/s.png"></img>  
  40.     <p>近兩年,小青柑的火爆有目共睹,嬌小玲瓏的產品形態、便攜式的消費場景、柑與茶結合的時尚方式以及獨特的口感和養生功效,都在順應著目前年輕化、多元化、便攜化的茶葉消費市場需求,讓它成為了一大爆品。</p>  
  41.       `;  
  42.       /** 
  43.       * WxParse.wxParse(bindName , type, data, target,imagePadding) 
  44.       * 1.bindName綁定的數據名(必填) 
  45.       * 2.type可以為html或者md(必填) 
  46.       * 3.data為傳入的具體數據(必填) 
  47.       * 4.target為Page對象,一般為this(必填) 
  48.       * 5.imagePadding為當圖片自適應是左右的單一padding(默認為0,可選) 
  49.       */  
  50.       WxParse.wxParse('article''html', article, that, 20);  
  51.         
  52.       // 更改數據、獲取新數據完成  
  53.       wx.hideLoading();  
  54.     }, 500)  
  55.   }  
  56. })  
具體的API可以去GitHub上查看:https://github.com/icindy/wxParse








藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務


js中常見的位置屬性-offset,scroll,client系列

高勁

前言
       Javascript中的offset、scroll、client系列都是比較常用的坐標屬性,也是比較容易混淆的知識點。
offset家族
       offset家族一般在節點對象里面使用。
       offsetParent
             1.    如果當前元素的父級元素沒有進行css定位(position為absolute或relative),offsetParent為body。
             2.    如果當前元素的父級元素中有css定位(position為absolute或relative),offsetParent取最近的那個父級元素。
       offsetLeft/Top計算規則:
             標準流、浮動、非脫標定位
              offsetLeft = 自己的margin+offsetParent的margin、padding、border
              脫標定位
              offsetLeft = 自己的left + margin-left
        注意:與stlye.left的區別
              offsetLeft只可讀,不可寫。也就是說,通過offsetLeft只能獲取元素的左偏移值,而無法去設置元素的左偏移值。
               stlye.left可讀可寫,但是通過style.left獲取元素的偏移值,是一個帶單位的字符串,例如“100px”。

            (offsetTop同理)

        offsetWidth(和offsetHeight:

        其實就是一個元素的實際寬度 = width+padding+border

client家族】

        clientWidth (clientHeight) = width+padding

              該屬性指的是元素的可視部分寬度和高度

              假如元素有padding有滾動,且滾動是顯示的

              clientWidth = width + padding - 滾動軸寬度

       clientTop(clientLeft):

             這一對屬性是用來讀取元素的border的寬度和高度的

             clientTop = border-top 的 border-width

             clientLeft = border-left 的 border-width

【scroll家族】

150537.jpg.png

  如上圖所示
       scrollWidth(和scrollHeight
          無滾動軸時:scrollWidth = clientWhidth = width + padding
          有滾動軸時:scrollWidth = 實際內容的寬度 + padding
       scrollTop(和scrollLeft
           這對元素是可讀寫的,指的是當元素其中的內容超出其寬高的時候,元素被卷起的寬度和高度
【事件里面的clientXoffsetXscreenX


  • event.clientX:設置或獲取鼠標指針位置相對于當前窗口的 x 坐標,其中客戶區域不包括窗口自身的控件和滾動條
  • event.clientY:設置或獲取鼠標指針位置相對于當前窗口的 y 坐標,其中客戶區域不包括窗口自身的控件和滾動條
  • vent.offsetX:設置或獲取鼠標指針位置相對于觸發事件的對象的 x 坐標
  • event.offsetY:設置或獲取鼠標指針位置相對于觸發事件的對象的 y 坐標
  • event.screenX 設置或獲取獲取鼠標指針位置相對于用戶屏幕的 x 坐標。
  • event.screenY設置或獲取鼠標指針位置相對于用戶屏幕的 y 坐標。


【window系列】
  • window.innerHeight指的是瀏覽器窗口顯示html文檔的可視區域的高度
  • window.outerHeight指的是瀏覽器窗口的高度 ,包括了工具欄,地址欄等等高度

       window.screen包含了屏幕的信息
  • window.screen.width   電腦屏幕的整個寬度
  • window.screen.availWidth   電腦屏幕除去菜單條之后的寬度
  • window.screen.left   瀏覽器窗口的左上角距離電腦屏幕最左側的距離




日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
97精品视频在线| 成人网在线视频| 日本高清久久一区二区三区| 僵尸再翻生在线观看免费国语| 久久99国产精品免费| 国产原厂视频在线观看| 91精品视频免费| 日本不卡不卡| 亚洲裸体xxxx| 日韩欧美有码在线| 欧美凹凸一区二区三区视频| 亚洲a在线播放| free性欧美16hd| 精品欧美一区二区久久久伦| 国产免费一区二区三区在线能观看| 热re99久久精品国99热蜜月| 国产成人高清激情视频在线观看| 神马香蕉久久| 美女视频一区二区| 91精品国产自产拍在线观看蜜| 国产精品影视网| 欧美激情免费视频| 国产精品亚洲一区| 国产日韩欧美一区在线| 亚洲专区一二三| 国产精品久久久久三级| 欧美大奶一区二区| 亚洲国产尤物| 亚洲一区二区av电影| 久久久久久亚洲综合| 亚洲激情 国产| 日韩中文字幕区一区有砖一区| 久久五月精品| 最近2019好看的中文字幕免费| 精品日本一线二线三线不卡| 青青草国产精品一区二区| 国产精品成人一区二区艾草| 国产日产一区| 噜噜噜天天躁狠狠躁夜夜精品| 精品国产18久久久久久二百| 国产精品蜜臀av| 成人在线视频网| 超碰这里只有精品| 久久久久久国产精品三级玉女聊斋| 日韩激情欧美| 亚洲精华液一区二区三区| 亚洲一区二区精品视频| 欧美天天影院| 美女看a上一区| 图片区小说区区亚洲影院| zzijzzij亚洲日本少妇熟睡| 国产免费一区二区三区在线观看| 4438x成人网最大色成网站| 97色在线视频观看| 中文字幕亚洲一区二区三区五十路| 亚洲成人一区二区三区| 97人人澡人人爽91综合色| 美女视频黄 久久| 免费在线播放第一区高清av| 67194成人在线观看| 国产ts人妖一区二区三区| 欧美日韩国产精品一区二区三区四区| 欧美xxx黑人xxx水蜜桃| 久久国产日本精品| 亚洲激情欧美| 国产精品视频白浆免费视频| 欧美在线播放视频| 亚洲欧美日本国产专区一区| 亚洲无线看天堂av| 久久精品亚洲精品| 亚洲精品视频免费看| 岛国av一区二区| 欧美黄色三级网站| 欧美黑人极品猛少妇色xxxxx| 国产曰批免费观看久久久| 欧美一区二区性放荡片| 日韩欧美在线不卡| 精品日本一线二线三线不卡| 日韩免费网站| 日韩av免费看网站| 天堂中文在线播放| 97超级碰碰碰| 欧美人与禽性xxxxx杂性| 久久手机精品视频| 日本三级中国三级99人妇网站| 一区二区三区视频网站| 丝袜美腿玉足3d专区一区| 国产精品美女一区二区| 福利视频在线导航| 白浆在线视频| 日韩在线观看一区二区| 国产福利久久| 不卡视频一区| 国产午夜亚洲精品理论片色戒| 日韩欧美精品免费在线| 国产精品一区二区三区www| 最新国产精品拍自在线播放| 韩国中文字幕在线| 亚洲欧美久久| 韩国一区二区三区视频| 国产66精品| 国产精品jk白丝蜜臀av小说| 综合干狼人综合首页| 欧美高清性hdvideosex| 色狼人综合干| 国内精品一区二区三区| 亚洲尤物在线| 欧美在线|欧美| 亚洲一区免费网站| 亚洲日本成人在线观看| 四虎国产精品成人免费影视| 成人免费电影视频| 亚洲护士老师的毛茸茸最新章节| 日韩一二三在线视频播| 久久999免费视频| 女子免费在线观看视频www| 欧美丰满高潮xxxx喷水动漫| 国产精品免费看一区二区三区| 精品国产一区探花在线观看| 日本不卡不码高清免费观看| 91视频88av| 欧美日韩亚洲一区二区三区在线观看| 欧美野外猛男的大粗鳮| 色www精品视频在线观看| 国产精品久久久久久久久| 豆花视频一区二区| 亚洲香蕉成人av网站在线观看| 国产女同性恋一区二区| 国内免费精品永久在线视频| 久久aⅴ国产紧身牛仔裤| 欧美一区二区三区四区久久| 在线成人免费观看| 精品少妇一区二区三区在线视频| 中文字幕一区二区三区四区不卡| 鲁大师影院一区二区三区| 亚洲乱码av中文一区二区| 日本道不卡免费一区| 国产主播在线一区| 国产成人在线影院| 亚洲精品资源美女情侣酒店| 一区二区三区欧美在线观看| 欧美性猛交xxxx乱大交3| 国产视频一区二| 日本一区二区三区视频| 日韩精品视频网站| 欧美男男freegayvideosroom| 欧美日韩成人在线播放| 97久久精品人人澡人人爽缅北| 91免费国产视频| 亚洲综合小说图片| 久久久人成影片一区二区三区观看| 亚洲欧美小说色综合小说一区| 欧美激情第一页在线观看| 欧美日韩国产在线| 欧美视频二区欧美影视| 亚洲小说区图片| 欧美大黄免费观看| 国产91一区二区三区| 日韩av一区二区三区在线| 中文字幕欧美在线| 久久久免费av| 久久精品国产亚洲aⅴ| 欧美亚视频在线中文字幕免费| 三级在线观看视频|