沐鳴測速註冊_Js如何動態修改css樣式

如何動態修改css樣式

一、使用obj.className來修改樣式表的類名

function changeStyle1() {
  var obj = document.getElementById("btnB");
  obj.style.backgroundColor= "black";
}

缺點:會覆蓋原有的style

二、使用obj.style.cssTest來修改嵌入式的css

function changeStyle2() {
   var obj = document.getElementById("btnB");
   obj.style.cssText = " display:block;color:White;
}

缺點:會覆蓋原有的style

三、使用obj.className來修改樣式表的類名

function changeStyle3() {
  var obj = document.getElementById("btnB");
  //obj.className = "style2";
  obj.setAttribute("class", "style2");
}

優點:不會覆蓋

四、使用更改外聯的css文件,從而改變元素的css

<link href="css1.css" rel="stylesheet" type="text/css" id="css"/>
function changeStyle4() {
   var obj = document.getElementById("css");
   obj.setAttribute("href","css2.css");
 }

實現整體頁面換膚的最佳方案

五、通過js更新這個元素的class屬性

function addClass(element,value) {
    if (!element.className) {
        element.className = value;
    } else {
        newClassName = element.className;
        newClassName += " "; //這句代碼追加的類名分開
        newClassName += value;
        element.className = newClassName;
    }
}

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9445

沐鳴註冊_css設置邊框可以用哪個屬性?

css設置邊框可以用border簡寫屬性,它可以在一個聲明設置所有的邊框屬性,按照border-width、border-style、border-color順序設置;也可以單獨使用這幾個屬性來設置邊框樣式。

邊框屬性介紹:

border屬性:

一個簡寫屬性,在一個聲明中所有的邊框屬性。

可以設置的屬性分別(按順序):border-width, border-style,和border-color.

如果上述值缺少一個沒有關係,例如border:#FF0000;是允許的。

border-width屬性:

border-width 簡寫屬性為元素的所有邊框設置寬度,或者單獨地為各邊邊框設置寬度。

只有當邊框樣式不是 none 時才起作用。如果邊框樣式是 none,邊框寬度實際上會重置為 0。不允許指定負長度值。

border-style屬性:

border-style 屬性用於設置元素所有邊框的樣式,或者單獨地為各邊設置邊框樣式。

只有當這個值不是 none 時邊框才可能出現。

border-color屬性:

border-color 屬性設置四條邊框的顏色。此屬性可設置 1 到 4 種顏色。

border-color 屬性是一個簡寫屬性,可設置一個元素的所有邊框中可見部分的顏色,或者為 4 個邊分別設置不同的顏色。

示例:

1、在一個border簡寫屬性設置邊框。

<html>
<head>
<style type="text/css">
p 
{
border: medium double rgb(250,0,255)
}
</style>
</head>

<body>
<p>Some text</p>
</body>

</html>

2、按照border-width、border-style、border-color屬性順序依次設置邊框樣式。

示例:

<html>
<head>
<style type="text/css">
p 
{
border-width:medium;
border-style:double;
border-color:rgb(250,0,255);
}
</style>
</head>

<body>
<p>Some text</p>
</body>

</html>

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9440

沐鳴登錄平台_程序員如何提高開發技能?

你只在早上9點至晚上5點間編碼,卻擔心這樣不夠好嗎?你看見其他的程序員工作於個人項目或開源項目,參与編程馬拉松,並花費所有的業餘時間編寫軟件了嗎?你可能會認為只在自己的工作時間編碼,只朝九晚五地編寫軟件,將永遠不會非常優異。你可能認為,只有那些連吃飯、睡覺和呼吸間都在編碼的人才能脫穎而出。但實際上堅持一周40小時的工作時間依然可以讓你成為一個有價值的、熟練的程序員。

工作於個人或開源軟件項目不會讓你自然而然地成為一個更好的程序員。編程馬拉松甚至可能會成為負面影響,如果它們讓你覺得構建軟件有任意期限,同時疲憊是生產出任何有價值的東西的一種合理途徑的話。在你富有成效的工作時間中有很多固有的限制。如果你不喜歡回家以後再花費時間去編碼,那就不要過於疲憊,做事也不要拖三拖四和三心二意。

在業餘項目上花費時間確實有一定的價值,但是最有用的結果不僅僅是實踐更是掌握了更多的知識。建立軟件項目往往使用較老的技術和工藝,因為這些工藝技術已經存在了一段時間。你從工作的其他軟件項目和與工作之外的開發人員交流中得到的有價值的知識是:

更廣泛的技術和工具。

新的技術和進程。也許你的公司沒有做太多的測試,但你可以在其他地方了解測試驅動開發。

擁有廣泛的工具和技術無論是對於你現在的工作還是想找一份新工作,都是一個寶貴的技能。但實際的編碼並不是獲得這方面知識的有效方法。因為其實你並不需要使用新的工具和技術,並且無論怎麼樣你永遠不會真正有時間去詳細學習所有的工具和所有的技術。你只能通過了解現在流行什麼工具和技術,這些工具和技術能做什麼,以及什麼情況下能發揮它們最大作用來獲取最有價值的內容。如果你發現了一個能立即應用到工作中的新工具,那麼你可以在工作中學習這個新工具,如果不能應用到工作中,那麼你只能在大腦中歸類等以後來使用它。

學習新的工具也可以幫助你找到新的工作,甚至實際上你沒有使用過它們。我曾在一次面試中被問到關於NoSQL和傳統數據庫的區別。老實說,那時的我從來沒有使用過MongoDB或其他任何NoSQL數據庫,但因為我曾了解過,所以我知道怎麼圓滿地回答。能夠回答這個問題使得面試官相信我能在必要時使用該工具,即使以前我沒有使用過。

與在業餘時間編碼相比,通過直接專註於獲取新的工具和技術方面的知識,也可以獲得相同的好處,並且更有效率。而且,由於這方面的知識將有利於你的僱主,所以你不需要在上面花費顯著的時間,就可以在工作時間內獲取這方面的知識。你覺得每一天都沒有真正空閑的時間,但你總有一段時間是無所事事耗費在互聯網上的。也許你現在正在網上衝浪!你可以利用這段時間來擴大你的知識面。

每周你都應該安排一個小時的時間去學習新的工具和技術。選擇一個特定的時間可以幫助你養成一個習慣。就我個人而言,我會選擇在周五下午,因為在這個時間段我反正也沒什麼可做的。不要因為項目期限的逼近或感到疲勞而跳過這個學習時間。你會在截止時間內做的更好,也不會那麼累,如果你知道正確的工具和技術來高效解決工作中遇到的問題的話。

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9439

沐鳴註冊平台_編程和音樂真的很像嗎?

在過去的幾十年時間里,對音樂作品和編程同時感興趣的計算機科學家成功地將兩者結合在一起。現在的人工智能譜寫的音樂,幾乎與由專業音樂人創建的沒有區別。

很多專業的開發人員對音樂有着真正的激情,以及許多音樂家涉足過編程,這些已經不是什麼秘密。例如,Elvis Costello,一位多產的英國音樂家,被譽為“他那一代最優秀的詞曲作家”,在他的音樂生涯騰飛之前,在上世紀70年代操作IBM 360。

你可以發現為什麼人們會沉溺於這兩個領域:因為創作旋律和編寫算法之間有很多共同之處。從表面上看這兩者似乎頗不相同,但是開發有創造性的一面,而譜曲亦有机械化的一面。那麼,編程和譜曲有什麼相似之處呢?

你的心中已經有音樂的脈動

讓我們先來看一看譜曲和編程之間的相似之處。

1.它們都遵循關於以下邏輯規則

譜曲,和編程一樣,需要古希臘人所謂的三藝。即:

  1. 語法:紮實理解基本原理——樂譜和編程語言規則的理論或知識。
  2. 邏輯:你需要能夠創建“邏輯推理”。當音樂創作或編碼時,你需要遵循邏輯規則使得“活動件”一起正常工作。
  3. 修辭:和語法和邏輯一樣,你需要說服聽眾和新方法的使用者接受標準做法。

如果不遵循作曲和開發的基本原理,一切都無法正常運轉。一個胡亂編寫的程序將充滿bug,在相同意義上,病態的和弦結構會造成樂曲的不和諧。

2.它們從一件件小事開始構建了美的東西

要成為一個偉大的鋼琴家,你必須先練習和完善基礎知識:簡單、重複的音階和琶音。要成為一個偉大的開發者,你需要花費大量時間來確保即使是最簡單的表達式,也能夠優雅和被正確編碼。從一件件小事開始,你漸漸打造出了一個個偉大的東西,因此:

3.你需要能夠見微知著

正如作曲家必須考慮到樂團的不同樂器組以及這些樂器組是如何組合在一起的,而開發者則需要在他們的頭腦中保持一個抽象的“大局觀”,當他們開始構建程序架構的時候。這兩個學科都需要構建一些更大,更好的東西。

4.自我表達是關鍵

音樂和軟件開發都需要創造力和自我表達能力:兩者都需要培養自己的風格,創造一些新的和令人振奮的東西。

5.你需要涉獵技術

音樂家和開發人員需要花費很長的時間來思考他們的創作如何與其他產品交互,以及如何呈現在“最終用戶”的手中。作曲家可能會增加重音符號以指示樂團成員要演奏的風格。吉他手可能會考慮使用外部硬件(amps,效果器等),或他們希望在錄音室里製作他們的歌曲。同樣的,開發人員需要牢記別人將在哪種設備和什麼上下文中如何使用他們的最終產品。

6.兩者都包括協作和個人主義

莫扎特單獨花了很多時間來想他的下一個曲譜,儘管如此,他依然需要與他人合作——也就是他指揮的樂師。同樣,最成功的開發人員絕對不是一個純內向的人:他們需要與最終用戶、經理和用戶體驗設計師等人員合作。

我不是音樂開發人員!

雖然兩者有很多的共同點,但一些反對意見也值得我們聽一聽。不是每一個開發人員都能成為下一個貝多芬!

1.這個比喻是不是只是一種我們作為開發人員吹牛和顯擺的方式?

正如Coding Horror博客的作者認為的那樣,開發人員將自己的技藝與繪畫,音樂或其他藝術形式之間作比較不僅僅是一種比喻,更多的是一種自我誇耀。當然,我們都希望我們正在構建的app能夠像Gershwin的音樂一樣棒一樣好,或者我們剛剛設計好的網站能夠像Miles Davis的《Kind of Blue》一樣影響深遠。但說實話,這的確大不相同,不是嗎?

2.編程是為了解決問題

當你被要求去設計一個app的時候,通常是為了解決問題,例如,特定的業務或消費者問題。開發人員善於解決此類問題,但這是否真的可以比作音樂?從最純粹的角度看,譜曲是純真感情和情緒的迸發和表達。

3.編程有一個非常不同於音樂的目的

當你開發任意一種工具時,最終目標是讓終端用戶能夠做一些具體的事情。假設你正在構建一個業務app——你的創作應該意味着為最終用戶的日常工作提供便利。相比之下,音樂,則並沒有一個特定的“目的”,只是一種超越純粹的享受。

它們有多重要

我們依然無法做出決定:雖然顯然,譜曲和開發絕對有着一些共同的因素,但它們也有很多區域是存在分歧的。我們所知道的是,開發人員和音樂家都可以豐富我們的生活,並給我們一些以前不知道我們需要,但是現在生活不能沒有的東西。

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9438

沐鳴註冊網站_JavaScript中this指向問題

記得初學 JavaScript 時,其中 this 的指向問題曾讓我頭疼不已,我還曾私自將其與閉包、原型(原型鏈)並稱 js 武林中的三大魔頭。如果你要想在 js 武林中稱霸一方,必須將這三大魔頭擊倒。個人認為在這三大魔頭中,this 指向問題的武功最菜(難度最低)。俗話說柿子撿軟的捏,那我們就先從 this 指向問題下手。

先記住攻克 this 指向問題的口訣(前輩們的總結):哪個對象調用函數,函數里的 this 就默認指向哪個對象(注意 this 只能指向對象)。這裏說“默認指向”是因為我們通過箭頭函數、call、apply、bind等手段來改變 this 的指向。現在我們只討論 this 的默認指向。

全局作用域下以及全局作用域的函數中,this默認指向全局對象window

在嚴格模式下,全局作用域的函數中,this默認指向 undefined, 這是嚴格模式所規定的。

// 非嚴格模式下
console.log(this); // Window
function doSomething(){
    console.log(this); // Window
}
doSomething(); // 這裏可以看成window.doSomething(),所以函數里的this指向全局對象window
// 嚴格模式下
'use strict';
console.log(this); // Window
function doInStrict(){
    console.log(this); // undefined
}
doInStrict();

對象里的函數,this指向該對象

var a = 1;
var obj = {
    a: 2,
    fn: function(){
        console.log(this); // {a: 2, fn: ƒ}
        console.log(this.a); // 2
    }
};
obj.fn();

上面函數被調用后,從打印結果可以看出此時 this 指向的是調用函數的對象 obj。如果將對象中的函數賦給全局對象中定義的變量 fn1,執行 fn1 又會出現什麼結果呢?

var a = 1;
var obj = {
    a: 2,
    fn: function(){
        console.log(this); // Winidow
        console.log(this.a); // 1
    }
};
var fn1 = obj.fn;
fn1(); // 可以看成window.fn1();

從上面的例子可以看出,fn1 與 obj.fn 指向的函數是相同的,但是調用它的對象不同,那麼函數中 this 的指向也就不一樣了。

再看一個比較複雜的例子:

var a = 0;
function fn(){
	consoloe.log(this.a);
}
var obj1 = {
	a: 1,
	fn: function(){
		console.log(this.a);
	}
};
var obj2 = {
	a: 2,
	fn: function(){
		fn();
		obj1.fn();
		console.log(this.a);
	}
}
obj2.fn();

先說下執行結果,分別打印 0 1 2。當 obj2 調用 fn 函數時,先執行的是 fn(),這個函數是在全局作用域中定義的,該調用可以看成 window.fn(),所以,該函數內部的 this 指向的是 window 全局對象,this.a 自然就是全局對象中的 a 值(0)。

接着執行的是 obj1.fn(),它會從 obj1 中找到 fn 函數並執行。obj1 中的函數 fn 執行時調用它的對象是 obj1,所以,此時函數內部的 this 指向的就是 obj1 自身。那麼 this.a 查到的值也就是對象 obj1 中 a 的值(1)。

最後打印函數中 this 所處的函數 fn 是被 obj2 調用的,那麼自然而然 this 就指向了 obj2,所以 this.a 的結果就是 2 了。

從上面這個例子我們可以看出:函數內部 this 指向跟調用函數的對象有關,跟函數在哪裡調用沒有關係。

Window內置函數的回調函數中,this指向Window對象。

window 的內置函數( setInterval setTimeout 等),其回調函數中的 this 指向的是window對象。

var name = 'window';
var obj = {
    name: 'obj',
    func: function(){
        setTimeout(function () {
            console.log(this.name) // window
        },1000)
    }
}

obj.func()

但是一般在開發中,很多場景都需要改變 this 的指向。
this 既不指向函數自身也不指向函數的詞法作用域,this 實際上是在函數被調用時發生的綁定,它指向什麼完全取決於函數在哪裡被調用。
找到函數直接調用的位置後用下面的幾條規則就可以判斷出 this 的綁定對象。

  1. 由 new 調用?綁定到新創建的實例對象上。
  2. 由 call、apply、bind調用?綁定到指定的對象上。
  3. 由上下文對象調用?綁定到那個上下文對象上。
  4. 默認:在嚴格模式下綁定到 undefined,否則綁定到全局對象 Window 上。
  5. ES6 中的箭頭函數會繼承外層函數調用的 this 綁定,這和 var self = this;的綁定機制一樣。

來自:https://www.cnblogs.com/laozhenHome/p/13262592.html

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9430

沐鳴登陸地址_不要過度使用React.useCallback()

我博客的一位讀者在Facebook上聯繫到我,提出了一個有趣的問題。他說,他的隊友不管在什麼情況下,都會把每一個回調函數封裝在 useCallback() 裏面。

import react, { useCallback } from 'react';

function MyComponent() {
  const handleClick = useCallback(() => {
    // handle the click event
  }, []);

  return <MyChild onClick={handleClick} />;
}

“每個回調函數都應該被記住,以防止使用回調函數的子組件被無用地重新渲染”,這是他的隊友的理由。

這句話與事實相去甚遠。此外,useCallback() 的這種用法會使組件變慢,從而損害性能。

在本文中,我將解釋如何正確使用 useCallback()。

1.了解函數相等性檢查

在深入研究 useCallback() 用法之前,讓我們區分一下鈎子要解決的問題:函數相等性檢查。

讓我們定義一個名為 factory() 的函數,該函數返回函數:

function factory() {
  return (a, b) => a + b;
}

const sum1 = factory();
const sum2 = factory();

sum1(1, 2); // => 3
sum2(1, 2); // => 3

sum1 === sum2; // => false
sum1 === sum1; // => true

sum1 和 sum2 是將兩個数字相加的函數,它們是由 factory() 函數創建的。

函數 sum1 和 sum2 共享相同的代碼源,但是它們是不同的對象,比較它們 sum1 === sum2 結果為 false。

這就是JavaScript的工作方式,對象(包括函數對象)僅等於其自身。

2.useCallback() 的目的

共享相同代碼的不同函數實例往往在react組件內部創建。

當 react 組件主體創建一個函數(例如回調或事件處理程序)時,這個函數會在每次渲染時重新創建。

import react from 'react';

function MyComponent() {
  // handleClick在每次渲染時重新創建
  const handleClick = () => {
    console.log('Clicked!');
  };

  // ...
}

handleClick 在 MyComponent 的每次渲染中都是一個不同的函數對象。

因為內聯函數很“便宜”,所以在每次渲染時重新創建函數不是問題,每個組件有幾個內聯函數是可以接受的。

然而,在某些情況下,你需要保留一個函數的一個實例:

  • 包裝在 react.memo()(或 shouldComponentUpdate )中的組件接受回調prop。
  • 當函數用作其他hooks的依賴項時 useEffect(…,[callback])

這就是當 useCallback(callbackFun, deps) 幫助你的情況:給出相同的依賴值 deps,hook在兩次渲染之間返回相同的函數實例。

import react, { useCallback } from 'react';

function MyComponent() {
  // handleClick是同一個函數對象
  const handleClick = useCallback(() => {
    console.log('Clicked!');
  }, []);

  // ...
}

handleClick 變量將在不同的 MyComponent 的渲染之間始終擁有相同的回調函數對象。

3.一個好用例

想象一下,你有一個呈現大的項目列表組件:

import react from 'react';

function MyBigList({ items, handleClick }) {
  const map = (item, index) => (
    <div onClick={() => handleClick(index)}>{item}</div>;
  );
  return <div>{items.map(map)}</div>;
}

export const MyBigList = React.memo(MyBigList);

MyBigList 渲染了一個項目列表,要知道這個列表可能很大,可能有幾百個項目。要保留重新渲染的列表,可以將其封裝到 React.memo 中。

單擊一個項目時,MyBigList 的父組件需要提供項目列表和處理程序功能。

import React from 'react';

import useSearch from './fetch-items';

function MyParent({ term }) {
  const handleClick = useCallback((item) => {
    console.log('You clicked ', item);
  }, [term]);

  const items = useSearch(term);

  return (
    <MyBigList
      items={items}
      handleClick={handleClick}
    />
  );
}

handleClick 回調由 useCallback() 記憶。只要 term 變量保持不變,useCallback() 就會返回相同的函數對象。

即使由於某些原因重新啟用了 MyParent 組件,handleClick 仍保持不變,並且不會破壞 MyBigList的記憶。

4.一個“壞”的用例

讓我們回顧一下本文簡介中的示例:

import React, { useCallback } from 'react';

function MyComponent() {
  const handleClick = useCallback(() => {
    // handle the click event
  }, []);

  return <MyChild onClick={handleClick} />;
}

function MyChild ({ onClick }) {
  return <button onClick={onClick}>I am a child</button>;
}

記住 handleClick 是否有意義?

沒有,因為調用 useCallback() 需要很多工作,每次渲染 MyComponent 時,都會調用 useCallback() Hook。

從內部來講,React確保返回相同的對象函數。即便如此,內聯函數仍然在每次渲染時創建,useCallback() 只是跳過了它。

即使用 useCallback() 返回相同的函數實例,也不會帶來任何好處,因為優化要比沒有優化花費更多。

不要忘記增加的代碼複雜性,你必須確保 useCallback() 的 deps 與您在 memoized 回調中使用的 deps 保持同步。

只需接受每次重新渲染時創建新的函數:

import React, { useCallback } from 'react';

function MyComponent() {
  const handleClick = () => {
    // handle the click event
  };

  return <MyChild onClick={handleClick} />;
}

function MyChild ({ onClick }) {
  return <button onClick={onClick}>I am a child</button>;
}

5.總結

任何優化都會增加複雜性,任何過早添加的優化都會帶來風險,因為優化后的代碼可能會多次更改。

原文:https://dmitripavlutin.com/dont-overuse-react-usecallback/

作者:Dmitri Pavlutin

翻譯:微信公眾號《前端外文精選》

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/8995

沐鳴註冊網站_IT 已成為最瘋狂的加班行業,沒有之一

原文作者:人民日報經濟社會 – 林麗鸝

據說,某互聯網公司招了個日本人做研發,上班第一天就對部門同事說:“我在日本工作時是個加班狂,每天都很晚回家,希望大家跟上我的步伐。”一個月之後他辭職回日本了,扔下一句話:“你們這樣加班,經常睡在公司是很不人道的。”

程序猿問科比:“科比,你為何如此成功?”科比反問:“你知道洛杉磯每天凌晨4點的樣子嗎?”程序猿:“知道,那個時候我一般還沒下班。你問這個幹嘛?”科比:“不幹嘛,草!”談話結束了!

IT已成為最瘋狂的加班行業,沒有之一

夜幕降臨,當IT大樓里依然燈火通明時,那一刻,我彷彿王進喜、石傳翔等勞模靈魂附體,我知道我不是一個在加班,我不是一個人!連續9個通宵加班都不是事,一點不誇張,這是本人的親身經歷。

過度加班,為啥我們就停不下來了呢?

無效加班:連夜忙真能出活嗎?“ 有時候主管布置任務,事先缺少溝通,大家加班好幾天,成果出來了,最後用不上,工作忙卻沒有效率,做了無用功。”——深圳程序員韓軒

韓軒是一名在深圳打拚的程序員,“夜夜做項目,敲碼到凌晨;左右不是人,都是‘程序猿’。”程序員自稱“程序猿”,有幾分自嘲和無奈。

每個月要加多少班? 韓軒沒仔細算過:“ 加班補貼每小時15 元,周六翻倍,我每月的加班費通常有3000 元左右,這樣算下來每天加班至少在4 個小時以上。”

一次,韓軒所在部門為某銀行開發新程序,對方要得緊,工作重任務急。當時,他每周都要干滿6天,每天從早上9點至少工作到晚上10點,有時還要通宵加班。

我國《勞動法》規定,勞動者每日工作時間不超過8小時、平均每周工作時間不超過44小時。因特殊原因需要延長工作時間的,每日不得超過3 小時,每月不得超過36 小時。

韓軒說,他並不知道自己加班已經超過了《勞動法》規定的上限。“ 現在工作難找,有一個穩定的飯碗不容易。再說,雖然總是加班,但公司會按時發加班費,這比很多單位強。”

為了省時間,韓軒中午和晚上都在公司吃外賣,吃完繼續堆代碼,每周僅有的一天休息日基本都在補覺。“有一種肥,叫做‘ 加班肥’,在這家公司工作一年,我就胖了十幾斤,上樓都喘,身體素質大不如前。”

某餐飲外賣公司對全國多個大城市24小時訂單的統計显示,深圳在晚上7 點至次日5 點的訂餐比例高居榜首,訂餐者大多是深夜忙碌的加班員工。

工作忙、時間緊,常常是加班的原因。但在韓軒看來,有的加班效率不高:

“ 平時,公司領導常叮囑大家注意健康,但在布置工作時就顧不上這些,安排的工作量經常超標,不加班根本完不成。不少任務事先缺少溝通,大家加班好幾天,成果出來了,最後用不上,工作忙卻沒有效率,做了無用功。”

韓軒說:“即使按時完成工作,客戶通常也會不斷讓你修改、優化。因此,有些人第一次交上去的時候就給自己留下了‘優化’的空間,然後加班磨洋工。很少有員工願意跟公司就加班問題討價還價,只要還打算在那兒工作,就得忍着。除非用腳投票,跳槽換東家。”

前不久,受不了長期加班之苦,韓軒跳槽到另一家公司,“雖然還是編程序,但這家公司很開明。公司領導表示,如果員工總加班,一定是工作安排有問題,比如,需要一個星期完成的任務只給了三四天。為此,公司注意改進管理方式,合理分配工作。”由於上下級之間溝通順暢,大家幹勁十足,工作效率也提高了。

“現在,我上班時間差不多就能把工作完成。下班后,還能看看書、會會朋友,周末也有時間陪家人。工作不再乏味枯燥,生活也有意思多了。”韓軒說。

無謂加班:“只爭朝夕”就要犧牲休息日嗎?

“周末開會,表面看充滿了一種只爭朝夕、夙夜在公的‘工作幹勁’,其實應該反過來想想:到底有多少真正要緊的事非得在周末興師動眾?”——北京某雜誌社編輯陸晶

陸晶在北京一家雜誌社工作,談起加班,她有很多話要說:“我的生活都被加班擠佔了,不是在開會,就是在出差;不是在採訪,就是在趕稿。”

陸晶坦承,最初加班是自己拖沓造成的:“我剛開始做記者時,寫稿精力不集中,不時聊聊天、看看手機,上班時沒效率,只好晚上加班接着干。”

“但很多時候,連續加班是單位對工作安排不合理造成的,這其實是對職工休息權的漠視。”陸晶說,“我還曾經參加過一個採訪團,連續出差兩周,周末也在工作。組織者壓根兒就沒有考慮過周末需要休息,反而認為周末採訪是‘敬業’。”

陸晶認為,很多在休息時間安排的加班完全可以避免,“有一個周末,我正陪父母逛街,突然接到同事電話,說有急事要集體到單位加班。我連忙趕到辦公室,原來,是主編認為一篇稿子的結構有問題,要集體討論修改。其實,稿子的出版日期排在了下個月,完全可以等第二天上班再說。”

陸晶注意到很多公司、機關習慣於在周末開會。每次開會都是單位領導帶頭,上上下下一片忙碌,“周末開會,表面看充滿了一種只爭朝夕、夙夜在公的‘工作幹勁’,其實應該反過來想想:到底有多少真正要緊的事非得在周末興師動眾?”

陸晶認為,不少無謂加班還與外在競爭壓力太大有關:到了下班時間,領導還沒走,你敢走嗎?同事還在工作,你好意思先下班嗎?如果比其他人下班早,會不會顯得工作態度不积極?“ 如果都這麼熬時間,能力強的人往往被能力低的人‘ 熬’走了。”陸晶說。

一些流行的價值觀也助長了加班之風。“ 父母從小就告訴我‘ 先吃苦后享福’,似乎一定要奮鬥出成績才有權休息。”陸晶說,“ 在此觀念下,許多人恨不得時時刻刻都在勤奮努力,而又不自覺地‘勤中偷懶’,結果造成工作時低效、休息時忐忑,實際上是生活、工作‘兩傷’。”工作時間科學規劃、統籌安排,是減少無謂加班的利器。“ 就我所在的團隊來說,過去總是在周五開選題會,組長還催促大家周末落實。周末聯繫不到採訪對象,大家各自為政,手忙腳亂卻沒什麼成果,更得不到休息。今年開始,選題會改為周一開,大家在辦公室當面溝通、定好方案就馬上執行,加班少了,雜誌的質量也不降反升。”陸晶說。

無償加班:加班費容易領到嗎?

“加班多是計劃之外的,很難事先申請。還有人習慣回家加班,很難精確記錄加班時間。申報程序太複雜,實際上是給員工領加班費設置障礙。”——上海某上市公司財務經理張光宇

人在職場,要求“零加班”也不現實。既然總會有人加班,就應該明確加班補償,不能無條件加班。

《勞動法》規定,安排勞動者延長工作時間的,支付不低於工資150%的工資報酬。休息日安排勞動者工作又不能安排補休的,支付不低於工資200%的工資報酬。法定休假日安排勞動者工作的,支付不低於工資300%的工資報酬。然而,這樣的規定在現實中顯得很尷尬,人們吐槽說:“年薪制的意思就是不給加班費”“腦力勞動都是包月不計流量”“加班費不是想領就能領”……

張光宇以前在上海一家外資諮詢公司工作,“ 我們拿年薪確實沒有加班費,有時候趕上一個日程緊張的項目,五加二、白加黑很尋常。”

今年初,張光宇跳槽到一家上市公司擔任財務經理。這家公司規定,員工加班有加班費,但能領到的人寥寥無幾。原來,按公司規定,員工加班要提前打報告申請,獲批后的加班才算加班,沒申請的加班不算加班,並且員工還要詳細記錄加班的時間,上報核實后才能領加班費。

“ 加班大多是計劃之外的,工作沒做完自然而然地多做一會兒,很難事先申請。”張光宇說,“ 還有人習慣回家加班,很難精確記錄加班時間。我的團隊成員都反映申報程序太複雜,從來沒報過加班費。”

張光宇認為,設計繁瑣的加班費申報程序,實際上是給員工領取加班費設置障礙:“ 很多人為了保住飯碗,加班費難領也只好無償加班。”

除了加班費,勞動者加班后還可以調休。“ 我在外資諮詢公司時,如果一個項目擠占太多周末,項目負責人會幫組員申請增加幾天帶薪假期。但新公司沒有這樣的調休制度。”張光宇表示,“ 希望用人單位能充分尊重勞動者申請調休的權利。”

專家認為,確保勞動者的休息權,不僅有賴於相關法律的進一步健全,還需要企業細化管理;不僅需要管理者增強尊重勞動者的觀念,也需要勞動者自己珍視與用好休息權。對此,管理部門和各級工會應切實發揮作用。

國外如何對待加班?

上班時間高效工作

主動加班可以倒休

延時加班給予補償

1、美國:老闆付不起加班費

美國人在工作時間上很較真,到點就走人,1分鐘都不差。當然,如果有急活需要加班,他們也會配合,但加班費比正常薪水高出一倍以上,公司還得給加班職工叫個披薩餅之類的外賣。長時間加班,美國僱員是不會幹的,老闆也付不起加班費。沃爾瑪公司就曾被“加班費”絆倒過三次:2005年,因侵佔員工休息時間,沃爾瑪被加州一家法院判決賠償1.72億美元;2006年,賓夕法尼亞州一陪審團裁定,沃爾瑪因存在強迫員工在休息時間工作的行為,需支付7800萬美元的罰款;2007年,該公司又為5萬名加州員工支付了超過390萬美元的加班補償,同時支付19.89萬美元的民事罰款。這“肉”割得讓人心疼吧?

2、德國:用高效工作避免加班

除了醫生、護士等專業性、時間性極強的職業外,德國普通職員大多在傍晚五六點鐘按時下班回家,和家人共進晚餐或與朋友聚會。如果確實無法按時完成工作該怎麼辦呢?德國人一般會採取兩種對策:第一,更加高效地工作。很多德國人清晨就開始抓緊工作,有時甚至不吃午飯。總之,他們會想方設法在下午5點之前完成手中的任務。第二,堅持責任不在自己身上。也就是說,如果不能按時結束工作,就設法證明是因為公司沒有雇傭與工作量相符的勞動力,才導致工作做不完,應該由公司負責。基於以上兩點,德國人總能準時下班。

3、英國:長時間加班可倒休

大部分英國公司都制訂了“加班須申請”的制度。比如,倫敦某金融公司規定:員工單日加班超過2小時,必須提前2天申請;申請時需寫明加班時間、加班期間工作內容,並獲得至少兩位上司批准。長時間加班基本上都可以靈活地換成今後的倒休。英國法定帶薪假期是每年28天,有些公司明確規定,若員工在年底未完成標準的休假天數,就扣除其相應天數的工資。僱主們主動提醒員工休假,也是希望員工能以更加飽滿的身心狀態回到工作崗位。

4、日本:開始鼓勵員工向加班說“不”

加班,是日本職場人的常態。日本加班現象之嚴重是出了名的,連“過勞死”一詞也產生於日本。這些年,日本政府察覺到加班帶來的一系列問題,鼓勵企業採取措施讓員工準時下班。貿易公司伊藤忠商事表示,願意以更早的下班時間來吸引應屆畢業生;打印機製造商理光明確禁止在晚上8點以後工作;優衣庫服裝連鎖店的運營商迅銷還醞釀推出4小時工作制,滿足那些想要更好平衡工作與生活的員工需求。

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9088

沐鳴總代理_JavaScript重構技巧_ 數組,類名和條件

JavaScript 是一種易於學習的編程語言,編寫運行並執行某些操作的程序很容易。然而,要編寫一段乾淨的JavaScript 代碼是很困難的。

在本文中,我們學習如何使用數組來代替條件語句,以及如何使用classList操作類名。

用數組檢查替換長表達式

平時開發中,我們可能會寫如下的代碼:

if (fruit === 'apple' || fruit === 'orange' || fruit === 'grape') {
  //...
}

對於上面,我們可以使用一些數組方法來減少條件表達式的長度。

一種方法是使用數組的include方法:

if (['apple', 'orange' ,'grape'].includes(fruit)) {
  //...
}

如果傳遞給參數的值包含在數組實例中,include方法返回true,否則返回false。

另一種方法是使用數組的some方法:

if (['apple', 'orange', 'grape'].some(a => a === fruit)) {
  //...
}

通過some方法,我們可以檢查回調中是否存在具有給定條件的數組元素。

如果存在一個或多個,則返回true,否則返回false。

在 DOM 元素中使用 classList 屬性

檢查 DOM 元素中是否存在類並操作多個類的最簡單方法是使用classList屬性。

例如,如果要添加多個類,可以使用下面方式:

const p = document.querySelector('p');
p.classList.add('foo');
p.classList.add('bar');
p.classList.add('baz');

這樣,我們可以添加多個類而無需操作字符串。 我們只是獲得DOM元素對象的classList屬性,然後調用add通過將帶有類名的字符串傳遞到add方法中來添加類。

現在,渲染的DOM元素具有foo,bar和baz類。

同樣,我們可以調用classList屬性的remove方法,該方法使用一個帶有要刪除的類名的字符串來刪除該類。

例如,我們可以這樣寫:

const p = document.querySelector('p');
p.classList.add('foo');
p.classList.add('bar');
p.classList.add('baz');
p.classList.remove('baz');

要檢查 DOM 元素對象中是否存在類名,可以使用contains方法。

例如,我們可以這樣寫:

const p = document.querySelector('p');
p.classList.add('foo');
p.classList.add('bar');
const hasBaz = p.classList.contains('baz');

上面判斷 p 元素是否包含 baz 類,因為 p 沒有包含 baz類,所以返回 false。

classList屬性還有toggle方法,表示切換類(添加或者移除),例如下面的代碼:

const p = document.querySelector('p');
const button = document.querySelector('button');
p.classList.add('foo');
p.classList.add('bar');

button.onclick = () => {
  p.classList.toggle('bar');
}

每點擊一次按鈕,p 的上 bar 類就會添加或者移除。

clasList屬性有一個類似數組的可迭代對象,稱為DOMTokenList對象。因此,我們可以使用展開操作符將其轉換為數組,將clasList轉換為一個帶有類名的字符串數組。

例如,我們可以這樣寫:

const p = document.querySelector('p');
p.classList.add('foo');
p.classList.add('bar');
const classArr = [...p.classList];

上面 classArr 最終值為[“foo”, “bar”]。

一旦我們將DOMTokenList轉換為一個數組,那麼我們就可以使用任何數組方法來操作代碼。

總結

帶有 || 操作的長條件語句,我們使用對應數組方法來進行優化。

要操作多個類名,我們應該使用作為DOM元素對象一部分的classList屬性。通過這種方式,我們可以添加、刪除和切換類,而不需要操作字符串並自己將其設置為className屬性。

原文:https://levelup.gitconnected.com/javascript-refactoring-tips-making-functions-clearer-and-cleaner-c568c299cbb2

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9292

沐鳴怎麼當代理?_深入探索 CSS Grid

簡介

本教程將深入探討 css 網格布局,並探索幾乎所有的屬性和功能。讀完之後,你將能夠用這種出色的 css 附加功能去處理任何一種布局。

術語:Grid

Grid 是二維網格系統。它可以用來構建複雜的布局以及較小的界面。

屬性:display

只需要把一個元素的 display 屬性設置為 grid,它就成了網格。

.grid-to-be {
    display: grid;
}

這樣就使 .grid-to-be 成為 grid 容器,並使其子項成為 grid 項目

術語:網格線

在定義明確的網格軌道時會創建網格線。你可以用它們去放置網格項

術語:網格軌道

網格線是兩條網格線之間的空間。網格中的行和列是網格軌道。

屬性:grid-template-columns

可以使用 grid-template-columns 屬性來創建列。要定義列,應該按照你希望它們在網格中出現的順序,把grid -template-columns 屬性設置為列大小。我們來看一下:

.grid {
    display: grid;
    grid-template-columns: 100px 100px 100px;
}

這裏定義了三個寬度為 100px 的列。所有網格項將會按順序排列在這些列中。行高將等於該行中最高元素的高度,但是可以用 grid-template-rows 來進行更改。

請注意,在僅定義列而未定義行的情況下,元素將會填充列,然後在行中折返。這是由於 Grid 使用了網格線和網格線創建的隱式網格。

屬性:grid-template-rows

grid-template-rows 用於定義網格中行的數量和大小。它的語法和 grid-template-columns 類似。

.grid {
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
}

如果只有 grid-template-rows 而沒有 grid-template-columns 屬性會導致列寬等於該行中最寬元素的寬度。

屬性:grid-template

grid 是 grid-template-rowsgrid-template-columns 和 grid-template-areas 三個屬性的簡寫。

使用方式如下:

.grid {
    grid-template:
        "header    header     header"  80px
        "nav       article    article" 600px
        / 100px 1fr;
}

你可以像平時那樣去定義模板區域,將每行的寬度放在最右面,最後再把所有列的寬度放在正斜杠之後。像以前一樣,你可以把所有內容放在一行。

數據類型:

fr 是為 css 網格布局創建的新單位。 fr 使你不需要計算百分比就能創建靈活的網格, 1fr 表示可用空間的一等份。可用空間被分為等份数字的總數個,所以 3fr 4fr 3fr 把空間劃分為 3 + 4 + 3 = 10 個部分,分別為三行或列分配 3、4 和 3 個等份的可用空間。例如:

.grid {
    display: grid;
    grid-template-columns: 3fr 4fr 3fr;
}

如果將固定單位與彈性單位相混合,則每個等份的可用空間是在減去固定空間後計算的。讓我們看另一個例子:

.grid {
    display: grid;
    grid-template-columns: 3fr 200px 3fr;
}

單個等份的寬度是這樣計算的:( .grid 的寬度 – 200px) / (3 + 3) 。如果存在間隔(gutter)的話,其空間一開始也會從 .grid 的寬度中減去。這是 fr 和 % 之間的區別,即百分比不包括你用 grid-gap 定義的 gutter。

這裏的 3fr 200px 3fr 基本上等於 1fr 200px 1fr。

顯式網格和隱式網格

顯式網格是使用屬性 grid-template-rows 或 grid-template-columns 創建的網格。隱式網格由 Grid 創建的 網格線 和 網格軌道 組成,用來保存帶有 grid-template-* 屬性的手動創建的網格之外的項目。

自動放置(Auto-placement)

當我們創建這樣的網格時:

.grid {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
}

即使我們只定義了列,但作為 .grid 直接子項的單個單元格仍按行放置。這是因為 Grid 包含自動放置規則。

屬性:grid-auto-columns

沒有被 grid-template-columns 所定義的隱式創建的網格列軌道所創建的列的大小,可以用 grid-template-columns 屬性定義,其默認值為 auto;你可以把它設置為自己所需要的值。

.grid {
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-auto-columns: 50px;
}

屬性:grid-auto-rows

grid-auto-rows 的工作方式類似於 gridtemplatecolumns 。

.grid {
    display: grid;
    grid-template-rows: 100px 100px 100px;
    grid-auto-rows: 50px;
}

屬性:grid-auto-flow

grid-auto-flow 屬性控制 網格單元 如何流入網格,其默認值為 row

.grid {
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-auto-flow: column;
}

上面網格中的“網格單元”將會被一一填充,直到沒有剩餘的項目為止。

基於行的放置

用行號將項目放置在網格中的操作被稱為基於行的放置。

屬性:grid-row-start

如果你希望特定的網格項從特定的行開始,則可以這樣:

.grid-item {
    grid-row-start: 3;
}

屬性:grid-row-end

如果你希望特定的網格項目在特定的行上結束,則可以這樣:

.grid-item {
    grid-row-end: 6;
}

屬性:grid-column-start

如果你希望特定的網格項目從特定的列開始,可以這樣:

.grid-item {
    grid-column-start: 3;
}

屬性:grid-column-end

如果你希望特定的網格項在特定的列上結束,可以這樣:

.grid-item {
    grid-column-end: 6;
}

屬性:grid-row 和 grid-column

可以用 grid-row 和 grid-column 屬性來手動放置和調整網格項目的大小。每個屬性都是其各自的 star 和 end 屬性的簡寫:grid-row-startgrid-row-endgrid-column-start 和 grid-column-end

用正斜杠 “/ ”來分隔開始和結束值:

.grid-item {
    grid-column: 3 / 5;
    grid-row: 2 / 7;
}

屬性:grid-area

你可以把 grid-area 用於對網格行和網格列的簡寫。它是這樣的:/ / /

.grid-item {
    grid-area: 2 / 3 / 7 / 5;
}

該代碼的行為與上一個標題中的代碼相同。

跨網格的元素

要使一個元素跨網格,可以使用 grid-row 或 grid-column 屬性。設置起始行 1 和結束行 -1。此處 1 表示相關軸上最左邊的網格線,-1 表示相關軸上最右邊的網格線。在從右到左的書寫腳本中,這是相反的,即 1 表示最右邊的行,-1 表示最左邊的行。

.grid-item-weird {
    grid-column: 1 / -1;
}

如果你希望單個項目佔據整個網格,可以對 grid-row 和 grid-column 都這樣做:

.grid-item-weird {
    grid-row: 1 / -1;
    grid-column: 1 / -1;
}

或者簡單地:

.grid-item-weird {
    grid-area: 1 / 1 / -1 / -1;
}

關鍵字:span

當使用 grid-row 和 grid-column 時,不用顯式定義行號,而是可以用 span 關鍵字來聲明該項應涵蓋的行數或列數:

.grid-item {
    grid-column: 3 / span 2;
}

你也可以把項目固定在終點線上,並朝另一個方向跨越。下面的代碼實現了與上面相同的結果:

.grid-item {
    grid-column: span 2 / 5;
}

可以用相同的方式把 span 應用在行上。

術語:網格單元

網格單元格是四個相交的網格線之間的空間,就像表格中的單元格一樣。

術語:網格區域

網格區域是佔據網格上一個矩形區域的網格單元。它們是用命名的網格區域或基於行的放置創建的。

屬性:grid-template-areas (& grid-area)

除了用諸如 span、grid-column之類的東西放置和調整單個網格項目外,還可以用所謂的“模板區域”。grid-template-area 允許你命名網格區域,以便網格項目可以進一步填充它們。

.grid {
    display: grid;
    grid-template-columns: 100px 1fr 100px;
    grid-template-rows: 100px 800px 100px;
    grid-template-areas:
        "header     header   header"
        "sidebar-1  content  sidebar-2"
        "footer     footer   footer"
}

這裏的一對引號代表一行網格。你可以將所有內容放在一行中,而不用列對齊,但是我所做的只是為了使它看起來更加整潔。我首先定義了三列三行,然後為每個單元命名。通過在第一行中重複執行三次 “header”,告訴 css 要做的是用名為 header 的網格項覆蓋整個過程。其餘的也一樣。

以下是通過用 grid-template-areas 命名每個網格項目,使其擁有為其定義的空間的方式:

.header {
    grid-area: header
}

.sidebar-1 {
    grid-area: sidebar-1
}

.content {
    grid-area: content
}

.sidebar-2 {
    grid-area: sidebar-2
}

.footer {
    grid-area: footer
}

沒有什麼比這更容易了,尤其是用於布置內容的 css 其他方法。

在前面你已經看到 grid-area 也用於基於行的定位。

如果想把單元格留空,則可以用點 . 來設置:

.grid {
    display: grid;
    grid-template-columns: 100px 1fr 100px;
    grid-template-rows: 100px 800px 100px;
    grid-template-areas:
        "header header header"
        "sidebar content sidebar"
        "footer footer ."
}

在這裏,頁腳以第二列結束。

屬性:grid-template

grid 是 grid-template-rowsgrid-template-columns 和grid-template-areas 三個屬性的簡寫。

使用方式如下所示:

.grid {
    grid-template:
        "header    header     header"  80px
        "nav       article    article" 200px
        / 100px auto;
}

可以像通常那樣定義模板區域,把每行的寬度放在其最右面,然後將所有列的寬度放在正斜杠之後。像以前一樣,你可以把所有得內容放在同一行。

函數:repeat()

repeat() 函數有助於使 網格軌道 列表變得不是那麼多餘,併為其添加了語義層。使用起來非常簡單直觀。我們來看一下:

你也可以重複某種形式的軌道列表,如下所示:

.grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr 2fr); // this is the same as: 1fr 2fr 1fr 2fr 1fr 2fr
}

repeat() 不必是值的唯一部分。你可以在其前後添加其他的值。例如:grid-template-columns:2fr repeat(5,1fr) 4fr;。

屬性:grid

這裏的 grid 是 grid-template-rows、 grid-template-columns、 grid-template-areas、 grid-auto-rows、 grid-auto-columns 和 grid-auto-flow 六個屬性的簡寫。

首先,你可以像這樣使用 grid-template(上一個示例):

.grid {
    grid:
        "header    header     header"     80px
        "nav       article    article"    200px
        / 100px auto;
}

其次它不是你看上去的那樣,grid 與 css 屬性不一樣:

是的,你沒有看錯:一個名為 css 的屬性,所有 css 屬性的簡寫。我也是在某次思考中偶然知道了它。但是現在我不會教你怎麼用,以後有可能會。

第三,你以某種方式使用 grid。你可以將 grid-template-rows 與 grid-auto-columns 或 grid-auto-rows 結合使用。語法非常簡單:

.grid-item {
    grid: <grid-template-rows> / <grid-auto-columns>; 
    grid: <grid-auto-rows> / <grid-template-columns>; 
}

例如:

.grid-item-1 {
    grid: 50px 200px 200px/ auto-flow 60px;
}

.grid-item-2 {
    grid: auto-flow 50px / repeat(5, 1fr);
}

請注意,在該值之前應該先使用 auto-flow 關鍵字。

術語:Gutter

Gutter 是單獨分隔 網格行 和 網格列 的空間。 grid-column-gapgrid-row-gap 和 grid-gap 是用於定義 gutter 的屬性。

屬性:grid-row-gap

grid-row-gap 用於定義各個 網格行 之間的空間。它是這樣的:

.grid {
    display: grid;
    grid-template-rows: 100px 100px 100px;
    grid-row-gap: 10px;
}

這會將 網格行 彼此隔開10個像素。

屬性:grid-column-gap

grid-column-gap 用於定義各個 網格列 之間的空間。它是這樣的:

.grid {
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-column-gap: 10px;
}

這會將 網格列 彼此隔開 10 個像素。

屬性:grid-gap

grid-gap 是將 grid-column-gap 和 grid-row-gap 結合在一起的簡寫屬性。一個值定義了兩個 gutter。例如:

.grid {
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-gap: 10px;
}

屬性:order

可以用 order 屬性來控制網格單元的順序。看下面的例子:

.grid {
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-gap: 10px;
}

.grid .grid-cell:nth-child(5) {
    order: 1;
}

在代碼中,第五個網格單元被放置在網格的最後,因為其他網格單元根本沒有定義順序。如果定義了順序,則會遵循数字順序。兩個或多個 網格單元 可以有相同的順序。具有相同順序或完全沒有順序的文件將會根據 html 文檔的邏輯順序進行放置。再看下面:

.grid {
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-gap: 10px;
}

.grid .grid-cell {
    order: 1
}

.grid .grid-cell:nth-child(5) {
    order: 2;
}

上面的例子產生的結果與前面的例子相同。

函數:minmax()

maxmax() 函數是 css 網格布局的新增功能。此功能為我們提供了指定 網格軌道 的最小和最大尺寸的方法。

看下面的例子:

.grid {
    display: grid;
    grid-template-columns: 1fr minmax(50px, 100px) 1fr;
}

使用上面的代碼,在減小窗口寬度時,中間列將保持 100px 的寬度,直到第一列和最後一列減小到其內容的寬度為止。這對於製作響應式布局特別有用。

關鍵字:auto

如果父容器的尺寸是固定的(例如固定寬度),則 auto 關鍵字作為網格項目的寬度將會使該項目充滿容器的整個寬度。在有多個項目的情況下,就像 fr 那樣劃分空間。但是如果將 auto 與 fr 一起使用,則 auto 表現為該項目內容的寬度,剩餘的可用空間被劃分為 fr。

函數:fitcontent()

當你希望寬度或高度表現得像 auto 一樣,但又希望受到最大寬度或高度約束時,可以用 fitcontent() 函數.

.grid-item {
    width: fitcontent(200px);
}

在這裏,最小為適合內容,最大為 200px。

關鍵字:auto-fill

你可以用 auto-fill 來用最多的 網格軌道 填充相關的軸(行或列)而不會溢出。要實現這個目的,需要用到 repeat() 函數:

.grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, 50px);
}

但這會降低單個軌道的靈活性。通過與 minmax() 一起使用,可以同時具有自動填充功能和靈活性。

.grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(50px, 1fr));
}

這樣,你可以至少包含一列,並且在特定瀏覽器寬度中包含多個 50px 的列。

請注意,即使可能未用單元格填充,
auto-fill 也會創建網格軌道。

auto-fit

auto-fit 的行為與 auto-fill 相同,不同之處在於它會摺疊所有空的重複軌道。空軌道是指沒有放置網格項目或跨越網格項目的軌道。

dense

藉助 dense 關鍵字,你可以將項目回填到 空網格單元 中,這些單元是因為你嘗試做了一些的奇怪的事(例如spanning)而被創建的。在任何 span 內你都可以將 dense 關鍵字與 grid-auto-flow 配合使用,如下所示:

.grid {
    display: grid;
    grid-template-column: repeat(auto-fill, minmax(50px, 1fr));
    grid-auto-flow: dense;
}

你可以把它用在照片庫之類的頁面中,但在用於表單時要特別小心,因為這可能會打亂表單子元素的特定順序。

瀏覽器支持

在撰寫本文時,瀏覽器對 css 網格布局有很好的支持。根據 caniuse.com 的說法,除了 Internet Explorer 11部分支持 -ms 前綴和 Opera Mini 之外,所有主流瀏覽器均支持 CSS 網格布局。

總結

與以前的方法相比,CSS 網格使我們能夠以更高的控制力、便捷性和速度來進行布局。在本教程中,我們學習了 Grid 的所有主要元素,包括創建軌道、定位和調整單元格的大小,以及使網格流暢和響應,以及使用諸如 auto-fill 和 minmax() 之類的關鍵字。

本文首發微信公眾號:前端先鋒

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9123

沐鳴娛樂_AngularJS中幾種Providers的區別

什麼是Provider?

Angularjs文檔對provider的定義:provider是一個帶有$get()方法的對象。injector調用$get方法創建一個新的service的實例。provider還有一些其他的方法,可以用來配置provider。

Angularjs使用$provide註冊新的providers。providers基本上都會創建一個新實例, 但每個provider只創建一次。$provide提供了6種方法創建自定義provider, 我會用簡單的代碼示例分別解釋他們。

6種方法如下:

constant

value

service

factory

decorator

provider

constant

constant能被injected到任何地方。constant不能被decorator攔截, 意味着constant的值永遠不能被改變。

var app = angular.module('app', []); 
app.config(function ($provide) {
  $provide.constant('movieTitle', 'The Matrix');
}); 

app.controller('ctrl', function (movieTitle) {
  expect(movieTitle).toEqual('The Matrix');
});

Angularjs提供了一種更簡便的方式創建constant. 你可以將上面3至5行的代碼重寫為:

app.constant('movieTitle', 'The Matrix');


Value

value是一個簡單的可被注入的值,可以是string, number, 也可以是function。

與constant不同的是:value不能被注入到configurations, 但value能被decorators攔截。

var app = angular.module('app', []); 
app.config(function ($provide) {
 $provide.value('movieTitle', 'The Matrix')
});

app.controller('ctrl', function (movieTitle) {
 expect(movieTitle).toEqual('The Matrix');
})

創建value的簡單方法:

app.value('movieTitle', 'The Matrix');


Service

service是一個可以注入的構造函數。如果你想,你可以在函數中指定需要的依賴。

service是一個單例, 只被創建一次。services是一個很好的方式,用於控制器之間傳遞數據,如共享數據。

var app = angular.module('app' ,\[\]); 
app.config(function ($provide) {
 $provide.service('movie', function () {
   this.title = 'The Matrix';
 });
});

app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix');
});

創建service簡單方式:

app.service('movie', function () {
 this.title = 'The Matrix';
});


Factory

factory是一個可注入的函數。

與service的相同點:factory也是一個單例,也可以在此函數中指定依賴。

區別是:factory注入一個普通函數,Angularjs將調用此函數,而service注入一個構造函數。

service是一個構造函數,要調用new創建一個新對象。而用factory,你可以讓這個函數返回你想要的任何東西。

你將會看到,factory是一個只有$get方法的provider。

var app = angular.module('app', []); 
app.config(function ($provide) {
 $provide.factory('movie', function () {
   return {
     title: 'The Matrix';
   }
 });
}); 

app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix');
});

創建factory的簡單方式:

app.factory('movie', function () {
 return {
   title: 'The Matrix';
 }
});


Decorator

decorator可以修改或封裝其它的providers,但constant不能被裝飾。

var app = angular.module('app', []); 
app.value('movieTitle', 'The Matrix'); 
app.config(function ($provide) {
 $provide.decorator('movieTitle', function ($delegate) {
   return $delegate + ' - starring Keanu Reeves';
 });
});

app.controller('myController', function (movieTitle) {
 expect(movieTitle).toEqual('The Matrix - starring Keanu Reeves');
});


Provider

provider是所有providers中最複雜的,可以有複雜的creation函數和配置選項。

provider實際是一個可配置的factory。 provider接受一個對象或構造函數。

var app = angular.module('app', []); 
app.provider('movie', function () {
 var version;
 return {
   setVersion: function (value) {
     version = value;
   },
   $get: function () {
     return {
       title: 'The Matrix' + ' ' + version
     }
   }
 }
});

app.config(function (movieProvider) {
 movieProvider.setVersion('Reloaded');
});

app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix Reloaded');
});


總結

所有的providers只會被實例化一次,因此他們都是單例的。

除了constant,其他的providers都可以被decorated。

constant是一個值, 可以被注入到任何地方,它的值不能被改變。

value是一個簡單的可注入的值。

service是一個可注入的構造函數。

factory是以個可注入的函數。

decorator可以修改或封裝其它的providers,除了constant。

provider是一個可配置的factory。

原文:https://xebia.com/blog/differences-between-providers-in-angularjs/

  

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9033