亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

使用 electron 實現類似新版 QQ 的登錄界面效果(陰影、背景動畫、窗體3D翻轉)

2019-11-19 12:38:36
字體:
來源:轉載
供稿:網友

現在什么都講究追趕潮流,覺得 QQ 登錄窗口做的效果不錯,既然剛學習 electron ,那么就用 electron 模仿一下。其實主要用到的就是 CSS3 的效果:邊框圓角、陰影,3D變換。對,就這么簡單。先上效果:

下面是關鍵代碼:

app.js

'use strict';const { app, BrowserWindow } = require('electron')const path = require('path')const url = require('url')// Keep a global reference of the window object, if you don't, the window will// be closed automatically when the JavaScript object is garbage collected.let winfunction createWindow() {  // Create the browser window.  win = new BrowserWindow({    width: 495, height: 470, /*skipTaskbar: true,*/ frame: false,    resizable: false, transparent: true, show: false, alwaysOnTop: true  })  win.once('ready-to-show', () => {    win.show()  })  // and load the index.html of the app.  win.loadURL(url.format({    pathname: path.join(__dirname, '/app/index.html'),    protocol: 'file:',    slashes: true  }))  // Open the DevTools.  //win.webContents.openDevTools()  // Emitted when the window is closed.  win.on('closed', () => {    // Dereference the window object, usually you would store windows    // in an array if your app supports multi windows, this is the time    // when you should delete the corresponding element.    win = null  })}//app.disableHardwareAcceleration();// This method will be called when Electron has finished// initialization and is ready to create browser windows.// Some APIs can only be used after this event occurs.app.on('ready', createWindow)// Quit when all windows are closed.app.on('window-all-closed', () => {  // On macOS it is common for applications and their menu bar  // to stay active until the user quits explicitly with Cmd + Q  if (process.platform !== 'darwin') {    app.quit()  }})app.on('activate', () => {  // On macOS it's common to re-create a window in the app when the  // dock icon is clicked and there are no other windows open.  if (win === null) {    createWindow()  }})// In this file you can include the rest of your app's specific main process// code. You can also put them in separate files and require them here.

index.html

<!DOCTYPE html><html style="margin:0; padding:0;height:100%;"><head>  <meta charset="UTF-8">  <title>QQ Login</title>  <style>    html, body {      margin: 0;      padding: 0;      width: 100%;      height: 100%;    }    body {      perspective: 800px;      -webkit-app-region: drag;      -webkit-user-select: none;    }    input[type="submit"],    input[type="reset"],    input[type="button"],    input[type="text"],    button,    textarea {      -webkit-app-region: no-drag;    }    .shadow {      box-shadow: 0 0 10px rgba(0, 0, 0, 1);      position: absolute;      width: 100%;      height: 100%;      border-radius: 4px;    }    #login-back {      position: relative;      border-radius: 3px 3px 0 0;      left: 0;      right: 0;      height: 180px;    }    #card {      left: 33px;      top: 70px;      right: 33px;      bottom: 70px;      background-color: #ebf2f9;      position: absolute;      -webkit-transition: -webkit-transform .6s ease-in-out;      transition: transform .6s ease-in-out;      -webkit-transform-style: preserve-3d;      transform-style: preserve-3d;      border-radius: 4px;    }      #card.flipped {        -webkit-transform: rotateY( 180deg );        transform: rotateY( 180deg );      }      #card .front {        background: url(imgs/login-back.gif) no-repeat;        background-size: 100% 180px;        position: absolute;        transform: rotateY(0deg);      }      #card .back {        position: absolute;        background: url(imgs/login-back.gif) no-repeat;        background-size: 100% 180px;        -webkit-transform: rotateY( -180deg );        transform: rotateY( -180deg );        -webkit-backface-visibility: hidden;        backface-visibility: hidden;        z-index:2;      }    .sys-control-box {      float:right;      width:84px;      border-radius: 0 3px 0 0;    }    .sys-btn {      width: 28px;      height: 28px;      border: none;      outline: none;      margin: 0;    }    .sys-btn-mini {      background: url(imgs/btn_mini_normal.png) no-repeat;    }      .sys-btn-mini:hover {        background: url(imgs/btn_mini_highlight.png) no-repeat;      }      .sys-btn-mini:active {        background: url(imgs/btn_mini_down.png) no-repeat;      }    .sys-btn-close {      border-radius: 0 3px 0 0;      background: url(imgs/btn_close_normal.png) no-repeat;    }      .sys-btn-close:hover {        background: url(imgs/btn_close_highlight.png) no-repeat;      }      .sys-btn-close:active {        background: url(imgs/btn_close_down.png) no-repeat;      }    .sys-btn-set {      background: url(imgs/btn_set_normal.png) 1px 0 no-repeat;    }      .sys-btn-set:hover {        background: url(imgs/btn_set_hover.png) 1px 0 no-repeat;      }      .sys-btn-set:active {        background: url(imgs/btn_set_press.png) 1px 0 no-repeat;      }    .btn {      width: 78px;      height: 28px;      background: url(imgs/setting_btn_normal.png) no-repeat;      background-size: 100% 100%;      border: none;      outline: none;      margin: 0;    }      .btn:hover, .btn:active {        background: url(imgs/setting_btn_hover.png) no-repeat;        background-size: 100% 100%;      }      .btn:focus {        background: url(imgs/setting_btn_hover.png) no-repeat;        background-size: 100% 100%;      }  </style></head><body>  <div id="card">    <div id="front" class="front shadow">      <div class="sys-control-box">        <button id="btn-set" class="sys-btn sys-btn-set" title="設置"></button><button class="sys-btn sys-btn-mini" title="最小化"></button><button class="sys-btn sys-btn-close" title="關閉"></button>      </div>    </div>    <div id="back" class="back shadow">      <div style="width:100%;height:100%; border-radius: 4px;background:-webkit-linear-gradient(top, rgba(0, 0, 0, 0.00) 0%, rgba(0, 0, 0, 0.00) 6%, #ebf2f9 12%, #ebf2f9 90%, #cde2f2 90%, #cde2f2 100%);">        <div class="sys-control-box" style="width:56px;">          <button class="sys-btn sys-btn-mini" title="最小化"></button><button class="sys-btn sys-btn-close" title="關閉"></button>        </div>        <button id="btn-ok" style="position:absolute; right:91px; bottom:2px;" class="btn">確定</button>        <button id="btn-cancel" style="position:absolute; right:10px; bottom:2px;" class="btn">取消</button>      </div>    </div>  </div>  <script>    Element.prototype.hasClassName = function (a) {      return new RegExp("(?:^|//s+)" + a + "(?://s+|$)").test(this.className);    };    Element.prototype.addClassName = function (a) {      if (!this.hasClassName(a)) {        this.className = [this.className, a].join(" ");      }    };    Element.prototype.removeClassName = function (b) {      if (this.hasClassName(b)) {        var a = this.className;        this.className = a.replace(new RegExp("(?:^|//s+)" + b + "(?://s+|$)", "g"), " ");      }    };    Element.prototype.toggleClassName = function (a) {      this[this.hasClassName(a) ? "removeClassName" : "addClassName"](a);    };    //var init = function () {    //  var card = document.getElementById('card');    //  document.getElementById('front').addEventListener('click', function () {    //    card.toggleClassName('flipped');    //  }, false);    //  document.getElementById('back').addEventListener('click', function () {    //    card.toggleClassName('flipped');    //  }, false);    //};    //window.addEventListener('DOMContentLoaded', init, false);    (function () {      const remote = require('electron').remote;      function init() {        function flip() {          if (frontShow == 2) {            document.getElementById('front').style.display = 'block';          }          else {            document.getElementById('back').style.display = 'block';          }          card.toggleClassName('flipped');        };        var btn_minis = document.getElementsByClassName("sys-btn-mini");        for (var i = 0; i < btn_minis.length; i++) {          btn_minis[i].addEventListener("click", function (e) {            const window = remote.getCurrentWindow();            window.minimize();          });        }        //document.getElementById("sys-btn-maxi").addEventListener("click", function (e) {        //  const window = remote.getCurrentWindow();        //  if (!window.isMaximized()) {        //    window.maximize();        //  } else {        //    window.unmaximize();        //  }        //});        var btn_closes = document.getElementsByClassName("sys-btn-close");        for (var i = 0; i < btn_closes.length; i++) {          btn_closes[i].addEventListener("click", function (e) {            const window = remote.getCurrentWindow();            window.close();          });        }           var card = document.getElementById('card');        var frontShow = 1;        var btn_sets = document.getElementsByClassName("sys-btn-set");        for (var i = 0; i < btn_sets.length; i++) {          btn_sets[i].addEventListener('click', function () { flip(); }, false);        }         card.addEventListener('transitionend', function () {          if (frontShow == 1) {            frontShow = 2;            document.getElementById('front').style.display = 'none';          }          else {            document.getElementById('back').style.display = 'none';            frontShow = 1;          }        }, false);        document.getElementById('btn-ok').addEventListener('click', function () { flip(); }, false);        document.getElementById('btn-cancel').addEventListener('click', function () { flip(); }, false);      };      document.onreadystatechange = function () {        if (document.readyState == "complete") {          init();        }      };    })();  </script></body></html>

最后整個項目的源代碼:https://github.com/starts2000/ElectronQQLogin

總結

以上所述是小編給大家介紹的使用 electron 實現類似新版 QQ 的登錄界面效果(陰影、背景動畫、窗體3D翻轉),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩有码视频在线| 亚洲欧美日韩精品久久亚洲区| 91精品国产自产在线老师啪| 精品无码久久久久久国产| 久久91精品国产91久久跳| 91精品国产91久久久久久吃药| 91麻豆国产精品| 欧美激情奇米色| 日韩中文字幕亚洲| 国产精品久久久久免费a∨大胸| 亚洲欧美中文日韩v在线观看| 久久久精品一区二区三区| 国产99久久精品一区二区永久免费| 久久久av网站| 欧美激情乱人伦| 红桃视频成人在线观看| 欧美香蕉大胸在线视频观看| 日韩精品在线观看网站| 精品亚洲一区二区三区在线观看| 久久久久久久亚洲精品| 亚洲国产成人久久综合一区| www.日韩视频| 亚洲国产精品va| 日韩电影大片中文字幕| 亚洲电影成人av99爱色| 国产精品视频xxxx| 中文日韩在线观看| 国产91精品不卡视频| www日韩中文字幕在线看| 成人中文字幕在线观看| 中文字幕欧美专区| 精品国产依人香蕉在线精品| 色视频www在线播放国产成人| 91精品免费久久久久久久久| 国产精品久久国产精品99gif| 亚洲一区二区三区久久| 欧美有码在线视频| 久久久久久噜噜噜久久久精品| 日韩av电影在线播放| 国产精品视频自拍| 国产91色在线| 欧美黑人一级爽快片淫片高清| 国产这里只有精品| 91精品综合久久久久久五月天| 欧美亚洲国产日韩2020| 国产日本欧美一区| 91禁国产网站| 国产91精品久久久久久久| 久久精品在线播放| 91精品视频在线免费观看| 久久久久久亚洲精品中文字幕| 国产精品久久久999| 国产日韩在线播放| 4388成人网| 国产视频精品xxxx| 欧美中文在线观看国产| 2020久久国产精品| xxxxxxxxx欧美| 日韩在线观看电影| 亚洲成人精品久久久| 亚洲性生活视频| 川上优av一区二区线观看| 日本不卡免费高清视频| 亚洲影视九九影院在线观看| 国产精品免费小视频| 亚洲男人天堂网站| 久久影院中文字幕| 国产精品视频午夜| 欧美亚洲日本网站| 欧美亚洲视频一区二区| 国产欧洲精品视频| 7m第一福利500精品视频| 欧美视频在线观看 亚洲欧| 夜夜狂射影院欧美极品| 国产91精品久| 日韩电影免费观看在线观看| 全球成人中文在线| 欧美精品videossex性护士| 久久精品国产一区二区三区| 亚洲国产精彩中文乱码av在线播放| 欧美午夜www高清视频| 欧美午夜视频在线观看| 日本精品视频网站| 日产精品久久久一区二区福利| 久久免费国产视频| 日韩免费视频在线观看| 欧美美女15p| 久热精品视频在线免费观看| 欧美有码在线观看视频| 欧美电影免费观看高清| 91精品视频在线| 国产精品盗摄久久久| 日韩av中文字幕在线| 国产精品青草久久久久福利99| 91伊人影院在线播放| 久久综合88中文色鬼| 中文字幕欧美亚洲| 9.1国产丝袜在线观看| 91精品国产91久久| 日韩欧美黄色动漫| 久热99视频在线观看| 亚洲伊人一本大道中文字幕| 国产精品高潮呻吟久久av无限| 久久精品亚洲一区| 亚洲国产成人精品电影| 欧美第一淫aaasss性| 欧美亚洲一级片| 亚洲欧美日韩国产中文| 日韩专区在线播放| 日韩电影免费观看在线观看| 精品伊人久久97| 亚洲老板91色精品久久| www.xxxx欧美| 欧美在线亚洲一区| 亚洲福利小视频| 国产99久久精品一区二区| 亚洲精品一区av在线播放| 亚洲精品久久久久| 亚洲人午夜精品免费| 91久久中文字幕| 国内精品久久久久| 久久天天躁狠狠躁夜夜躁2014| 丝袜亚洲另类欧美重口| 国产精品入口日韩视频大尺度| 成人亲热视频网站| 色偷偷噜噜噜亚洲男人的天堂| 92国产精品久久久久首页| 国产精品久久久久久亚洲影视| 欧美精品第一页在线播放| 日韩久久免费视频| 萌白酱国产一区二区| 久久视频这里只有精品| 国产综合久久久久久| 国外成人在线直播| 成人看片人aa| 欧洲美女免费图片一区| 91精品视频免费| 国产精品高潮在线| 青青草国产精品一区二区| 亚洲精品美女在线观看| 国产一区视频在线| 亚洲免费av网址| 精品日本高清在线播放| 美女999久久久精品视频| 欧美成人午夜剧场免费观看| 精品中文字幕乱| 亚洲自拍偷拍在线| 97视频在线观看免费高清完整版在线观看| 亚洲香蕉成人av网站在线观看| 亚洲精品www久久久久久广东| 日韩精品久久久久久久玫瑰园| www.久久撸.com| 色多多国产成人永久免费网站| 欧美午夜影院在线视频| 国产午夜精品全部视频在线播放| 亚洲男人天堂网| 庆余年2免费日韩剧观看大牛| 国产亚洲精品久久久久久牛牛| 亚洲综合日韩在线| 伊人久久久久久久久久久久久| 国产精品视频男人的天堂| 亚洲美女久久久| 欧美性猛交视频| 51精品在线观看|