自定義jq插件,滑鼠懸浮展示圖片或者視頻放大圖,可自定義展示內容

来源:https://www.cnblogs.com/mrzll/archive/2019/04/08/10671023.html
-Advertisement-
Play Games

網站項目經常會遇到一些視頻或者圖片素材的展示功能,那麼就需要自己寫一個功能,就是在一些列表頁面你想要是這個數據的詳細內容,彈框在頁面某個位置 例如這是視頻懸浮展示效果,可自定義自動播放等屬性標簽 又例如這是圖片懸浮展示,可控制懸浮展示與不展示 像上面這樣或者一些其他列表做的一些懸浮彈框展示等,都可以 ...


網站項目經常會遇到一些視頻或者圖片素材的展示功能,那麼就需要自己寫一個功能,就是在一些列表頁面你想要是這個數據的詳細內容,彈框在頁面某個位置

例如這是視頻懸浮展示效果,可自定義自動播放等屬性標簽

又例如這是圖片懸浮展示,可控制懸浮展示與不展示

像上面這樣或者一些其他列表做的一些懸浮彈框展示等,都可以自定義完成。

那這樣的插件需要怎麼調用呢?

// 插件的調用
        // dom 是父元素調用
        $(dom).scaleTools({
        item: 'li', //  這是子元素,可以為多個  ,元素需定義data-src屬性與值,為彈框展示提供數據
        fade: true, // 顯示方式
        conCallback(src) { // 這邊是生成的展示內容標簽,預設是img
            return '<video autoplay muted loop><source src="'+ src +'"></video>' // 這邊是已視頻為例子
        }
    })       
        
    // 一些其他參數
    {
        checkbtn: ' ',  // 這是提供控制是否彈框的按鈕元素
        followScroll: true, // 彈框根據元素位置固定或根據視窗位置固定,預設根據滑鼠懸浮元素
        fadeTime: 500, // 生成彈框間隔時間,預設滑鼠懸浮後500毫秒後展示
        oftX: 0, // 水平方向距離懸浮元素間距
        oftYPosition: 'center', // 生成彈框與元素垂直方向中心點對齊, 其他參數'top', 'bottom' 
    }

上面的一些調用參數就是插件全部接受的自定義數據,如果有其他特有的需求可以自己讀懂源碼再去修改,或者給我留言,我去添加,下麵就是方法的定義:


;(function($, win) {
    const PLUGINNAME = 'scaleTools'; // 定義插件名

    let defaultOpts = {  // 預設參數
        item: '.item',
        checkbtn: '',
        fade: false,
        followScroll: true,
        fadeTime: 500,
        oftX: 0,
        oftYPosition: 'center', // 'top', 'bottom'
        conCallback: false
    };

    class Plugin {
        constructor(wrap, opts) {
            this.wrap = $(wrap); 
            this.opts = $.extend(true, {}, defaultOpts, opts); // 合併用戶參數
            this.items = this.wrap.children(this.opts.item);
            this.isShown = false;
            this.timer;
            this.checkShow = false;
            this.init();
        }

        init() {
            this.getSize() // 獲取視窗大小
            this.initEvent() // 初始事件
        }

        initEvent() {
            this.wrap
                .on('mouseenter', this.opts.item, this.timeInterval.bind(this)) // 父元素委托滑鼠進入事件
                .on('mouseleave', this.opts.item, this.unbindScale.bind(this)); // 滑鼠離開事件
            $(win).on('resize', this.getSize.bind(this)); // 視窗改變重新獲取
            $(win).on('scroll', this.changeScrollTop.bind(this)); // 視窗滾動事件
            if(!!this.opts.checkbtn) {   // 是否存在插件開關
                $(this.opts.checkbtn).on('click', (e)=> {
                    this.checkShowFn();  // 切換彈框是否懸浮展示
                })
            }

        }

        getSize() {
            this.winH = $(window).height();
            this.winW = $(window).width();
        }

        initTool(e) {
            let html = '<div class="scaleTool"><div class="tool-content">{ inner }</div></div>',  // 初始彈框容器, 樣式自己在樣式文件寫
                str = '',
                src = $(e.target).closest(this.opts.item).data('src') || $(e.target).closest(this.opts.item).find('img').attr('src'); // 獲取懸浮元素 需要展示的數據src ,圖片或者視頻, 如果其他可不填

            if(!this.opts.conCallback) {
                str = '<img src="'+ src +'" />'
            }else {
                str = this.opts.conCallback(src)
            };

            if($('.scaleTool').length) {  // 存在彈框
                this.toolDom = $('.scaleTool');   // 重新賦值
                this.toolDom.find('.tool-content').html(str); // 修改內容 
            } else {
                html = html.replace('{ inner }', str);  // 填入內容
                $('body').append(html); // 加入頁面
                this.toolDom = $('.scaleTool');  // 初始聲明
            }
                    
        }

        checkShowFn() {  // 是否彈框開關
            this.checkShow = !this.checkShow;
            if(this.checkShow) {
                $(this.opts.checkbtn).addClass('active') // 為開關添加類名自定義樣式
            } else {
                $(this.opts.checkbtn).removeClass('active');
                this.toolDom.remove();
            }
        }

        unbindScale() {  // 滑鼠離開
            clearTimeout(this.timer);
            if(this.toolDom && (this.checkShow || !this.opts.checkbtn)) {
                this.opts.conCallback && this.toolDom.find('video')[0].pause();
                this.toolDom.hide();
                this.isShown = false
            }
        }
        
        // 滑鼠進入
        timeInterval(event) {
            if(this.checkShow || !this.opts.checkbtn) {
                this.timer = setTimeout(()=>{
                    this.showScale(event);
                }, this.opts.fadeTime)
            }
        }

        showScale(e) {
            clearTimeout(this.timer);
            if(this.isShown || this.winW < 1200) return;  // 頁面視窗小於1200 或者正在顯示彈框  return

            this.initTool(e); 
            let itemW = this.toolDom.width(),
                itemH = this.toolDom.height(),
                curX, curY, 
                $curBox = $(e.target).closest(this.opts.item);
            // 獲取當前懸浮元素的一些位置信息,對彈框位置的定義
            let box = $curBox.get(0).getBoundingClientRect();

            if(box.right > this.winW / 2) {
                curX = box.left - itemW - this.opts.oftX
            } else {
                curX = box.right + this.opts.oftX
            }

            if(this.opts.oftYPosition === 'top') {
                if(box.top < itemH) {
                    if(box.top < 0) {
                        curY = 0
                    } else {
                        curY = box.top
                    }
                } else {
                    curY = box.top - itemH
                }
            } else if(this.opts.oftYPosition === 'bottom') {
                if(this.winH - box.bottom > itemH) {
                    curY = box.bottom
                } else {
                    curY = this.winH - itemH
                }
            } else {
                if((box.top + $curBox.outerHeight() / 2)  < itemH / 2) {
                    if(box.top < 0) {
                        curY = 0
                    } else {
                        curY = box.top
                    }
                    
                } else {
                    if((box.bottom - $curBox.outerHeight() / 2) > (this.winH - itemH / 2)) {
                        curY = this.winH - itemH
                    } else {
                        curY = box.top + $curBox.outerHeight() / 2 - itemH / 2
                    }
                    
                }
            }

            this.scrollH = $(win).scrollTop();

            this.toolDom.css({
                left: curX,
                top: curY
            });

            this.toolT = curY;
            
            // 展示方式
            if(this.opts.fade) {
                this.toolDom.fadeIn()
            } else {
                this.toolDom.show()
            }
            this.playVideo()

            this.isShown = true
        }

        changeScrollTop(e) {  // 根據滾動高度修改彈框位置
            let scrollT = $(e.target).scrollTop(),
                reScrollT = this.scrollH,
                itemT = this.toolT,
                newScrollT;
            if(this.opts.followScroll && this.isShown) {
                newScrollT = reScrollT - scrollT;
                this.toolDom.css({
                    top: itemT + newScrollT,
                });
            }
        }

        playVideo() {  // 視頻播放
            setTimeout(()=> {
                this.opts.conCallback && this.toolDom.find('video').get(0).play()
            }, 0)
        }
    }

    $.fn[PLUGINNAME] = function(options) {
        this.each(function() {
            if (!$.data(this, "plugin_" + PLUGINNAME)) {
                $.data(this, "plugin_" + PLUGINNAME, new Plugin(this, options));
            }
        });
        return this;
    };

})(jQuery, window);

上面則是全部插件方法定義了,公司項目網站www.macdown.com, 這個插件主要用在視頻與素材板塊,即v.macdown.com的整站與sc.macdown.com的圖庫分類, 如果有興趣可以來網站看一下效果
有很多不足希望能夠指出,學習進步,互相關註,謝謝~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Ext.define(entend):定義類,單繼承 Ext.define(override):定義類的補丁(擴展或重寫) Ext.extend:老版本的定義類,單繼承 Ext.override:4種情況 mixins混入:定義類,多重繼承 ...
  • #使用AngularJS時,當路由發生改變時,我們需要做某些處理,此時可以監聽路由事件,常用的是$routeStartChange, $routeChangeSuccess ##使用場景:在路由配置文件routeConfig.js,對路由跳轉進行特殊處理經常用到 ...
  • 我們在使用vue開發項目的時候,都是用vue-cli直接來搭建的.但是這是別人已經造好的輪子,我們既然要使用別人造好的輪子,我們總不能知其然而不知其所以然.所以呢,我這邊文章就教你如何使用webpack一步一步搭建起vue-cli框架, 首先,第一步呢,肯定是要安裝webpack啦 安裝webpac ...
  • 今天把一個jquery方法從前臺cshtml文件轉移到單獨的js文件中後執行不成功,調試發現if判斷中的中文字元串變成了亂碼,之前在前臺文件中是可以正常顯示的,所以判定可能是跟文件的編碼方式有關係. 搜索網路得知在引用時指定編碼方式charset即可解決,此方法已驗證: <script type=" ...
  • android video播放視頻放大後無法返回,先debug下debugx5.qq.com 發現用的不是X5內核 直接激活 debugmm.qq.com/?forcex5=true 問題解決 ...
  • 項目中遇到一個需求,就是另一個管理系統帶參直接單純的跳轉跳轉到vue pc項目中的某個頁面,後再初始化查詢數據,參數以地址欄的形式傳入 管理系統:打開新地址地址 let obj = { id: 21, name: "測試傳參" }; window.open("http://localhost:808 ...
  • 源碼如下,如遇調試問題,可以找我解決: JS查看示例圖(滑鼠移動顯示,移開隱藏) 點我查看示例 ... ...
  • 具體效果如右下角 需要三個文件和一個可選文件 waifu.css(看板娘在頁面的位置以及大小) waifu-tips.js(看板娘的語言設置) live2d.min.js(一些點擊之後的動作) *flat-ui.min.css(看板娘的選項 PS:右面的選項 ) https://pan.baidu. ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...