者:薔薇Nina
原文:https://www.cnblogs.com/wcwnina/p/11297630.html
在CSS里,標簽位置居中一直是困擾Web前端的難題。在本文中,我對這類問題進行了探究和給出了幾點建議,供讀者參考。
1 行內標簽
1.1 水平居中
在父級標簽中使用 text-align: center。
效果:
1.2 垂直居中
如果是單行,則為該標簽設置行高(line-height)且與其父級標簽 height 相等即可。
效果:
如果是多行,稍微有點麻煩,需要在該標簽設置 display: table-cell 和 vertical-align: middle,在其父級標簽設置 display: table。
效果:
2 塊標簽
2.1 水平居中
方法一:在父級標簽中使用 flex 彈性盒子。
效果:
方法二:在該標簽中使用 margin 屬性。
效果:
2.2 垂直居中
在父級標簽中使用 flex 彈性盒子。
效果:
總結:對于行內標簽居中,優先考慮文本對齊(text-align)和顯示單元格(table-cell);對于塊標簽居中,優先考慮顯示彈性盒子(flex)。
lexbox
通常首選方法是使用flexbox居中內容。只需三行代碼即可:display:flex,然后使用 align-items:center 和 justify-content:center 將子元素垂直和水平居中。
如下代碼:
html:
<div class="flexbox-centering">
<div>Centered content.</div>
</div>
css:
.flexbox-centering {
display: flex;
justify-content: center;
align-items: center;
height: 100px;
}
Grid
使用grid(網格)與flexbox非常相似,也是一種常見的技術,尤其是布局中已經使用網格的情況下。與前一種flexbox技術的唯一區別是它顯示為柵格。
如下代碼:
html:
<div class="grid-centering">
<div class="child">Centered content.</div>
</div>
css:
上效果圖:
這是一個用ext3.2.0、js、html、css寫的一個還算好看的登錄界面。
源代碼已上傳,下載地址請點擊:點擊打開鏈接
其主要難點在如何使用extjs來畫一個界面,接下來我們就主要看一下其中的html和js吧:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>登錄界面</title>
- <link rel="stylesheet" type="text/css" href="ext3.2.0/resources/css/ext-all.css"/>
- <script type="text/javascript" src="ext3.2.0/adapter/ext/ext-base.js"></script>
- <script type="text/javascript" src="ext3.2.0/ext-all.js"></script>
-
- <script type="text/javascript" src="login.js"></script>
- <script type="text/javascript" src="loginToDo.js"></script>
-
- <link rel="stylesheet" type="text/css" href="login.css"/>
- </head>
- <body onkeydown="keyLogin(event);">
- </body>
- </html>
這里面主要是導入頁面所需的js和css文件,當然還有一個亮點就是body標簽上的 onkeydown事件屬性,主要用于監聽鍵盤實現我們js中的enter鍵提交功能。然后看一下extjs的語言風格吧:
- Ext.onReady(function () {
-
- // 創建“登錄”面板
- var loginPanel = new Ext.Panel({
- // 設置面板的位置、寬高、樣式
- // 注意:此處我用的是相對布局relative(用于比較兩者的區別)
- id: 'loginPan',
- x: 363,
- y: 0,
- width: 396,
- height: 480,
- baseCls: '',
- defaults: {
- border: false
- },
- // 添加面板里面的物品
- items: [
- {
- // 第一件:logo圖
- id: 'loginLogo',
- height: 160,
- frame: false,
- bodyStyle: 'padding-top:10px',
- html: '<img src="images/fly_icon.png">'
- },
- {
- // 第二件:登錄的表單
- id: 'loginForm',
- defaultType: 'textfield',
- frame: false,
- defaults: {
- allowBlank: false
- },
- // 添加表單里面的物品:兩個輸入框
- items: [
- {
- id: "username",
- cls: "text_field",
- inoutType: 'text',
- width: 330,
- height: 28,
- blankText: '賬號不能為空',
- emptyText: '請輸入賬號',
- },
- {
- id: "password",
- cls: "text_field",
- inputType: 'password',
- width: 330,
- height: 28,
- emptyText: '請輸入密碼',
- blankText: '密碼不能為空',
- }]
- },
- {
- // 第三件:忘記密碼
- id: 'loginForget',
- html: "<a href='forget_pwd.html' target='_blank'>忘記密碼?</a>",
- },
- {
- // 第四件:登錄按鈕
- id: 'loginBtn',
- html: '<button id="btn_login">馬上登錄</button>',
- }
- ],
- });
-
- // 創建“注冊”面板
- var registerPanel = new Ext.Panel({
- // 設置面板的位置、寬高、樣式
- // 注意:此處我用的是絕對布局absolute(用于比較兩者的區別)
- id: 'registerPan',
- x: 0,
- y: 46,
- width: 800,
- height: 389,
- baseCls: '',
- layout: 'absolute',
- defaults: {
- border: false
- },
- // 添加面板里面的物品
- items: [
- {
- // 第一件:標題
- id: 'registerTitleLabel',
- xtype: 'label',
- x: 47,
- y: 50,
- text: '還沒有賬號?',
- }, {
- // 第二件:正文
- id: 'registerContentLabel',
- xtype: 'label',
- x: 47,
- y: 135,
- text: '這是在注冊面板下面的正文內容。里面的內容可以隨便寫,比如當前我們再一個窗口下面建立了兩個面板。而兩個面板的布局是分別用相對布局和絕對布局來實現的。相比較而言,我覺得用絕對布局會簡單粗暴,更直接,更方便。總之,你們自己體會一下吧。',
- }, {
- // 第三件:注冊按鈕
- id: 'registerBtn',
- xtype: 'button',
- x: 47,
- y: 280,
- html: '<button id="btn_register" >馬上注冊</button>'
- }],
-
- });
-
- // 創建窗口,從而讓內容達到居中效果
- var centerWindow = new Ext.Window({
- baseCls: '',
- width: 800,
- height: 480,
- layout: 'absolute',
- closable: false,
- draggable: false,
- resizable: false,
- shadow: false,
- border: false,
- items: [registerPanel, loginPanel],
- });
-
- // 顯示窗口
- centerWindow.show();
-
- // 添加瀏覽器縮放自動居中效果
- Ext.EventManager.onWindowResize(function () {
- centerWindow.center();
- });
- });
這里要說的是:1、注意給屬性加標記,能用id就用id,cls只是一個封裝過的class,和原生的class還是有區別的,比如給一個cls元素的height、padding定義樣式并不起作用。詳見:關于extjs中的cls ≠ class
2、在ext中建議用絕對定位,由于它底層是一個個的table、div塊,如果用相對定位的話偶爾是有偏差的,所以還是絕對定位方便直接啊。
3、window自帶居中效果,可以利用這一點讓元素在屏幕中居中。但是當瀏覽器縮放的時候,這個window并不會動,每次都需要重新刷新一下才會改變一下。所以,在以上代碼的最后我們用給這個centerWindow添加了一個窗口自適應居中的效果。