用 CSS 将 35 度徽章剪成图像
Cut a 35degree badge into a image with CSS
我应该如何在左上角创建这个只有 CSS 的白色徽章?我是按方法创建的,但我认为它真的很糟糕。我创建了一个白色区域(矩形),我将其转换了 35 度,并尝试将其尽可能好地放置在这个角落。对齐徽章的文本我用同样的方法做了,但它不是很漂亮而且我有一些问题,就像你在上图中看到的那样。我很好奇你们会怎么做?
我的尝试:
HTML:
<div class="item-img"><a href="images/packages/background01.jpg" rel="imagebox" title="SockMonkee"><img src="images/packages/background01.jpg" alt=""/><div class="overlay zoom"></div></a></div>
<div class="checkout-badge">
<div class="checkout-price"><span>€</span>30</div>
</div>
CSS:
.checkout-badge {
height: 100px;
width: 200px;
text-align: center;
transform: rotate(-35deg) translateY(0);
background-color: #fff;
position: absolute;
top: -50px;
left: -50px;
font-size: 14px;
}
.checkout-price {
color: #2da0ce;
font-size: 40px;
font-weight: bold;
padding-top: 50px;
}
.checkout-price span {
font-size: 30px;
margin-right: 10px;
font-weight: normal;
margin-left: -60px;
}
转换的浏览器兼容性:旋转
-webkit-transform: rotate(7.5deg); /* Chrome, Safari 3.1+
-moz-transform: rotate(7.5deg); /* Firefox 3.5-15
-ms-transform: rotate(7.5deg); /* IE 9
-o-transform: rotate(7.5deg); /* Opera 10.50-12.00
transform: rotate(7.5deg); /* Firefox 16+, IE 10+, Opera 12.10+
}
过渡的浏览器兼容性
-webkit-transition: all 0.3s ease-out; /* Chrome 1-25, Safari 3.2+ */
-moz-transition: all 0.3s ease-out; /* Firefox 4-15 */
-o-transition: all 0.3s ease-out; /* Opera 10.50–12.00 */
transition: all 0.3s ease-out; /* Chrome 26, Firefox 16+, IE 10+, Opera 12.10+ */
}
透明在IE8中不起作用
根据 StatCounter 截至 2014 年 12 月,美国使用的浏览器中有 15% 是 IE8
要在 100% 的浏览器上工作,需要更改图像。
我会使用 GD 扩展名编辑 PHP 中的图像文件。那么我就不必担心浏览器的兼容性了。
这是在预制作过程中上传图像的情况:
可选:获取图像和类型并按大小缩放。
这是确保图像类型的防弹方法
if( is_uploaded_file($_FILES['image1']['tmp_name']) || !($_FILES['image1']['error'] !== UPLOAD_ERR_OK)){
$save = false;
$jspan = '';
$gspan = '';
$pspan = '';
switch(strtolower($_FILES['image1']['type'])){
case 'image/jpeg':
$image = @imagecreatefromjpeg($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/png':
$image = @imagecreatefrompng($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/gif':
$image = @imagecreatefromgif($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
default:
$img = @getimagesize($_FILES['image1']['tmp_name']);
switch(strtolower($img['mime'])){
case 'image/jpeg':
$image = @imagecreatefromjpeg($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/png':
$image = @imagecreatefrompng($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/gif':
$image = @imagecreatefromgif($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
default:
$filename = $_FILES['image1']['name'];
$ext = substr($filename,-3);
switch(strtolower($ext)){
case 'jpg':
$image = @imagecreatefromjpeg($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'gif':
$image = @imagecreatefromgif($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'png':
$image = @imagecreatefrompng($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
default:
$image = @imagecreatefromjpeg($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
$image = @imagecreatefrompng($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
$image = @imagecreatefromgif($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
}
}
}
}
if ($save === true){
$originalWidth = imagesx($image);
$originalHeight = imagesy($image);
$scale = min($previewWidth/$originalWidth, $previewHeight/$originalHeight);
$newWidth = ceil($scale*$originalWidth);
$newHeight = ceil($scale*$originalHeight);
$newPic = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($newPic, $image,0, 0, 0, 0,$newWidth, $newHeight, $originalWidth, $originalHeight);
可选:找到最佳图像类型
ob_start();
imagejpeg($newPic, NULL, 70);
$jpg = ob_get_clean();
ob_clean();
ob_end_flush();
$jLen = strlen($jpg);
ob_start();
imagepng($newPic, NULL, 9);
$png = ob_get_clean();
ob_clean();
ob_end_flush();
$pLen = strlen($png);
ob_start();
imagegif($newPic);
$gif = ob_get_clean();
ob_clean();
ob_end_flush();
$gLen = strlen($gif);
if ($gLen < $jLen){
if ($pLen < $gLen){
$raw = $png;
$png = null;
$type = 'png';
$pspan = '<span class="size">';
}
else{
$raw = $gif;
$gif = null;
$type = 'gif';
$gspan = '<span class="size">';
}
}
elseif($pLen < $jLen){
$raw = $png;
$png = null;
$type = 'png';
$pspan = '<span class="size">';
}
else{
$raw = $jpg;
$jpg = null;
$type = 'jpg';
$jspan = '<span class="size">';
}
以上是可选的
以上可以替换为:
$image = @imagecreatefromjpeg(/home/user/public_html/images/image.jpg');
此代码的其余部分将花费几毫秒的时间来执行。
在创建 HTML.
时它会很好地运行
创建带有文本的白色标签并旋转
$canvas = imagecreatetruecolor(200, 200);
$white = imagecolorallocate($canvas, 255, 255, 255);
$im = imagecreate(100, 100);
$string = '€ 30';
$bg = imagecolorallocate($im, 255, 255, 255);
$blue = imagecolorallocate($im, 0, 0, 255);
imagechar($im, 0, 50, 20, $string, $blue);
$corner = imagerotate($im, 45, 0);
将白角合并到缩放后的新图像上。
imagecopymerge($newPic , $corner , 10, 10, 0, 0, 100, 47, 75);
我更喜欢使用 base64 图像并将它们放在 HTML 中以保存每个图像的所有 HTTP 请求。
$base64 = base64_encode($raw);
$image = "<img width=\"$newWidth\" height=\"$newHeight\" src=\"data:image/$type;base64,$base64\" "/>";
$image = mysql_escape_string($image );
@mysql_unbuffered_query("UPDATE `photos` SET `image `='$image ' WHERE `id`=$id");
保存图片
$filename = "image$id." . $type;
$fp = fopen($filename ,"w");
fwrite($fp, $raw);
fclose($fp);
imagedestroy($newPic);
这个过程只需要几毫秒。一直在上传。
因此,如果即时执行而不是上传图片:
将前两秒的代码替换为:
$filename = "/home/user/pic/$imagename";
$imgage = imagecreatefromjpeg($filename);
就我个人而言,我不会渲染整个矩形。我会用 CSS 构建一个三角形并将其覆盖在角落里。这意味着您的徽章不会包含其他元素。这是一篇不错的文章,介绍了您可以单独使用 CSS 制作的各种形状:http://css-tricks.com/examples/ShapesOfCSS/
这是一个有效的 plunker:http://plnkr.co/edit/nQsU9KESJ7ZLVkwHlDPQ?p=preview
这是 HTML。我还将徽章包含在包含图像的 div
中。
<div class="item-img">
<a href="images/packages/background01.jpg">
<img src="images/packages/background01.jpg">
</a>
<div class="checkout-badge">
<div class="checkout-price"><span>€</span>30</div>
</div>
</div>
这是CSS:
.item-img {
position: relative;
border: 1px solid #009;
display: inline-block;
margin: 0;
padding: 0;
}
.checkout-badge {
width: 0;
height: 0;
border-top: 75px solid #fff;
border-right: 105px solid transparent;
position: absolute;
top: 0;
left: 0;
}
.checkout-price {
color: #2da0ce;
font-weight: bold;
position: absolute;
top: -55px;
left: 15px;
transform: rotate(-35deg);
}
我会玩弄数字和风格。您可以调整边框宽度以制作不同类型的三角形。使用相同的宽度会产生一个等腰直角三角形,但您的变换需要 -45deg
才能适合角度。此外,更改边框边(和位置)将允许您将边框放置在您想要的图像的任何角落,例如top + left = 左上,top + right = 右上等
这将是您所寻找内容的简单实现:
.wrap{
height:200px;
width:300px;
position:relative;
overflow:hidden;
display:inline-block;
}
.price{
position:absolute;
padding-top:30px;
top:-10%;
left:-20%;
transform:rotate(-35deg);
background:white;
width:50%;
text-align:center;
color: #2da0ce;
}
.image1{
background:url(http://placekitten.com/g/300/200);
}
.image2{
background:url(http://placekitten.com/g/300/300);
}
/*hover effect*/
a, .price{
transition: all 0.8s;
}
a:hover{
opacity:0.5;
}
.price:hover{
opacity:100%;
background: black;
}
<a href="#" class="wrap image1">
<div class="price">£20</div>
</a>
<a href="#" class="wrap image2">
<div class="price">£20</div>
</a>
我应该如何在左上角创建这个只有 CSS 的白色徽章?我是按方法创建的,但我认为它真的很糟糕。我创建了一个白色区域(矩形),我将其转换了 35 度,并尝试将其尽可能好地放置在这个角落。对齐徽章的文本我用同样的方法做了,但它不是很漂亮而且我有一些问题,就像你在上图中看到的那样。我很好奇你们会怎么做?
我的尝试:
HTML:
<div class="item-img"><a href="images/packages/background01.jpg" rel="imagebox" title="SockMonkee"><img src="images/packages/background01.jpg" alt=""/><div class="overlay zoom"></div></a></div>
<div class="checkout-badge">
<div class="checkout-price"><span>€</span>30</div>
</div>
CSS:
.checkout-badge {
height: 100px;
width: 200px;
text-align: center;
transform: rotate(-35deg) translateY(0);
background-color: #fff;
position: absolute;
top: -50px;
left: -50px;
font-size: 14px;
}
.checkout-price {
color: #2da0ce;
font-size: 40px;
font-weight: bold;
padding-top: 50px;
}
.checkout-price span {
font-size: 30px;
margin-right: 10px;
font-weight: normal;
margin-left: -60px;
}
转换的浏览器兼容性:旋转
-webkit-transform: rotate(7.5deg); /* Chrome, Safari 3.1+
-moz-transform: rotate(7.5deg); /* Firefox 3.5-15
-ms-transform: rotate(7.5deg); /* IE 9
-o-transform: rotate(7.5deg); /* Opera 10.50-12.00
transform: rotate(7.5deg); /* Firefox 16+, IE 10+, Opera 12.10+
}
过渡的浏览器兼容性
-webkit-transition: all 0.3s ease-out; /* Chrome 1-25, Safari 3.2+ */
-moz-transition: all 0.3s ease-out; /* Firefox 4-15 */
-o-transition: all 0.3s ease-out; /* Opera 10.50–12.00 */
transition: all 0.3s ease-out; /* Chrome 26, Firefox 16+, IE 10+, Opera 12.10+ */
}
透明在IE8中不起作用
根据 StatCounter 截至 2014 年 12 月,美国使用的浏览器中有 15% 是 IE8
要在 100% 的浏览器上工作,需要更改图像。
我会使用 GD 扩展名编辑 PHP 中的图像文件。那么我就不必担心浏览器的兼容性了。
这是在预制作过程中上传图像的情况:
可选:获取图像和类型并按大小缩放。
这是确保图像类型的防弹方法
if( is_uploaded_file($_FILES['image1']['tmp_name']) || !($_FILES['image1']['error'] !== UPLOAD_ERR_OK)){
$save = false;
$jspan = '';
$gspan = '';
$pspan = '';
switch(strtolower($_FILES['image1']['type'])){
case 'image/jpeg':
$image = @imagecreatefromjpeg($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/png':
$image = @imagecreatefrompng($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/gif':
$image = @imagecreatefromgif($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
default:
$img = @getimagesize($_FILES['image1']['tmp_name']);
switch(strtolower($img['mime'])){
case 'image/jpeg':
$image = @imagecreatefromjpeg($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/png':
$image = @imagecreatefrompng($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'image/gif':
$image = @imagecreatefromgif($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
default:
$filename = $_FILES['image1']['name'];
$ext = substr($filename,-3);
switch(strtolower($ext)){
case 'jpg':
$image = @imagecreatefromjpeg($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'gif':
$image = @imagecreatefromgif($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
case 'png':
$image = @imagecreatefrompng($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
default:
$image = @imagecreatefromjpeg($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
$image = @imagecreatefrompng($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
$image = @imagecreatefromgif($_FILES['image1']['tmp_name']);
if ($image !== false){$save = true;break;}
}
}
}
}
if ($save === true){
$originalWidth = imagesx($image);
$originalHeight = imagesy($image);
$scale = min($previewWidth/$originalWidth, $previewHeight/$originalHeight);
$newWidth = ceil($scale*$originalWidth);
$newHeight = ceil($scale*$originalHeight);
$newPic = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($newPic, $image,0, 0, 0, 0,$newWidth, $newHeight, $originalWidth, $originalHeight);
可选:找到最佳图像类型
ob_start();
imagejpeg($newPic, NULL, 70);
$jpg = ob_get_clean();
ob_clean();
ob_end_flush();
$jLen = strlen($jpg);
ob_start();
imagepng($newPic, NULL, 9);
$png = ob_get_clean();
ob_clean();
ob_end_flush();
$pLen = strlen($png);
ob_start();
imagegif($newPic);
$gif = ob_get_clean();
ob_clean();
ob_end_flush();
$gLen = strlen($gif);
if ($gLen < $jLen){
if ($pLen < $gLen){
$raw = $png;
$png = null;
$type = 'png';
$pspan = '<span class="size">';
}
else{
$raw = $gif;
$gif = null;
$type = 'gif';
$gspan = '<span class="size">';
}
}
elseif($pLen < $jLen){
$raw = $png;
$png = null;
$type = 'png';
$pspan = '<span class="size">';
}
else{
$raw = $jpg;
$jpg = null;
$type = 'jpg';
$jspan = '<span class="size">';
}
以上是可选的
以上可以替换为:
$image = @imagecreatefromjpeg(/home/user/public_html/images/image.jpg');
此代码的其余部分将花费几毫秒的时间来执行。
在创建 HTML.
创建带有文本的白色标签并旋转
$canvas = imagecreatetruecolor(200, 200);
$white = imagecolorallocate($canvas, 255, 255, 255);
$im = imagecreate(100, 100);
$string = '€ 30';
$bg = imagecolorallocate($im, 255, 255, 255);
$blue = imagecolorallocate($im, 0, 0, 255);
imagechar($im, 0, 50, 20, $string, $blue);
$corner = imagerotate($im, 45, 0);
将白角合并到缩放后的新图像上。
imagecopymerge($newPic , $corner , 10, 10, 0, 0, 100, 47, 75);
我更喜欢使用 base64 图像并将它们放在 HTML 中以保存每个图像的所有 HTTP 请求。
$base64 = base64_encode($raw);
$image = "<img width=\"$newWidth\" height=\"$newHeight\" src=\"data:image/$type;base64,$base64\" "/>";
$image = mysql_escape_string($image );
@mysql_unbuffered_query("UPDATE `photos` SET `image `='$image ' WHERE `id`=$id");
保存图片
$filename = "image$id." . $type;
$fp = fopen($filename ,"w");
fwrite($fp, $raw);
fclose($fp);
imagedestroy($newPic);
这个过程只需要几毫秒。一直在上传。
因此,如果即时执行而不是上传图片: 将前两秒的代码替换为:
$filename = "/home/user/pic/$imagename";
$imgage = imagecreatefromjpeg($filename);
就我个人而言,我不会渲染整个矩形。我会用 CSS 构建一个三角形并将其覆盖在角落里。这意味着您的徽章不会包含其他元素。这是一篇不错的文章,介绍了您可以单独使用 CSS 制作的各种形状:http://css-tricks.com/examples/ShapesOfCSS/
这是一个有效的 plunker:http://plnkr.co/edit/nQsU9KESJ7ZLVkwHlDPQ?p=preview
这是 HTML。我还将徽章包含在包含图像的 div
中。
<div class="item-img">
<a href="images/packages/background01.jpg">
<img src="images/packages/background01.jpg">
</a>
<div class="checkout-badge">
<div class="checkout-price"><span>€</span>30</div>
</div>
</div>
这是CSS:
.item-img {
position: relative;
border: 1px solid #009;
display: inline-block;
margin: 0;
padding: 0;
}
.checkout-badge {
width: 0;
height: 0;
border-top: 75px solid #fff;
border-right: 105px solid transparent;
position: absolute;
top: 0;
left: 0;
}
.checkout-price {
color: #2da0ce;
font-weight: bold;
position: absolute;
top: -55px;
left: 15px;
transform: rotate(-35deg);
}
我会玩弄数字和风格。您可以调整边框宽度以制作不同类型的三角形。使用相同的宽度会产生一个等腰直角三角形,但您的变换需要 -45deg
才能适合角度。此外,更改边框边(和位置)将允许您将边框放置在您想要的图像的任何角落,例如top + left = 左上,top + right = 右上等
这将是您所寻找内容的简单实现:
.wrap{
height:200px;
width:300px;
position:relative;
overflow:hidden;
display:inline-block;
}
.price{
position:absolute;
padding-top:30px;
top:-10%;
left:-20%;
transform:rotate(-35deg);
background:white;
width:50%;
text-align:center;
color: #2da0ce;
}
.image1{
background:url(http://placekitten.com/g/300/200);
}
.image2{
background:url(http://placekitten.com/g/300/300);
}
/*hover effect*/
a, .price{
transition: all 0.8s;
}
a:hover{
opacity:0.5;
}
.price:hover{
opacity:100%;
background: black;
}
<a href="#" class="wrap image1">
<div class="price">£20</div>
</a>
<a href="#" class="wrap image2">
<div class="price">£20</div>
</a>