摘要:表示從圓心開始范圍內(nèi)都是紅色表示距離圓心的位置為,然后向兩邊擴(kuò)散,直到里面的紅色區(qū)域,和向外地方的區(qū)域表示從開始往外都是。組件代碼折扣卷折折折扣卷張有效時間參考鏈接
先看效果圖
由于是截圖,大小有些失真實(shí)現(xiàn)分析
看到這個圖,思考一下,就能明白,其實(shí)就兩個難點(diǎn):
左邊的鋸齒狀是如何實(shí)現(xiàn)
中間的凹陷是如何實(shí)現(xiàn)
上述兩個難點(diǎn)解決了,相信有css基礎(chǔ)的都能寫出這個組件。
實(shí)現(xiàn)鋸齒效果 方法一:偽元素before和after.sawtooth { /* 相對定位,方便讓before和after偽元素絕對定位偏移 */ position: relative; background:#e24141; width:400px; height:170px; } .sawtooth:before, .sawtooth:after { content: " "; width: 0; height: 100%; /* 絕對定位進(jìn)行偏移 */ position: absolute; top: 0; } .sawtooth:before { /* 圓點(diǎn)型的border */ border-right: 10px dotted white; /* 偏移一個半徑,讓圓點(diǎn)的一半覆蓋div */ left: -5px; } .sawtooth:after { /* 圓點(diǎn)型的border */ border-left: 10px dotted white; /* 偏移一個半徑,讓圓點(diǎn)的一半覆蓋div */ right: -5px; }
效果如下:
這個就是在開頭和最后畫了一個點(diǎn)狀邊框,然后平移邊框,讓邊框的一部分覆蓋原來的邊框,利用圓點(diǎn)的顏色和背景色一樣的特點(diǎn),制作鋸齒效果。如果不平移邊框效果如下:
.sawtooth:before { /* 圓點(diǎn)型的border */ border-right: 10px dotted white; /* 偏移一個半徑,讓圓點(diǎn)的一半覆蓋div */ left:0; } .sawtooth:after { /* 圓點(diǎn)型的border */ border-left: 10px dotted white; /* 偏移一個半徑,讓圓點(diǎn)的一半覆蓋div */ right: 0px; }
看了上圖實(shí)現(xiàn)原理是不是一目了然了。但這也有一些缺點(diǎn):方法二radial-gradient設(shè)置背景 radial-gradient講解
1.鋸齒的顏色必須和背景色一樣
2.無法畫鋸齒朝里的方式
用徑向漸變創(chuàng)建圖像。
簡單語法:radial-gradient(circle, red 10px, blue 20px, yellow 30px);
形狀是圓(也可以是橢圓),開始位置的顏色是red,中間顏色是blue,最后顏色是黃色。
10px表示從圓心開始10px范圍內(nèi)都是紅色;
20px表示距離圓心20px的位置為blue,然后向兩邊擴(kuò)散,直到里面10px的紅色區(qū)域,和向外30px地方的yellow區(qū)域;
30px表示從30px開始往外都是yellow。
.div{ margin:20px; height:100px; width:100px; background-image:radial-gradient(circle,red 10px,blue 20px,yellow 30px) }使用radial-gradient畫圓點(diǎn)背景
圓心設(shè)置成透明
把過度顏色都設(shè)置成鋸齒的顏色
通過背景尺寸屬性設(shè)置背景圖的顏色,然后repeate
.div{ margin:20px; height:106px; width:140px; background-image: radial-gradient(circle at center, transparent 6px,#28ACFF 7px); background-size: 20px 15px; }
這樣一個帶圓點(diǎn)背景的div就出來了。然后通過設(shè)置寬度,只顯示半個圓,左邊的鋸齒就出來了。width設(shè)置成10px如下效果
上邊凹槽的實(shí)現(xiàn)這個實(shí)現(xiàn)就比較簡單了,通過絕對定位,用一個圓形元素覆蓋父元素的邊框。
問題:子元素?zé)o法覆蓋父元素在實(shí)現(xiàn)時遇到一個問題,就是子元素移動過去了,但是無法覆蓋父元素的邊框。這時,需要在組件外再套一層div,這個div設(shè)置成相對定位,然后把圓div設(shè)置成相對定義,再移動位置就能覆蓋里面的組件div了。
開發(fā)優(yōu)惠卷通過上述的講解,需要實(shí)現(xiàn)優(yōu)惠卷所需要的知識點(diǎn)就都講完了,下面讓我們來實(shí)現(xiàn)開始效果的優(yōu)惠卷吧。
結(jié)構(gòu)分析一個div頂級容器,設(shè)置成相對定位。(解決無法覆蓋問題)
一個div組件容器,放到上面的div中
鋸齒div(放到2中的的div)
粗體顯示折扣的div(放到2中的的div)
虛線div(放到2中的的div)
折扣詳情div(放到2中的的div)
兩個圓形div,放到1或2中div都可以。
code.parentContainer { position:relative; margin:20px; overflow:hidden; } .container { display:flex; border:1px solid #ffffd; border-radius:3px; width:300px; height:105px; border-left:0; } .left { width:10px; height:106px; left:-1px; border:0px solid #ffffd; border-radius:3px; background-image:radial-gradient(circle at center,transparent 6px,#28ACFF 4px); background-size:20px 15px; z-index:1 } .couponName { text-align:center; border:0px solid red; line-height:106px; font-size:40px; font-family:PingFangSC-Medium; font-weight:500; color:rgba(40,172,255,1); margin-left:20px; margin-right:16px; } .subName { font-size:20px; } .topSemicircle { width:20px; height:20px; border:1px solid #ffffd; border-radius:10px; position:absolute; left:80px; top:-16px; padding:0; background-color:#fff; } .bottomSemicircle { width:20px; height:20px; border:1px solid #ffffd; border-radius:10px; position:absolute; left:80px; bottom:-16px; padding:0; background-color:#fff; } .dashed { border:1px dashed #ffffd; margin-top:11px; margin-bottom:11px; } .right { display:flex; flex-direction:column; justify-content:center; align-items:flex-start; padding-left:10px; } .desc { font-size:10px; font-family:PingFangSC-Regular; font-weight:400; color:rgba(170,170,170,1); margin-top:10px; }8折折扣卷7.5折400張有效時間:2018.09.21-2018.10.21
可以把代碼賦值到下面的在線工具中看下效果
https://c.runoob.com/front-en...
根據(jù)自己需要再寫成react版本,就易如反掌了。
//less .parentContainer { position: relative; margin: 20px; overflow: hidden; } .container { display: flex; border: 1px solid #ffffd; border-radius: 3px; width: 312px; height: 105px; border-left: 0; } .left { width: 10px; height: 106px; left: -1px; border: 0px solid #ffffd; border-radius: 3px; background-image: radial-gradient( circle at center, transparent 6px, #28acff 4px ); background-size: 20px 15px; z-index: 1; } .leftInvalid { .left; background-image: radial-gradient( circle at center, transparent 6px, #aaaaaa 4px ); } .couponName { text-align: center; border: 0px solid red; line-height: 106px; font-size: 40px; font-family: PingFangSC-Medium; font-weight: 500; color: rgba(40, 172, 255, 1); min-width: 62px; margin-left: 20px; margin-right: 16px; } .couponNameInvalid { .couponName; color: #aaaaaa; } .title { font-size: 16px; font-weight: 400; color: rgba(51, 51, 51, 1); } .invalidTitle { .title; color: rgba(170, 170, 170, 1); } .subName { font-size: 20px; } .semicircle { width: 20px; height: 20px; border: 1px solid #ffffd; border-radius: 10px; position: absolute; left: 98px; padding: 0; background-color: #fff; } .topSemicircle { .semicircle; top: -16px; } .bottomSemicircle { .semicircle; bottom: -16px; } .dashed { border: 1px dashed #ffffd; margin-top: 11px; margin-bottom: 11px; } .right { display: flex; flex-direction: column; justify-content: center; align-items: flex-start; padding-left: 10px; } .desc { font-size: 10px; font-family: PingFangSC-Regular; font-weight: 400; color: rgba(170, 170, 170, 1); margin-top: 10px; } //組件代碼 import React, { PureComponent } from "react" import styles from "./index.less" export default class CouponCard extends PureComponent { render() { const { valid = true, data = { id: 2323, couponDescription: "折扣卷8.5折", validDate: "2018.08.22-2018.09.12", number: 23, amount: 8.5, unit: "折", }, } = this.props const amounts = data.amount.toString().split(".") return () } }{amounts[0]} {amounts[1] ? `.${amounts[1]}` : ""} {data.unit}折扣卷{data.amount} {data.unit}{data.number}張有效時間:{data.validDate}
參考鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/98104.html
摘要:表示從圓心開始范圍內(nèi)都是紅色表示距離圓心的位置為,然后向兩邊擴(kuò)散,直到里面的紅色區(qū)域,和向外地方的區(qū)域表示從開始往外都是。組件代碼折扣卷折折折扣卷張有效時間參考鏈接 先看效果圖 showImg(https://segmentfault.com/img/bVbhGFm?w=1328&h=524); 由于是截圖,大小有些失真 實(shí)現(xiàn)分析 看到這個圖,思考一下,就能明白,其實(shí)就兩個難點(diǎn): 左...
簡介:簡單實(shí)現(xiàn)react-redux基礎(chǔ)api react-redux api回顧 把store放在context里,所有子組件可以直接拿到store數(shù)據(jù) 使組件層級中的 connect() 方法都能夠獲得 Redux store 根組件應(yīng)該嵌套在 中 ReactDOM.render( , rootEl ) ReactDOM.render( ...
摘要:數(shù)據(jù)放在組件中,作為一個無狀態(tài)組件,只做他的展示。用兩種組件設(shè)計模式可以幫助到我們。將處理后的數(shù)據(jù)作為參數(shù)執(zhí)行,最終返回組件,這就是模式。二高階組件模式所謂的高階組件,其實(shí)就是一個函數(shù),該接受為參數(shù),返回一個處理后的。 完整代碼可查看github,這里截取的代碼不影響理解就行。 頁面效果可查看gitPage 首先編寫一下我們的公共組件 單個商品組件(商品組件:展示價格、購買數(shù)量) go...
摘要:在線注冊賬號,數(shù)據(jù)存儲于。年了,還不使用的異步控制體系。過度對數(shù)據(jù)模型進(jìn)行裝飾的結(jié)果便是高耦合,這跟我初衷是基于在線存儲數(shù)據(jù)有關(guān)。 為什么又是Todo,全世界的初學(xué)者都在做todo嗎?可能很多人要問這句話,其實(shí)這句話可以等同于: 為什么你做了個云音樂播放器? 為什么你做了個新聞閱讀APP? 為什么你做了個VUE/REACT版本的CNODE? 究其本質(zhì),這幾個應(yīng)用都是data-map...
摘要:往往純的單頁面應(yīng)用一般不會太復(fù)雜,所以這里不引入和等等,在后面復(fù)雜的跨平臺應(yīng)用中我會將那些技術(shù)一擁而上。構(gòu)建極度復(fù)雜,超大數(shù)據(jù)的應(yīng)用。 showImg(https://segmentfault.com/img/bVbvphv?w=1328&h=768); React為了大型應(yīng)用而生,Electron和React-native賦予了它構(gòu)建移動端跨平臺App和桌面應(yīng)用的能力,Taro則賦...
閱讀 928·2023-04-26 01:34
閱讀 3363·2023-04-25 20:58
閱讀 3286·2021-11-08 13:22
閱讀 2117·2019-08-30 14:17
閱讀 2526·2019-08-29 15:27
閱讀 2679·2019-08-29 12:45
閱讀 3003·2019-08-29 12:26
閱讀 2816·2019-08-28 17:51