angular app to visualize the box-model and see how changing the value of box-sizing affects element size and which properties contrinbute.
A Pen by HARUN PEHLİVAN on CodePen.
angular app to visualize the box-model and see how changing the value of box-sizing affects element size and which properties contrinbute.
A Pen by HARUN PEHLİVAN on CodePen.
| <div ng-app="cssBoxModel"> | |
| <div ui-view="diagram"></div> | |
| </div> |
| // code on GitHub | |
| // https://github.com/carolineartz/learning-box-model | |
| // http://car.oline.codes | |
| // rebound of this jQuery demo https://codepen.io/guyroutledge/pen/hgpez | |
| angular.module('cssBoxModel', ['ngAnimate', 'ngSanitize', 'ui.router','ui.slider']) | |
| .config(['$stateProvider', '$locationProvider', function($stateProvider, $locationProvider) { | |
| $stateProvider.state('home', { | |
| url: '', | |
| controller: 'MainCtrl', | |
| views: { | |
| 'diagram': { | |
| templateUrl: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/97151/main.html', | |
| controller: 'MainCtrl' | |
| } | |
| } | |
| }); | |
| }]) | |
| .directive('labelPositionV', function() { | |
| return { | |
| restrict: 'AE', | |
| scope: {}, | |
| link: function(scope, element, attrs, ctrl) { | |
| var id = attrs.id; | |
| attrs.$observe('labelPositionTop', function(value) { | |
| var styleTop = "<style> #" + id + "::before{top:" + ((value / 2.8) - 12) + "px;}</style>"; | |
| angular.element(document).find('head').append(styleTop); | |
| }); | |
| attrs.$observe('labelPositionBottom', function(value) { | |
| var styleBottom = "<style> #" + id + "::after{bottom:" + ((value / 3) - 13) + "px;}</style>"; | |
| angular.element(document).find('head').append(styleBottom); | |
| }); | |
| } | |
| }; | |
| }) | |
| .directive('labelPositionH', function() { | |
| return { | |
| restrict: 'AE', | |
| scope: {}, | |
| link: function(scope, element, attrs, ctrl) { | |
| var id = attrs.id; | |
| attrs.$observe('labelPositionRight', function(value) { | |
| var styleRight = "<style> #" + id + "::after{right:" + (1*((value / 2.8) - 12)) + "px;}</style>"; | |
| angular.element(document).find('head').append(styleRight); | |
| }); | |
| attrs.$observe('labelPositionLeft', function(value) { | |
| var styleLeft = "<style> #" + id + "::before{left:" + (1*((value / 3)-12)) + "px;}</style>"; | |
| angular.element(document).find('head').append(styleLeft); | |
| }); | |
| } | |
| }; | |
| }); | |
| // Controller | |
| // ********************************************************************** | |
| var app = angular.module('cssBoxModel'); | |
| app.controller('MainCtrl', function ($scope) { | |
| //models: default adjustable values | |
| $scope.padding = { | |
| top: 20, | |
| right: 20, | |
| bottom: 20, | |
| left: 20, | |
| v: function () { | |
| return this.top + this.bottom; | |
| }, | |
| h: function () { | |
| return this.right + this.left; | |
| } | |
| }; | |
| $scope.border = { | |
| top: 15, | |
| right: 15, | |
| bottom: 15, | |
| left: 15, | |
| v: function () { | |
| return this.top + this.bottom; | |
| }, | |
| h: function () { | |
| return this.right + this.left; | |
| } | |
| }; | |
| $scope.margin = { | |
| top: 20, | |
| right: 20, | |
| bottom: 20, | |
| left: 20, | |
| v: function () { | |
| return this.top + this.bottom; | |
| }, | |
| h: function () { | |
| return this.right + this.left; | |
| } | |
| }; | |
| $scope.box = { | |
| sizing: 'content-box' | |
| }; | |
| $scope.dimensions = { | |
| width: 220, | |
| height: 220 | |
| }; | |
| $scope.innerContent = { | |
| width: getInnerWidth(), | |
| height: getInnerHeight() | |
| }; | |
| $scope.generatedIncludeMargin = false; | |
| $scope.generatedBoxDimensions = { | |
| width: getGeneratedBoxDimensionsWidth(), | |
| height: getGeneratedBoxDimensionsHeight() | |
| }; | |
| $scope.checkIncludeMargin = function() { | |
| $scope.generatedBoxDimensions.width = getGeneratedBoxDimensionsWidth(); | |
| $scope.generatedBoxDimensions.height = getGeneratedBoxDimensionsHeight(); | |
| }; | |
| //actual applied style values | |
| $scope.boxPosition = { | |
| left: 50, | |
| top: 56 | |
| }; | |
| $scope.styleMargin = { | |
| width: 300, | |
| height: 300, | |
| top: -50, | |
| left: -50 | |
| }; | |
| $scope.styleBorder = { | |
| width: 260, | |
| height: 260, | |
| top: -30, | |
| left: -30 | |
| }; | |
| $scope.stylePadding = { | |
| width: 242, | |
| height: 242, | |
| top: -20, | |
| left: -20 | |
| }; | |
| //watch for changes applied to sliders and calculate rendered styles | |
| $scope.$watch(function () { | |
| $scope.boxPosition.top = calcBoxPositionTop() + 6; | |
| $scope.boxPosition.left = calcBoxPositionLeft(); | |
| //Margin Styles | |
| $scope.styleMargin.width = $scope.margin.h() + $scope.styleBorder.width; | |
| $scope.styleMargin.height = $scope.margin.v() + $scope.styleBorder.height; | |
| $scope.styleMargin.top = -calcBoxPositionTop(); | |
| $scope.styleMargin.left = -calcBoxPositionLeft(); | |
| //Border Styles | |
| $scope.styleBorder.width = $scope.border.h() + $scope.stylePadding.width; | |
| $scope.styleBorder.height = $scope.border.v() + $scope.stylePadding.height; | |
| $scope.styleBorder.top = -($scope.border.top + $scope.padding.top); | |
| $scope.styleBorder.left = -($scope.border.left + $scope.padding.left); | |
| //Padding Styles | |
| $scope.stylePadding.width = $scope.padding.h() + getInnerWidth() + 2; | |
| $scope.stylePadding.height = $scope.padding.v() + getInnerHeight() + 2; | |
| $scope.stylePadding.top = -$scope.padding.top; | |
| $scope.stylePadding.left = -$scope.padding.left; | |
| //Inner Content Styles- based on box-sizing | |
| $scope.innerContent.width = getInnerWidth(); | |
| $scope.innerContent.height = getInnerHeight(); | |
| //Generated Dimensions- based on box-sizing | |
| $scope.generatedBoxDimensions.width = getGeneratedBoxDimensionsWidth(); | |
| $scope.generatedBoxDimensions.height = getGeneratedBoxDimensionsHeight(); | |
| }); | |
| function getInnerWidth() { | |
| var width; | |
| if ($scope.box.sizing === 'border-box') { | |
| width = $scope.dimensions.width - | |
| $scope.border.h() - | |
| $scope.padding.h(); | |
| } else { | |
| width = $scope.dimensions.width; | |
| } | |
| return (width > 0) ? width : 0; | |
| } | |
| function getInnerHeight() { | |
| var height; | |
| if ($scope.box.sizing === 'border-box') { | |
| height = $scope.dimensions.height - | |
| $scope.border.v() - | |
| $scope.padding.v(); | |
| } else { | |
| height = $scope.dimensions.height; | |
| } | |
| return (height > 0) ? height : 0; | |
| } | |
| //if padding + border > dimension, return (padding + border - dimension) [+ margin] | |
| function getGeneratedBoxDimensionsWidth() { | |
| var width; | |
| if ($scope.box.sizing === 'border-box') { | |
| width = (getInnerWidth() === 0) ? calcPaddingBorderWidth() : $scope.dimensions.width; | |
| } else { | |
| width = $scope.dimensions.width + calcPaddingBorderWidth(); | |
| } | |
| return ($scope.generatedIncludeMargin) ? width + $scope.margin.h() : width; | |
| } | |
| function getGeneratedBoxDimensionsHeight() { | |
| var height; | |
| if ($scope.box.sizing === 'border-box') { | |
| height = (getInnerHeight() === 0) ? calcPaddingBorderHeight() : $scope.dimensions.height; | |
| } else { | |
| height = $scope.dimensions.height + calcPaddingBorderHeight(); | |
| } | |
| return ($scope.generatedIncludeMargin) ? height + $scope.margin.v() : height; | |
| } | |
| /* | |
| * Private: Helpers | |
| */ | |
| function calcBoxPositionTop() { | |
| return $scope.margin.top + $scope.border.top + $scope.padding.top; | |
| } | |
| function calcBoxPositionLeft() { | |
| return $scope.margin.left + $scope.border.left + $scope.padding.left; | |
| } | |
| function calcPaddingBorderWidth() { | |
| return $scope.padding.h() + $scope.border.h(); | |
| } | |
| function calcPaddingBorderHeight() { | |
| return $scope.padding.v() + $scope.border.v(); | |
| } | |
| }); | |
| @import "neat"; | |
| @import "bourbon"; | |
| $color-margin: #DE6A63; | |
| $color-padding: #C5D936; | |
| $color-content: #63BCF8; | |
| $color-border: #F8CC63; | |
| $color-box-sizing: #8ADFE0; | |
| $color-bg: #242930; | |
| $color-dark-light: #343434; | |
| $color-dark-lighter: #444; | |
| $color-dark-lightest: #777; | |
| $color-body: #808386; | |
| $color-white: #FFFFFF; | |
| $knob-size: 20px; | |
| $knob-border-width: 3px; | |
| $boxes: (content: $color-content, | |
| padding: $color-padding, | |
| border: $color-border, | |
| margin: $color-margin, | |
| box-sizing: $color-box-sizing, | |
| generated-size: $color-content); | |
| $sliders: content, padding, border, margin; | |
| $lg: new-breakpoint(min-width 1245px 7); | |
| $md: new-breakpoint(min-width 950px); | |
| $sm: new-breakpoint(min-width 790px 6); | |
| $xxs: new-breakpoint(max-width 550px); | |
| $column: golden-ratio(1em, 3) !default; // Column width | |
| $gutter: golden-ratio(1em, 1) !default; // Gutter between each two columns | |
| $grid-columns: 12 !default; // Total number of columns in the grid | |
| $max-width: em(1088) !default; // Max-width of the outer container | |
| $border-box-sizing: true !default; // Makes all elements have a border-box layout | |
| $default-feature: min-width; // Default @media feature for the breakpoint() mixin | |
| $default-layout-direction: LTR !default; | |
| @mixin media($query:$feature $value $columns, $total-columns: $grid-columns) { | |
| @if length($query) == 1 { | |
| @media screen and ($default-feature: nth($query, 1)) { | |
| $default-grid-columns: $grid-columns; | |
| $grid-columns: $total-columns; | |
| @content; | |
| $grid-columns: $default-grid-columns; | |
| } | |
| } | |
| @else if length($query) == 2 { | |
| @media screen and (nth($query, 1): nth($query, 2)) { | |
| $default-grid-columns: $grid-columns; | |
| $grid-columns: $total-columns; | |
| @content; | |
| $grid-columns: $default-grid-columns; | |
| } | |
| } | |
| @else if length($query) == 3 { | |
| @media screen and (nth($query, 1): nth($query, 2)) { | |
| $default-grid-columns: $grid-columns; | |
| $grid-columns: nth($query, 3); | |
| @content; | |
| $grid-columns: $default-grid-columns; | |
| } | |
| } | |
| @else if length($query) == 4 { | |
| @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) { | |
| $default-grid-columns: $grid-columns; | |
| $grid-columns: $total-columns; | |
| @content; | |
| $grid-columns: $default-grid-columns; | |
| } | |
| } | |
| @else if length($query) == 5 { | |
| @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) { | |
| $default-grid-columns: $grid-columns; | |
| $grid-columns: nth($query, 5); | |
| @content; | |
| $grid-columns: $default-grid-columns; | |
| } | |
| } | |
| @else { | |
| @warn "Wrong number of arguments for breakpoint(). Read the documentation for more details."; | |
| } | |
| } | |
| @mixin outer-container { | |
| @include clearfix; | |
| max-width: $max-width; | |
| margin: { | |
| left: auto; | |
| right: auto; | |
| } | |
| } | |
| @mixin span-columns($span: $columns of $container-columns, $display: block) { | |
| $columns: nth($span, 1); | |
| $container-columns: container-span($span); | |
| // Set nesting context (used by shift()) | |
| $parent-columns: get-parent-columns($container-columns); | |
| $direction: get-direction($layout-direction, $default-layout-direction); | |
| $opposite-direction: get-opposite-direction($direction); | |
| $display-table: is-display-table($container-display-table, $display); | |
| @if $display-table { | |
| $padding: get-padding-for-table-layout($columns, $container-columns); | |
| display: table-cell; | |
| padding-#{$direction}: $padding; | |
| width: flex-grid($columns, $container-columns) + $padding; | |
| } @else { | |
| display: block; | |
| float: #{$opposite-direction}; | |
| @if $display == collapse { | |
| width: flex-grid($columns, $container-columns) + flex-gutter($container-columns); | |
| &:last-child { | |
| width: flex-grid($columns, $container-columns); | |
| } | |
| } @else { | |
| margin-#{$direction}: flex-gutter($container-columns); | |
| width: flex-grid($columns, $container-columns); | |
| &:last-child { | |
| margin-#{$direction}: 0; | |
| } | |
| } | |
| } | |
| } | |
| // Site-wide base styles. | |
| // Setting root sizes and base styles. | |
| html { | |
| -webkit-text-size-adjust: 100%; | |
| -ms-text-size-adjust: 100%; | |
| @include rootsize; | |
| } | |
| body { | |
| background-color: $color-bg; | |
| color: $color-body; | |
| overflow-x: hidden; | |
| font-family: unquote(map-get($bodytype, font-family)); | |
| font-style: normal; | |
| font-weight: map-get($bodytype, regular); | |
| line-height: 2rem; | |
| @include fontsize(zeta, all); | |
| } | |
| main { | |
| margin: 20px auto; | |
| padding: 0 20px; | |
| @include outer-container; | |
| @include media($xxs) { | |
| padding: 0; | |
| margin-top: 10px; | |
| } | |
| } | |
| .box-model { | |
| @include media($sm) { | |
| @include span-columns(6); | |
| } | |
| @include media($md) { | |
| @include span-columns(7); | |
| } | |
| #content, #generated-size { | |
| @include media($lg) { | |
| @include span-columns(4 of 7); | |
| } | |
| } | |
| #generated-size { | |
| @include media($lg) { | |
| @include span-columns(3 of 7); | |
| @include omega; | |
| } | |
| } | |
| } | |
| .controls { | |
| @include media($sm) { | |
| @include span-columns(6); | |
| } | |
| @include media($md) { | |
| @include span-columns(5); | |
| } | |
| } | |
| /* ************************************************************ */ | |
| // BOX Style mixins | |
| // -------------------------------------- | |
| @mixin box-property-labels($position) { | |
| .box-property-vertical { | |
| left: $position; | |
| } | |
| .box-property-horizontal { | |
| top: $position; | |
| } | |
| } | |
| @mixin stagger-labels($position) { | |
| .box-property-vertical { | |
| left: $position; | |
| } | |
| .box-property-horizontal { | |
| top: $position; | |
| } | |
| } | |
| %hover-opacity { | |
| opacity: 1; | |
| } | |
| @mixin box-styles($color, $border-style, $position-outer:false, $position:0) { | |
| background: $color; | |
| border: 1px $border-style lighten($color-body, 45%); | |
| text-shadow: 0px 1px 1px transparentize(lighten($color, 20%), 0.3); | |
| span::before, | |
| span::after { | |
| color: darken($color, 40%); | |
| } | |
| &:hover { | |
| background-color: $color !important; | |
| @if position-outer { | |
| .box-property-vertical, | |
| .box-property-horizontal { | |
| @extend %hover-opacity; | |
| opacity: 1; | |
| } | |
| } | |
| } | |
| @if $position-outer { | |
| @include stagger-labels($position); | |
| } | |
| } | |
| /***************************************** | |
| * CONTROL STYLES | |
| ******************************************/ | |
| // Fieldset/Legend | |
| // --------------------------------------- | |
| fieldset { | |
| border: 1px solid $color-dark-light; | |
| padding: 0 10px 5px; | |
| } | |
| #generated-size fieldset { | |
| min-height: 114px; | |
| } | |
| legend { | |
| text-transform: uppercase; | |
| font-weight: 300; | |
| font-size: 1.3em; | |
| } | |
| @each $property, $color in $boxes { | |
| ##{$property} { | |
| legend { | |
| color: $color; | |
| } | |
| } | |
| } | |
| label, .value, .toggle-text { | |
| font-size: 60%; | |
| display: inline-block; | |
| white-space: nowrap; | |
| font-family: unquote(map-get($bodytype, font-family)); | |
| letter-spacing: 1.5px; | |
| } | |
| .control-set { | |
| margin-top: 20px; | |
| width: 100%; | |
| label, .toggle-text { | |
| width: 25%; | |
| text-transform: uppercase; | |
| } | |
| .slider { | |
| width: 65%; | |
| @include media($md) { | |
| width: 55%; | |
| } | |
| @include media($lg) { | |
| width: 63%; | |
| } | |
| } | |
| .value { | |
| width: 7%; | |
| text-align: right; | |
| } | |
| } | |
| .box-model #content label { | |
| width: 25%; | |
| @include media($md) { | |
| width: 22%; | |
| } | |
| } | |
| #box-sizing label { | |
| width: 40%; | |
| } | |
| // Radio Button | |
| // --------------------------------------- | |
| .radio { | |
| position: relative; | |
| margin: 0 1rem 0 0; | |
| cursor: pointer; | |
| &::before, | |
| &::after { | |
| @include transition(all 0.3s ease-in-out); | |
| content: ""; | |
| position: absolute; | |
| top: -0.2rem; | |
| left: -0.2rem; | |
| z-index: 1; | |
| width: $knob-size; | |
| height: $knob-size; | |
| background: $color-dark-light !important; | |
| border-radius: 50%; | |
| } | |
| &:checked, | |
| &.ng-valid-parse { | |
| &::before { | |
| @include transform(scale(0, 0)); | |
| border-color: $color-box-sizing !important; | |
| border-width: $knob-border-width !important; | |
| } | |
| &::after { | |
| border: $knob-border-width solid $color-box-sizing !important; | |
| background: $color-bg !important; | |
| } | |
| } | |
| } | |
| // Range Sliders | |
| // --------------------------------------- | |
| slider, [slider] { | |
| display: inline-block; | |
| position: relative; | |
| height: 7px; | |
| width: 63%; | |
| vertical-align: middle; | |
| margin: 5px; | |
| div { | |
| white-space: nowrap; | |
| position: absolute; | |
| &.handle { | |
| border: $knob-border-width solid; | |
| cursor: pointer; | |
| width: $knob-size; | |
| height: $knob-size; | |
| top: -8px; | |
| background-color: $color-bg; | |
| z-index: 2; | |
| border-radius: 100%; | |
| &::after { | |
| content: ''; | |
| width: 8px; | |
| height: 8px; | |
| position: absolute; | |
| left: 6px; | |
| border-radius: 100%; | |
| background-color: transparent; | |
| } | |
| &.active::after { | |
| background-color: transparent; | |
| } | |
| } | |
| &.bar { | |
| width: 100%; | |
| height: 100%; | |
| border-radius: 7px; | |
| background: $color-dark-lighter; | |
| overflow: hidden; | |
| .selection { | |
| width: 0; | |
| height: 100%; | |
| } | |
| } | |
| // TODO: remove Bubble functionality from slider directive | |
| &.bubble { | |
| display: none; | |
| cursor: default; | |
| top: -22px; | |
| padding: 1px 3px; | |
| font-size: 0.7em; | |
| &.active { | |
| display: inline-block; | |
| } | |
| &.limit { | |
| color: $color-dark-lightest; | |
| } | |
| } | |
| } | |
| } | |
| .bubble.value.low.ng-binding.active { | |
| display: none; | |
| } | |
| .bar-color { | |
| height: 20px; | |
| border-right: 3px solid; | |
| box-sizing: content-box; | |
| } | |
| @each $property in $sliders { | |
| ##{$property} { | |
| .slider-selection, .bar-color { | |
| background-color: map-get($boxes, #{$property}); | |
| } | |
| .bar-color, | |
| .handle { | |
| border-color: map-get($boxes, #{$property}); | |
| } | |
| } | |
| } | |
| @media (min-width: 951px) and (max-width: 1244px) { | |
| .controls { | |
| .sliders label { | |
| display: block; | |
| line-height: 1rem; | |
| &:first-of-type { | |
| margin-top: 8px; | |
| } | |
| } | |
| slider, [slider] { | |
| width: 87%; | |
| } | |
| } | |
| } | |
| // Toggle | |
| // --------------------------------------- | |
| .toggle { | |
| display: none; | |
| &, &::after, &::before, & *, & *::after, & *::before, & + .toggle-control { | |
| box-sizing: border-box; | |
| &::selection { | |
| background: none; | |
| } | |
| } | |
| + .toggle-control { | |
| outline: 0; | |
| top: 10px; | |
| margin-bottom: 8px; | |
| width: 52px; | |
| position: relative; | |
| cursor: pointer; | |
| user-select: none; | |
| padding: 3px; | |
| @include transition(all 0.3s ease-in-out); | |
| background: $color-bg; | |
| border: $knob-border-width/2 solid $color-dark-lighter; | |
| border-radius: 2em; | |
| &::after, &::before { | |
| position: relative; | |
| display: block; | |
| content:""; | |
| width: $knob-size; | |
| height: $knob-size; | |
| } | |
| &::after { | |
| left: 0; | |
| @include transition(all 0.3s ease-in-out); | |
| background: $color-dark-light; | |
| border-radius: 50%; | |
| } | |
| &::before { | |
| display: none; | |
| } | |
| } | |
| &:checked { | |
| + .toggle-control { | |
| border: $knob-border-width/2 solid $color-dark-lighter; | |
| &::after { | |
| left: 50%; | |
| height: $knob-size; | |
| width: $knob-size; | |
| background: $color-bg; | |
| border: $knob-border-width solid $color-content; | |
| } | |
| } | |
| } | |
| } | |
| .toggle-text { | |
| vertical-align: text-bottom; | |
| margin-left: 5px; | |
| } | |
| // Generated Size Change Animation (ng-animate) | |
| // --------------------------------------- | |
| .generated-direction { | |
| display: inline-block; | |
| width: 150px; | |
| } | |
| .generated-width, | |
| .generated-height { | |
| font-size: 60%; | |
| white-space: nowrap; | |
| font-family: unquote(map-get($bodytype, font-family)); | |
| letter-spacing: 1.5px; | |
| text-transform: uppercase; | |
| line-height: 3rem; | |
| @include media($sm) { | |
| line-height: 2rem; | |
| } | |
| .changes { | |
| text-transform: none; | |
| display: inline-block; | |
| line-height: 25px; | |
| padding: 0 5px; | |
| background: #2F353E; | |
| border-radius: 3px; | |
| color: $color-content; | |
| @include transition(color 0.4s ease-in-out, background 0.4s ease-in-out); | |
| &[class*="-add"] { | |
| color: darken($color-content, 45%); | |
| background: $color-content; | |
| } | |
| &.highlight { | |
| &.ng-enter { | |
| background: #2F353E; | |
| color: $color-content; | |
| &.ng-enter-active { | |
| color: darken($color-content, 45%); | |
| background: $color-content; | |
| } | |
| } | |
| &.ng-leave { | |
| color: darken($color-content, 45%); | |
| background: $color-content; | |
| &.ng-leave-active { | |
| background: #2F353E; | |
| color: $color-content; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| /***************************************** | |
| * DIAGRAM STYLES | |
| ******************************************/ | |
| #diagram { | |
| margin-left: 5px; | |
| clear: left; | |
| padding-top: $gutter; | |
| } | |
| .box { | |
| position: relative; | |
| &:hover { | |
| .box-property { | |
| background: $color-white; | |
| } | |
| .box-property-vertical, | |
| .box-property-horizontal { | |
| opacity: 0; | |
| } | |
| } | |
| } | |
| .box-property { | |
| font-family: unquote(map-get($monospacetype, font-family)); | |
| @include transition(width 0.3s linear, height 0.3s linear); | |
| position: absolute; | |
| } | |
| .box-padding { | |
| @include box-styles($color-padding, dashed, true, 40%); | |
| } | |
| .box-border { | |
| @include box-styles($color-border, solid, true, 50%); | |
| } | |
| .box-margin { | |
| @include box-styles($color-margin, dashed, true, 60%); | |
| /** To Decode this SVG image, paste the css here: www.svgeneration.com/tools/base-64-decoder */ | |
| background-color: #de6a63; | |
| background-image:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSc3JyBoZWlnaHQ9JzE0JyB2aWV3Qm94PScwIDAgNSAxMCc+Cgk8cmVjdCB3aWR0aD0nMTEwJScgeD0nLTUlJyB5PSctNSUnIGhlaWdodD0nMTEwJScgZmlsbD0nI2RlNmE2MycvPgoJPGxpbmUgeDE9JzcnIHkxPScxJyB4Mj0nLTInIHkyPScxMCcgc3Ryb2tlPScjZWVhYWE1JyBzdHJva2Utd2lkdGg9JzAuMjknLz4KCTxsaW5lIHgxPSc3JyB5MT0nNicgeDI9Jy0yJyB5Mj0nMTUnIHN0cm9rZT0nI2VlYWFhNScgc3Ryb2tlLXdpZHRoPScwLjI5Jy8+Cgk8bGluZSB4MT0nNycgeTE9Jy00JyB4Mj0nLTInIHkyPSc1JyBzdHJva2U9JyNlZWFhYTUnIHN0cm9rZS13aWR0aD0nMC4yOScvPgo8L3N2Zz4='); | |
| } | |
| .box-inner { | |
| @include box-styles($color-content, solid); | |
| text-align: center; | |
| &::before { | |
| color: darken($color-content, 35%); | |
| content: attr(data-width) " x " attr(data-height); | |
| position: absolute; | |
| left: 0; | |
| top: 50%; | |
| margin-top: .5em; | |
| width: 100%; | |
| font-size: .75em; | |
| white-space: nowrap; | |
| } | |
| } | |
| // Box-Property Main Labels | |
| // --------------------------------------- | |
| .property-label { | |
| font-family: unquote(map-get($headingtype, font-family)); | |
| text-transform: uppercase; | |
| font-weight: 400; | |
| letter-spacing: 2px; | |
| font-size: 11px; | |
| top: -6px; | |
| @include media($sm) { | |
| top: -12px; | |
| } | |
| left: 5px; | |
| position: relative; | |
| &#property-label-padding { | |
| color: darken($color-padding, 15%); | |
| } | |
| &#property-label-border { | |
| color: darken($color-border, 28%); | |
| } | |
| &#property-label-margin { | |
| color: darken($color-margin, 20%); | |
| } | |
| &#property-label-content { | |
| color: darken($color-content, 20%); | |
| float: left; | |
| top: -6px; | |
| @include media($sm) { | |
| top: -8px; | |
| } | |
| } | |
| } | |
| #padding-v::before { | |
| top: -8px; | |
| } | |
| %box-property-position { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| z-index: 2000; | |
| &::before, &::after { | |
| position: absolute; | |
| font-size: 0.75em; | |
| text-align: center; | |
| } | |
| } | |
| %property-vertical { | |
| left: -0.5em; | |
| width: 100%; | |
| } | |
| %property-horizontal { | |
| margin-top: -0.65em; | |
| width: 2em; | |
| height: 100%; | |
| } | |
| $properties: zip(vertical horizontal, height width, top left, bottom right, -0.5em -1em); | |
| @each $direction, $dimension, $offset-before, $offset-after, $amount in $properties { | |
| .box-property-#{$direction} { | |
| @extend %box-property-position; | |
| #{$dimension}: 100%; | |
| &::before { | |
| content:attr(data-#{$offset-before}); | |
| @extend %property-#{$direction}; | |
| #{$offset-before}: $amount; | |
| } | |
| &::after { | |
| content: attr(data-#{$offset-after}); | |
| @extend %property-#{$direction}; | |
| #{$offset-after}: $amount; | |
| } | |
| } | |
| } |
| <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400|Source+Code+Pro:300,400" rel="stylesheet" /> | |
| <link href="https://codepen.io/carolineartz/pen/MYxjEv" rel="stylesheet" /> |